@@ -3,10 +3,12 @@  | 
            ||
| 3 | 3 | 
                from __future__ import division  | 
            
| 4 | 4 | 
                 | 
            
| 5 | 5 | 
                from django_response import response  | 
            
| 6 | 
                +from logit import logit  | 
            |
| 6 | 7 | 
                 | 
            
| 7 | 
                -from mch.models import BrandInfo, DistributorInfo, ModelInfo  | 
            |
| 8 | 
                +from mch.models import BrandInfo, DistributorInfo, LatestAppInfo, ModelInfo  | 
            |
| 8 | 9 | 
                 | 
            
| 9 | 10 | 
                 | 
            
| 11 | 
                +@logit  | 
            |
| 10 | 12 | 
                def brands_list(request):  | 
            
| 11 | 13 | 
                     brands = BrandInfo.objects.filter(status=True).order_by('position')
               | 
            
| 12 | 14 | 
                brands = [brand.data for brand in brands]  | 
            
                @@ -16,6 +18,7 @@ def brands_list(request):  | 
            ||
| 16 | 18 | 
                })  | 
            
| 17 | 19 | 
                 | 
            
| 18 | 20 | 
                 | 
            
| 21 | 
                +@logit  | 
            |
| 19 | 22 | 
                def models_list(request):  | 
            
| 20 | 23 | 
                     models = ModelInfo.objects.filter(status=True).order_by('position')
               | 
            
| 21 | 24 | 
                models = [model.data for model in models]  | 
            
                @@ -25,6 +28,7 @@ def models_list(request):  | 
            ||
| 25 | 28 | 
                })  | 
            
| 26 | 29 | 
                 | 
            
| 27 | 30 | 
                 | 
            
| 31 | 
                +@logit  | 
            |
| 28 | 32 | 
                def distributors_list(request):  | 
            
| 29 | 33 | 
                     distributors = DistributorInfo.objects.filter(status=True).order_by('position')
               | 
            
| 30 | 34 | 
                distributors = [distributor.data for distributor in distributors]  | 
            
                @@ -32,3 +36,20 @@ def distributors_list(request):  | 
            ||
| 32 | 36 | 
                     return response(200, data={
               | 
            
| 33 | 37 | 
                'distributors': distributors,  | 
            
| 34 | 38 | 
                })  | 
            
| 39 | 
                +  | 
            |
| 40 | 
                +  | 
            |
| 41 | 
                +@logit  | 
            |
| 42 | 
                +def upgrade_api(request):  | 
            |
| 43 | 
                + """ APP 升级 """  | 
            |
| 44 | 
                + try:  | 
            |
| 45 | 
                + appinfo = LatestAppInfo.objects.filter(status=True)[0].adr  | 
            |
| 46 | 
                + except IndexError:  | 
            |
| 47 | 
                +        appinfo = {
               | 
            |
| 48 | 
                + 'latest_version_code': '',  | 
            |
| 49 | 
                + 'latest_version_name': '',  | 
            |
| 50 | 
                + 'latest_url': '',  | 
            |
| 51 | 
                + }  | 
            |
| 52 | 
                +  | 
            |
| 53 | 
                +    return response(200, 'Get Latest App Success', u'获取最新版信息成功', {
               | 
            |
| 54 | 
                + 'appinfo': appinfo,  | 
            |
| 55 | 
                + })  | 
            
                @@ -194,3 +194,7 @@ urlpatterns += [  | 
            ||
| 194 | 194 | 
                url(r'^api/encrypt$', encrypt_views.encrypt, name='encrypt'),  | 
            
| 195 | 195 | 
                url(r'^api/decrypt$', encrypt_views.decrypt, name='decrypt'),  | 
            
| 196 | 196 | 
                ]  | 
            
| 197 | 
                +  | 
            |
| 198 | 
                +urlpatterns += [  | 
            |
| 199 | 
                + url(r'^api/upgrade$', mch_views.upgrade_api, name='upgrade_api2'), # APP 升级  | 
            |
| 200 | 
                +]  | 
            
                @@ -1,8 +1,9 @@  | 
            ||
| 1 | 1 | 
                # -*- coding: utf-8 -*-  | 
            
| 2 | 2 | 
                 | 
            
| 3 | 3 | 
                from django.contrib import admin  | 
            
| 4 | 
                +from pysnippets.strsnippets import strip  | 
            |
| 4 | 5 | 
                 | 
            
| 5 | 
                -from mch.models import BrandInfo, DistributorInfo, ModelImageInfo, ModelInfo  | 
            |
| 6 | 
                +from mch.models import BrandInfo, DistributorInfo, LatestAppInfo, ModelImageInfo, ModelInfo  | 
            |
| 6 | 7 | 
                 | 
            
| 7 | 8 | 
                 | 
            
| 8 | 9 | 
                class BrandInfoAdmin(admin.ModelAdmin):  | 
            
                @@ -24,7 +25,19 @@ class DistributorInfoAdmin(admin.ModelAdmin):  | 
            ||
| 24 | 25 | 
                     list_filter = ('brand_id', 'status')
               | 
            
| 25 | 26 | 
                 | 
            
| 26 | 27 | 
                 | 
            
| 28 | 
                +class LatestAppInfoAdmin(admin.ModelAdmin):  | 
            |
| 29 | 
                +    list_display = ('latest_adr_version_code', 'latest_adr_version_name', 'latest_adr_app', 'latest_adr_url', 'status', 'created_at', 'updated_at')
               | 
            |
| 30 | 
                +    list_filter = ('status', )
               | 
            |
| 31 | 
                +  | 
            |
| 32 | 
                + def save_model(self, request, obj, form, change):  | 
            |
| 33 | 
                + obj.latest_adr_version_name = strip(obj.latest_adr_version_name)  | 
            |
| 34 | 
                + obj.latest_adr_app = strip(obj.latest_adr_app)  | 
            |
| 35 | 
                + obj.latest_adr_url = strip(obj.latest_adr_url)  | 
            |
| 36 | 
                + obj.save()  | 
            |
| 37 | 
                +  | 
            |
| 38 | 
                +  | 
            |
| 27 | 39 | 
                admin.site.register(BrandInfo, BrandInfoAdmin)  | 
            
| 28 | 40 | 
                admin.site.register(ModelInfo, ModelInfoAdmin)  | 
            
| 29 | 41 | 
                admin.site.register(ModelImageInfo, ModelImageInfoAdmin)  | 
            
| 30 | 42 | 
                admin.site.register(DistributorInfo, DistributorInfoAdmin)  | 
            
| 43 | 
                +admin.site.register(LatestAppInfo, LatestAppInfoAdmin)  | 
            
                @@ -0,0 +1,36 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.9 on 2018-01-14 15:14  | 
            |
| 3 | 
                +from __future__ import unicode_literals  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +import models_ext.fileext  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                +class Migration(migrations.Migration):  | 
            |
| 10 | 
                +  | 
            |
| 11 | 
                + dependencies = [  | 
            |
| 12 | 
                +        ('mch', '0003_auto_20180104_0428'),
               | 
            |
| 13 | 
                + ]  | 
            |
| 14 | 
                +  | 
            |
| 15 | 
                + operations = [  | 
            |
| 16 | 
                + migrations.CreateModel(  | 
            |
| 17 | 
                + name='LatestAppInfo',  | 
            |
| 18 | 
                + fields=[  | 
            |
| 19 | 
                +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
               | 
            |
| 20 | 
                +                ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')),
               | 
            |
| 21 | 
                +                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
               | 
            |
| 22 | 
                +                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
               | 
            |
| 23 | 
                +                ('latest_adr_version_code', models.IntegerField(default=0, help_text='\u6700\u65b0\u5b89\u5353\u7248\u672c\u53f7', verbose_name='latest_adr_version_code')),
               | 
            |
| 24 | 
                +                ('latest_adr_version_name', models.CharField(blank=True, help_text='\u6700\u65b0\u5b89\u5353\u7248\u672c\u540d', max_length=16, null=True, verbose_name='latest_adr_version_name')),
               | 
            |
| 25 | 
                +                ('latest_adr_app', models.FileField(blank=True, help_text='\u6700\u65b0\u7248\u5b89\u5353 APP', null=True, upload_to=models_ext.fileext.upload_path, verbose_name='latest_adr_app')),
               | 
            |
| 26 | 
                +                ('latest_adr_url', models.URLField(blank=True, help_text='\u6700\u65b0\u7248 APP \u94fe\u63a5', max_length=255, null=True, verbose_name='latest_adr_url')),
               | 
            |
| 27 | 
                +                ('latest_ios_version_code', models.IntegerField(default=0, help_text='\u6700\u65b0 iOS \u7248\u672c\u53f7', verbose_name='latest_ios_version_code')),
               | 
            |
| 28 | 
                +                ('latest_ios_version_name', models.CharField(blank=True, help_text='\u6700\u65b0 iOS \u7248\u672c\u540d', max_length=16, null=True, verbose_name='latest_ios_version_name')),
               | 
            |
| 29 | 
                +                ('latest_ios_url', models.URLField(blank=True, help_text='\u6700\u65b0\u7248 iOS \u94fe\u63a5', max_length=255, null=True, verbose_name='latest_ios_url')),
               | 
            |
| 30 | 
                + ],  | 
            |
| 31 | 
                +            options={
               | 
            |
| 32 | 
                + 'verbose_name': '\u5347\u7ea7\u914d\u7f6e\u4fe1\u606f',  | 
            |
| 33 | 
                + 'verbose_name_plural': '\u5347\u7ea7\u914d\u7f6e\u4fe1\u606f',  | 
            |
| 34 | 
                + },  | 
            |
| 35 | 
                + ),  | 
            |
| 36 | 
                + ]  | 
            
                @@ -115,3 +115,44 @@ class DistributorInfo(BaseModelMixin):  | 
            ||
| 115 | 115 | 
                'distributor_name': self.distributor_name,  | 
            
| 116 | 116 | 
                'distributor_descr': self.distributor_descr,  | 
            
| 117 | 117 | 
                }  | 
            
| 118 | 
                +  | 
            |
| 119 | 
                +  | 
            |
| 120 | 
                +class LatestAppInfo(BaseModelMixin):  | 
            |
| 121 | 
                + latest_adr_version_code = models.IntegerField(_(u'latest_adr_version_code'), default=0, help_text=u'最新安卓版本号')  | 
            |
| 122 | 
                + latest_adr_version_name = models.CharField(_(u'latest_adr_version_name'), max_length=16, blank=True, null=True, help_text=u'最新安卓版本名')  | 
            |
| 123 | 
                + latest_adr_app = models.FileField(_(u'latest_adr_app'), upload_to=upload_path, blank=True, null=True, help_text=u'最新版安卓 APP')  | 
            |
| 124 | 
                + latest_adr_url = models.URLField(_(u'latest_adr_url'), max_length=255, blank=True, null=True, help_text=u'最新版 APP 链接')  | 
            |
| 125 | 
                +  | 
            |
| 126 | 
                + latest_ios_version_code = models.IntegerField(_(u'latest_ios_version_code'), default=0, help_text=u'最新 iOS 版本号')  | 
            |
| 127 | 
                + latest_ios_version_name = models.CharField(_(u'latest_ios_version_name'), max_length=16, blank=True, null=True, help_text=u'最新 iOS 版本名')  | 
            |
| 128 | 
                + latest_ios_url = models.URLField(_(u'latest_ios_url'), max_length=255, blank=True, null=True, help_text=u'最新版 iOS 链接')  | 
            |
| 129 | 
                +  | 
            |
| 130 | 
                + class Meta:  | 
            |
| 131 | 
                + verbose_name = _(u'升级配置信息')  | 
            |
| 132 | 
                + verbose_name_plural = _(u'升级配置信息')  | 
            |
| 133 | 
                +  | 
            |
| 134 | 
                + def __unicode__(self):  | 
            |
| 135 | 
                +        return u'{0.pk}'.format(self)
               | 
            |
| 136 | 
                +  | 
            |
| 137 | 
                + @property  | 
            |
| 138 | 
                + def final_latest_adr_url(self):  | 
            |
| 139 | 
                + return self.latest_adr_url or upload_file_url(self.latest_adr_app)  | 
            |
| 140 | 
                +  | 
            |
| 141 | 
                + @property  | 
            |
| 142 | 
                + def data(self):  | 
            |
| 143 | 
                +        return {
               | 
            |
| 144 | 
                + 'latest_adr_version_code': self.latest_adr_version_code,  | 
            |
| 145 | 
                + 'latest_adr_version_name': self.latest_adr_version_name,  | 
            |
| 146 | 
                + 'latest_adr_url': self.final_latest_adr_url,  | 
            |
| 147 | 
                + 'latest_ios_version_code': self.latest_ios_version_code,  | 
            |
| 148 | 
                + 'latest_ios_version_name': self.latest_ios_version_name,  | 
            |
| 149 | 
                + 'latest_ios_url': self.latest_ios_url,  | 
            |
| 150 | 
                + }  | 
            |
| 151 | 
                +  | 
            |
| 152 | 
                + @property  | 
            |
| 153 | 
                + def adr(self):  | 
            |
| 154 | 
                +        return {
               | 
            |
| 155 | 
                + 'latest_adr_version_code': self.latest_adr_version_code,  | 
            |
| 156 | 
                + 'latest_adr_version_name': self.latest_adr_version_name,  | 
            |
| 157 | 
                + 'latest_adr_url': self.final_latest_adr_url,  | 
            |
| 158 | 
                + }  | 
            
                @@ -0,0 +1,25 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.9 on 2018-01-14 15:14  | 
            |
| 3 | 
                +from __future__ import unicode_literals  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +class Migration(migrations.Migration):  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                + dependencies = [  | 
            |
| 11 | 
                +        ('operation', '0017_auto_20180103_0446'),
               | 
            |
| 12 | 
                + ]  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + operations = [  | 
            |
| 15 | 
                + migrations.AlterField(  | 
            |
| 16 | 
                + model_name='latestappinfo',  | 
            |
| 17 | 
                + name='latest_adr_version_name',  | 
            |
| 18 | 
                + field=models.CharField(blank=True, help_text='\u6700\u65b0\u5b89\u5353\u7248\u672c\u540d', max_length=16, null=True, verbose_name='latest_adr_version_name'),  | 
            |
| 19 | 
                + ),  | 
            |
| 20 | 
                + migrations.AlterField(  | 
            |
| 21 | 
                + model_name='latestappinfo',  | 
            |
| 22 | 
                + name='latest_ios_version_name',  | 
            |
| 23 | 
                + field=models.CharField(blank=True, help_text='\u6700\u65b0 iOS \u7248\u672c\u540d', max_length=16, null=True, verbose_name='latest_ios_version_name'),  | 
            |
| 24 | 
                + ),  | 
            |
| 25 | 
                + ]  | 
            
                @@ -9,12 +9,12 @@ from pai2.basemodels import PaiaiSrcMixin, PlatformMixin, VersionMixin  | 
            ||
| 9 | 9 | 
                 | 
            
| 10 | 10 | 
                class LatestAppInfo(BaseModelMixin, PaiaiSrcMixin):  | 
            
| 11 | 11 | 
                latest_adr_version_code = models.IntegerField(_(u'latest_adr_version_code'), default=0, help_text=u'最新安卓版本号')  | 
            
| 12 | 
                - latest_adr_version_name = models.CharField(_(u'latest_adr_version_name'), max_length=255, blank=True, null=True, help_text=u'最新安卓版本名')  | 
            |
| 12 | 
                + latest_adr_version_name = models.CharField(_(u'latest_adr_version_name'), max_length=16, blank=True, null=True, help_text=u'最新安卓版本名')  | 
            |
| 13 | 13 | 
                latest_adr_app = models.FileField(_(u'latest_adr_app'), upload_to=upload_path, blank=True, null=True, help_text=u'最新版安卓 APP')  | 
            
| 14 | 14 | 
                latest_adr_url = models.URLField(_(u'latest_adr_url'), max_length=255, blank=True, null=True, help_text=u'最新版 APP 链接')  | 
            
| 15 | 15 | 
                 | 
            
| 16 | 16 | 
                latest_ios_version_code = models.IntegerField(_(u'latest_ios_version_code'), default=0, help_text=u'最新 iOS 版本号')  | 
            
| 17 | 
                - latest_ios_version_name = models.CharField(_(u'latest_ios_version_name'), max_length=255, blank=True, null=True, help_text=u'最新 iOS 版本名')  | 
            |
| 17 | 
                + latest_ios_version_name = models.CharField(_(u'latest_ios_version_name'), max_length=16, blank=True, null=True, help_text=u'最新 iOS 版本名')  | 
            |
| 18 | 18 | 
                latest_ios_url = models.URLField(_(u'latest_ios_url'), max_length=255, blank=True, null=True, help_text=u'最新版 iOS 链接')  | 
            
| 19 | 19 | 
                 | 
            
| 20 | 20 | 
                class Meta:  |