@@ -145,6 +145,7 @@ urlpatterns += [  | 
            ||
| 145 | 145 | 
                url(r'^op/splash$', op_views.splash_api, name='splash_api'), # 启动页面  | 
            
| 146 | 146 | 
                url(r'^op/feedback$', op_views.feedback_api, name='feedback_api'), # 用户反馈  | 
            
| 147 | 147 | 
                url(r'^op/download$', op_views.download_api, name='download_api'), # 下载接口  | 
            
| 148 | 
                + url(r'^op/bpversion$', op_views.box_program_version_api, name='box_program_version_api'), # BOX 程序版本信息  | 
            |
| 148 | 149 | 
                ]  | 
            
| 149 | 150 | 
                 | 
            
| 150 | 151 | 
                # 地理位置相关  | 
            
                @@ -5,11 +5,12 @@ from django.contrib import admin  | 
            ||
| 5 | 5 | 
                from django.template.loader import render_to_string  | 
            
| 6 | 6 | 
                from pysnippets.strsnippets import strip  | 
            
| 7 | 7 | 
                 | 
            
| 8 | 
                -from operation.models import (APPSettingsInfo, FeedbackInfo, GuestEntranceControlInfo, LatestAppInfo, PatchInfo,  | 
            |
| 9 | 
                - SplashInfo)  | 
            |
| 8 | 
                +from operation.models import (APPSettingsInfo, BoxProgramVersionInfo, FeedbackInfo, GuestEntranceControlInfo,  | 
            |
| 9 | 
                + LatestAppInfo, PatchInfo, SplashInfo)  | 
            |
| 10 | 10 | 
                from utils.disk_utils import write_to_disk  | 
            
| 11 | 11 | 
                from utils.redis.rapp import set_latest_app  | 
            
| 12 | 12 | 
                from utils.redis.rguest import delete_guest_entrance_control, set_guest_entrance_control  | 
            
| 13 | 
                +from utils.redis.roperation.rbox_program_version import set_box_program_version  | 
            |
| 13 | 14 | 
                from utils.redis.rpatch import del_app_patch_info, set_app_patch_info  | 
            
| 14 | 15 | 
                from utils.redis.rsettings import del_app_settings_info, set_app_settings_info  | 
            
| 15 | 16 | 
                 | 
            
                @@ -17,12 +18,12 @@ from utils.redis.rsettings import del_app_settings_info, set_app_settings_info  | 
            ||
| 17 | 18 | 
                class LatestAppInfoAdmin(admin.ModelAdmin):  | 
            
| 18 | 19 | 
                     list_display = ('latest_adr_version_code', 'latest_adr_version_name', 'latest_adr_app', 'latest_adr_url', 'latest_ios_version_code', 'latest_ios_version_name', 'latest_ios_url', 'src', 'status', 'created_at', 'updated_at')
               | 
            
| 19 | 20 | 
                     list_filter = ('src', 'status')
               | 
            
| 21 | 
                + actions = None  | 
            |
| 20 | 22 | 
                 | 
            
| 21 | 23 | 
                def save_model(self, request, obj, form, change):  | 
            
| 22 | 
                - obj.latest_adr_version_code = strip(obj.latest_adr_version_code)  | 
            |
| 23 | 24 | 
                obj.latest_adr_version_name = strip(obj.latest_adr_version_name)  | 
            
| 24 | 25 | 
                obj.latest_adr_app = strip(obj.latest_adr_app)  | 
            
| 25 | 
                - obj.latest_ios_version_code = strip(obj.latest_ios_version_code)  | 
            |
| 26 | 
                + obj.latest_adr_url = strip(obj.latest_adr_url)  | 
            |
| 26 | 27 | 
                obj.latest_ios_version_name = strip(obj.latest_ios_version_name)  | 
            
| 27 | 28 | 
                obj.latest_ios_url = strip(obj.latest_ios_url)  | 
            
| 28 | 29 | 
                obj.save()  | 
            
                @@ -69,6 +70,12 @@ class LatestAppInfoAdmin(admin.ModelAdmin):  | 
            ||
| 69 | 70 | 
                # 设置最新 APP 信息  | 
            
| 70 | 71 | 
                set_latest_app(obj.src)  | 
            
| 71 | 72 | 
                 | 
            
| 73 | 
                + def delete_model(self, request, obj):  | 
            |
| 74 | 
                + obj.delete()  | 
            |
| 75 | 
                +  | 
            |
| 76 | 
                + # 设置最新 APP 信息  | 
            |
| 77 | 
                + set_latest_app(obj.src)  | 
            |
| 78 | 
                +  | 
            |
| 72 | 79 | 
                 | 
            
| 73 | 80 | 
                class PatchInfoAdmin(admin.ModelAdmin):  | 
            
| 74 | 81 | 
                     list_display = ('platform', 'version', 'patch', 'src', 'status', 'created_at', 'updated_at')
               | 
            
                @@ -141,9 +148,30 @@ class GuestEntranceControlInfoAdmin(admin.ModelAdmin):  | 
            ||
| 141 | 148 | 
                delete_guest_entrance_control()  | 
            
| 142 | 149 | 
                 | 
            
| 143 | 150 | 
                 | 
            
| 151 | 
                +class BoxProgramVersionInfoAdmin(admin.ModelAdmin):  | 
            |
| 152 | 
                +    list_display = ('srv_version_code', 'srv_version_name', 'proc_version_code', 'proc_version_name', 'status', 'created_at', 'updated_at')
               | 
            |
| 153 | 
                +    list_filter = ('status', )
               | 
            |
| 154 | 
                + actions = None  | 
            |
| 155 | 
                +  | 
            |
| 156 | 
                + def save_model(self, request, obj, form, change):  | 
            |
| 157 | 
                + obj.srv_version_name = strip(obj.srv_version_name)  | 
            |
| 158 | 
                + obj.proc_version_name = strip(obj.proc_version_name)  | 
            |
| 159 | 
                + obj.save()  | 
            |
| 160 | 
                +  | 
            |
| 161 | 
                + # 设置 BOX 程序版本信息  | 
            |
| 162 | 
                + set_box_program_version()  | 
            |
| 163 | 
                +  | 
            |
| 164 | 
                + def delete_model(self, request, obj):  | 
            |
| 165 | 
                + obj.delete()  | 
            |
| 166 | 
                +  | 
            |
| 167 | 
                + # 设置 BOX 程序版本信息  | 
            |
| 168 | 
                + set_box_program_version()  | 
            |
| 169 | 
                +  | 
            |
| 170 | 
                +  | 
            |
| 144 | 171 | 
                admin.site.register(LatestAppInfo, LatestAppInfoAdmin)  | 
            
| 145 | 172 | 
                admin.site.register(PatchInfo, PatchInfoAdmin)  | 
            
| 146 | 173 | 
                admin.site.register(APPSettingsInfo, APPSettingsInfoAdmin)  | 
            
| 147 | 174 | 
                admin.site.register(SplashInfo, SplashInfoAdmin)  | 
            
| 148 | 175 | 
                admin.site.register(FeedbackInfo, FeedbackInfoAdmin)  | 
            
| 149 | 176 | 
                admin.site.register(GuestEntranceControlInfo, GuestEntranceControlInfoAdmin)  | 
            
| 177 | 
                +admin.site.register(BoxProgramVersionInfo, BoxProgramVersionInfoAdmin)  | 
            
                @@ -0,0 +1,31 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +from __future__ import unicode_literals  | 
            |
| 3 | 
                +  | 
            |
| 4 | 
                +from django.db import models, migrations  | 
            |
| 5 | 
                +  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +class Migration(migrations.Migration):  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                + dependencies = [  | 
            |
| 10 | 
                +        ('operation', '0011_auto_20170315_2243'),
               | 
            |
| 11 | 
                + ]  | 
            |
| 12 | 
                +  | 
            |
| 13 | 
                + operations = [  | 
            |
| 14 | 
                + migrations.CreateModel(  | 
            |
| 15 | 
                + name='BoxProgramVersionInfo',  | 
            |
| 16 | 
                + fields=[  | 
            |
| 17 | 
                +                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
               | 
            |
| 18 | 
                +                ('status', models.BooleanField(default=True, help_text='\u72b6\u6001', db_index=True, verbose_name='status')),
               | 
            |
| 19 | 
                +                ('created_at', models.DateTimeField(help_text='\u521b\u5efa\u65f6\u95f4', verbose_name='created_at', auto_now_add=True)),
               | 
            |
| 20 | 
                +                ('updated_at', models.DateTimeField(help_text='\u66f4\u65b0\u65f6\u95f4', verbose_name='updated_at', auto_now=True)),
               | 
            |
| 21 | 
                +                ('srv_version_code', models.IntegerField(default=0, help_text='Box Server \u7248\u672c\u53f7', verbose_name='srv_version_code')),
               | 
            |
| 22 | 
                +                ('srv_version_name', models.CharField(help_text='Box Server \u7248\u672c\u540d', max_length=255, null=True, verbose_name='srv_version_name', blank=True)),
               | 
            |
| 23 | 
                +                ('proc_version_code', models.IntegerField(default=0, help_text='Box Proc \u7248\u672c\u53f7', verbose_name='proc_version_code')),
               | 
            |
| 24 | 
                +                ('proc_version_name', models.CharField(help_text='Box Proc \u7248\u672c\u540d', max_length=255, null=True, verbose_name='proc_version_name', blank=True)),
               | 
            |
| 25 | 
                + ],  | 
            |
| 26 | 
                +            options={
               | 
            |
| 27 | 
                + 'verbose_name': 'boxprogramversioninfo',  | 
            |
| 28 | 
                + 'verbose_name_plural': 'boxprogramversioninfo',  | 
            |
| 29 | 
                + },  | 
            |
| 30 | 
                + ),  | 
            |
| 31 | 
                + ]  | 
            
                @@ -148,3 +148,27 @@ class GuestEntranceControlInfo(CreateUpdateMixin, PlatformMixin, VersionMixin, P  | 
            ||
| 148 | 148 | 
                'max_adr': self.max_adr,  | 
            
| 149 | 149 | 
                'max_ios': self.max_ios,  | 
            
| 150 | 150 | 
                }  | 
            
| 151 | 
                +  | 
            |
| 152 | 
                +  | 
            |
| 153 | 
                +class BoxProgramVersionInfo(CreateUpdateMixin):  | 
            |
| 154 | 
                + srv_version_code = models.IntegerField(_(u'srv_version_code'), default=0, help_text=u'Box Server 版本号')  | 
            |
| 155 | 
                + srv_version_name = models.CharField(_(u'srv_version_name'), max_length=255, blank=True, null=True, help_text=u'Box Server 版本名')  | 
            |
| 156 | 
                +  | 
            |
| 157 | 
                + proc_version_code = models.IntegerField(_(u'proc_version_code'), default=0, help_text=u'Box Proc 版本号')  | 
            |
| 158 | 
                + proc_version_name = models.CharField(_(u'proc_version_name'), max_length=255, blank=True, null=True, help_text=u'Box Proc 版本名')  | 
            |
| 159 | 
                +  | 
            |
| 160 | 
                + class Meta:  | 
            |
| 161 | 
                +        verbose_name = _('boxprogramversioninfo')
               | 
            |
| 162 | 
                +        verbose_name_plural = _('boxprogramversioninfo')
               | 
            |
| 163 | 
                +  | 
            |
| 164 | 
                + def __unicode__(self):  | 
            |
| 165 | 
                +        return u'{0.pk}'.format(self)
               | 
            |
| 166 | 
                +  | 
            |
| 167 | 
                + @property  | 
            |
| 168 | 
                + def data(self):  | 
            |
| 169 | 
                +        return {
               | 
            |
| 170 | 
                + 'srv_version_code': self.srv_version_code,  | 
            |
| 171 | 
                + 'srv_version_name': self.srv_version_name,  | 
            |
| 172 | 
                + 'proc_version_code': self.proc_version_code,  | 
            |
| 173 | 
                + 'proc_version_name': self.proc_version_name,  | 
            |
| 174 | 
                + }  | 
            
                @@ -1,5 +1,7 @@  | 
            ||
| 1 | 1 | 
                # -*- coding: utf-8 -*-  | 
            
| 2 | 2 | 
                 | 
            
| 3 | 
                +import json  | 
            |
| 4 | 
                +  | 
            |
| 3 | 5 | 
                from django.conf import settings  | 
            
| 4 | 6 | 
                from django.shortcuts import redirect  | 
            
| 5 | 7 | 
                from logit import logit  | 
            
                @@ -10,6 +12,7 @@ from utils.error.errno_utils import UserStatusCode  | 
            ||
| 10 | 12 | 
                from utils.error.response_utils import response  | 
            
| 11 | 13 | 
                from utils.redis.rapp import get_latest_app  | 
            
| 12 | 14 | 
                from utils.redis.rguest import get_guest_entrance_control  | 
            
| 15 | 
                +from utils.redis.roperation.rbox_program_version import get_box_program_version  | 
            |
| 13 | 16 | 
                from utils.redis.rpatch import get_app_patch_info  | 
            
| 14 | 17 | 
                from utils.redis.rsettings import get_app_settings_info  | 
            
| 15 | 18 | 
                from utils.version_utils import is_version_match  | 
            
                @@ -150,3 +153,13 @@ def download_api(request):  | 
            ||
| 150 | 153 | 
                return redirect(ios_url)  | 
            
| 151 | 154 | 
                 | 
            
| 152 | 155 | 
                     return redirect(get_latest_app(src).get('latest_adr_url', ''))
               | 
            
| 156 | 
                +  | 
            |
| 157 | 
                +  | 
            |
| 158 | 
                +def box_program_version_api(request):  | 
            |
| 159 | 
                + """ BOX 程序版本信息 """  | 
            |
| 160 | 
                + bpversion = get_box_program_version()  | 
            |
| 161 | 
                +  | 
            |
| 162 | 
                +    return response(200, 'Get Box Program Version Success', u'获取盒子程序版本成功', {
               | 
            |
| 163 | 
                + 'bpversion': bpversion,  | 
            |
| 164 | 
                + 'bpversion_str': json.dumps(bpversion),  | 
            |
| 165 | 
                + })  | 
            
                @@ -63,3 +63,6 @@ GUEST_ENTRANCE_CONTROL_INFO = 'guest:entrance:control:info:%s' # STRING,游  | 
            ||
| 63 | 63 | 
                LATEST_APP_INFO = 'latest:app:info:%s' # STRING,最新 APP 信息,src  | 
            
| 64 | 64 | 
                APP_SETTINGS_INFO = 'app:settings:info:%s:%s:%s' # STRING,APP 设置信息,platform、channel、version  | 
            
| 65 | 65 | 
                APP_PATCH_INFO = 'app:patch:info:%s:%s:%s' # STRING,APP 补丁信息,platform、version、src  | 
            
| 66 | 
                +  | 
            |
| 67 | 
                +# BOX 相关  | 
            |
| 68 | 
                +BOX_PROGRAM_VERSION_INFO = 'box:program:version:info' # STRING,BOX 程序版本信息  | 
            
                @@ -0,0 +1,20 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +from utils.redis.connect import r  | 
            |
| 4 | 
                +from utils.redis.rkeys import BOX_PROGRAM_VERSION_INFO  | 
            |
| 5 | 
                +  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +def set_box_program_version():  | 
            |
| 8 | 
                + """ 设置 BOX 程序版本信息 """  | 
            |
| 9 | 
                + from operation.models import BoxProgramVersionInfo  | 
            |
| 10 | 
                + try:  | 
            |
| 11 | 
                + bpverion = BoxProgramVersionInfo.objects.filter(status=True)[0].data  | 
            |
| 12 | 
                + except IndexError:  | 
            |
| 13 | 
                +        bpverion = {}
               | 
            |
| 14 | 
                + r.setjson(BOX_PROGRAM_VERSION_INFO, bpverion)  | 
            |
| 15 | 
                + return bpverion  | 
            |
| 16 | 
                +  | 
            |
| 17 | 
                +  | 
            |
| 18 | 
                +def get_box_program_version():  | 
            |
| 19 | 
                + """ 获取 BOX 程序版本信息 """  | 
            |
| 20 | 
                + return r.getjson(BOX_PROGRAM_VERSION_INFO) or set_box_program_version()  |