@@ -7,7 +7,7 @@ import random  | 
            ||
| 7 | 7 | 
                from django_logit import logit  | 
            
| 8 | 8 | 
                from django_response import response  | 
            
| 9 | 9 | 
                 | 
            
| 10 | 
                -from mch.models import BrandInfo, ModelImageInfo, ModelInfo  | 
            |
| 10 | 
                +from mch.models import BrandInfo, ModelInfo  | 
            |
| 11 | 11 | 
                from utils.algorithm.b64 import b64_decrypt, b64_encrypt  | 
            
| 12 | 12 | 
                from utils.algorithm.caesar import caesar_decrypt, caesar_encrypt  | 
            
| 13 | 13 | 
                from utils.algorithm.rsalg import rsa_decrypt, rsa_encrypt  | 
            
                @@ -26,6 +26,11 @@ WECHAT = settings.WECHAT  | 
            ||
| 26 | 26 | 
                 | 
            
| 27 | 27 | 
                @logit  | 
            
| 28 | 28 | 
                def optor_login_api(request):  | 
            
| 29 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 30 | 
                +  | 
            |
| 31 | 
                + if brand_id != settings.KODO_DEFAULT_BRAND_ID:  | 
            |
| 32 | 
                + return response(ProductBrandStatusCode.BRAND_NOT_MATCH)  | 
            |
| 33 | 
                +  | 
            |
| 29 | 34 | 
                     phone = request.POST.get('phone', '')
               | 
            
| 30 | 35 | 
                     password = request.POST.get('password', '')
               | 
            
| 31 | 36 | 
                 | 
            
                @@ -47,6 +52,11 @@ def optor_login_api(request):  | 
            ||
| 47 | 52 | 
                 | 
            
| 48 | 53 | 
                @logit  | 
            
| 49 | 54 | 
                def admin_login_api(request):  | 
            
| 55 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 56 | 
                +  | 
            |
| 57 | 
                + if brand_id != settings.KODO_DEFAULT_BRAND_ID:  | 
            |
| 58 | 
                + return response(ProductBrandStatusCode.BRAND_NOT_MATCH)  | 
            |
| 59 | 
                +  | 
            |
| 50 | 60 | 
                     phone = request.POST.get('phone', '')
               | 
            
| 51 | 61 | 
                     password = request.POST.get('password', '')
               | 
            
| 52 | 62 | 
                 | 
            
                @@ -198,6 +198,8 @@ urlpatterns += [  | 
            ||
| 198 | 198 | 
                url(r'^models$', mch_views.models_list, name='models_list'),  | 
            
| 199 | 199 | 
                url(r'^distributors$', mch_views.distributors_list, name='distributors_list'),  | 
            
| 200 | 200 | 
                url(r'^infos$', mch_views.bmd_infos, name='bmd_infos'),  | 
            
| 201 | 
                +  | 
            |
| 202 | 
                + url(r'^log/upload$', file_views.file_upload, name='log_upload'),  | 
            |
| 201 | 203 | 
                ]  | 
            
| 202 | 204 | 
                 | 
            
| 203 | 205 | 
                urlpatterns += [  | 
            
                @@ -42,3 +42,19 @@ def DJANGO_WE_MESSAGE_CALLBACK_FUNC(request, data):  | 
            ||
| 42 | 42 | 
                UserInfo.objects.filter(unionid=unionid).update(has_membercard=True, membercardid=membercardid)  | 
            
| 43 | 43 | 
                elif event == 'user_del_card':  | 
            
| 44 | 44 | 
                UserInfo.objects.filter(membercardid=membercardid).update(has_membercard=False)  | 
            
| 45 | 
                +  | 
            |
| 46 | 
                +  | 
            |
| 47 | 
                +def DJANGO_FILE_UPLOAD_CALLBACK_FUNC(request, file_path=None, file_url=None):  | 
            |
| 48 | 
                + """ DJANGO FILE UPLOAD Callback Func """  | 
            |
| 49 | 
                + from logs.models import MchLogInfo  | 
            |
| 50 | 
                +    file_type = request.POST.get('file_type', '')
               | 
            |
| 51 | 
                +  | 
            |
| 52 | 
                + if file_type == 'logfile':  | 
            |
| 53 | 
                +        optor_id = request.POST.get('optor_id', '')
               | 
            |
| 54 | 
                +        version = request.POST.get('version', 0)
               | 
            |
| 55 | 
                +  | 
            |
| 56 | 
                + MchLogInfo.objects.create(  | 
            |
| 57 | 
                + log_file=file_path,  | 
            |
| 58 | 
                + operator_id=optor_id,  | 
            |
| 59 | 
                + app_version=version,  | 
            |
| 60 | 
                + )  | 
            
                @@ -54,6 +54,7 @@ INSTALLED_APPS = (  | 
            ||
| 54 | 54 | 
                'box',  | 
            
| 55 | 55 | 
                'group',  | 
            
| 56 | 56 | 
                'integral',  | 
            
| 57 | 
                + 'logs',  | 
            |
| 57 | 58 | 
                'mch',  | 
            
| 58 | 59 | 
                'message',  | 
            
| 59 | 60 | 
                'miniapp',  | 
            
                @@ -0,0 +1,15 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +from django.contrib import admin  | 
            |
| 4 | 
                +from django_admin import ReadOnlyModelAdmin  | 
            |
| 5 | 
                +  | 
            |
| 6 | 
                +from logs.models import MchLogInfo  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                +class MchLogInfoAdmin(ReadOnlyModelAdmin, admin.ModelAdmin):  | 
            |
| 10 | 
                +    list_display = ('log_id', 'log_file', 'operator_id', 'app_version', 'status', 'created_at', 'updated_at')
               | 
            |
| 11 | 
                +    list_filter = ('operator_id', 'app_version', 'status')
               | 
            |
| 12 | 
                +    search_fields = ('operator_id', 'app_version')
               | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                +  | 
            |
| 15 | 
                +admin.site.register(MchLogInfo, MchLogInfoAdmin)  | 
            
                @@ -0,0 +1,8 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +from __future__ import unicode_literals  | 
            |
| 3 | 
                +  | 
            |
| 4 | 
                +from django.apps import AppConfig  | 
            |
| 5 | 
                +  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +class LogsConfig(AppConfig):  | 
            |
| 8 | 
                + name = 'logs'  | 
            
                @@ -0,0 +1,35 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.11 on 2018-05-30 03:09  | 
            |
| 3 | 
                +from __future__ import unicode_literals  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +import django_models_ext.fileext  | 
            |
| 7 | 
                +import shortuuidfield.fields  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                +class Migration(migrations.Migration):  | 
            |
| 11 | 
                +  | 
            |
| 12 | 
                + initial = True  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + dependencies = [  | 
            |
| 15 | 
                + ]  | 
            |
| 16 | 
                +  | 
            |
| 17 | 
                + operations = [  | 
            |
| 18 | 
                + migrations.CreateModel(  | 
            |
| 19 | 
                + name='MchLogInfo',  | 
            |
| 20 | 
                + fields=[  | 
            |
| 21 | 
                +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
               | 
            |
| 22 | 
                +                ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')),
               | 
            |
| 23 | 
                +                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
               | 
            |
| 24 | 
                +                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
               | 
            |
| 25 | 
                +                ('log_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='\u65e5\u5fd7\u552f\u4e00\u6807\u8bc6', max_length=22)),
               | 
            |
| 26 | 
                +                ('log_file', models.FileField(blank=True, help_text='\u65e5\u5fd7\u6587\u4ef6', null=True, upload_to=django_models_ext.fileext.upload_path, verbose_name='log_file')),
               | 
            |
| 27 | 
                +                ('operator_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='\u64cd\u4f5c\u5458\u552f\u4e00\u6807\u8bc6', max_length=22, null=True)),
               | 
            |
| 28 | 
                +                ('app_version', models.IntegerField(db_index=True, default=0, help_text='APP \u7248\u672c\u53f7', verbose_name='app_version')),
               | 
            |
| 29 | 
                + ],  | 
            |
| 30 | 
                +            options={
               | 
            |
| 31 | 
                + 'verbose_name': 'mchloginfo',  | 
            |
| 32 | 
                + 'verbose_name_plural': 'mchloginfo',  | 
            |
| 33 | 
                + },  | 
            |
| 34 | 
                + ),  | 
            |
| 35 | 
                + ]  | 
            
                @@ -0,0 +1,20 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.11 on 2018-05-30 03:22  | 
            |
| 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 | 
                +        ('logs', '0001_initial'),
               | 
            |
| 12 | 
                + ]  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + operations = [  | 
            |
| 15 | 
                + migrations.AlterField(  | 
            |
| 16 | 
                + model_name='mchloginfo',  | 
            |
| 17 | 
                + name='operator_id',  | 
            |
| 18 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u64cd\u4f5c\u5458\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='operator_id'),  | 
            |
| 19 | 
                + ),  | 
            |
| 20 | 
                + ]  | 
            
                @@ -0,0 +1,22 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +  | 
            |
| 3 | 
                +from django.db import models  | 
            |
| 4 | 
                +from django.utils.translation import ugettext_lazy as _  | 
            |
| 5 | 
                +from django_models_ext import BaseModelMixin, upload_file_url, upload_path  | 
            |
| 6 | 
                +from shortuuidfield import ShortUUIDField  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +  | 
            |
| 9 | 
                +class MchLogInfo(BaseModelMixin):  | 
            |
| 10 | 
                + log_id = ShortUUIDField(_(u'log_id'), max_length=32, help_text=u'日志唯一标识', db_index=True)  | 
            |
| 11 | 
                + log_file = models.FileField(_(u'log_file'), upload_to=upload_path, blank=True, null=True, help_text=u'日志文件')  | 
            |
| 12 | 
                +  | 
            |
| 13 | 
                + operator_id = models.CharField(_(u'operator_id'), max_length=32, blank=True, null=True, help_text=u'操作员唯一标识', db_index=True)  | 
            |
| 14 | 
                +  | 
            |
| 15 | 
                + app_version = models.IntegerField(_(u'app_version'), default=0, help_text=u'APP 版本号', db_index=True)  | 
            |
| 16 | 
                +  | 
            |
| 17 | 
                + class Meta:  | 
            |
| 18 | 
                + verbose_name = _(u'mchloginfo')  | 
            |
| 19 | 
                + verbose_name_plural = _(u'mchloginfo')  | 
            |
| 20 | 
                +  | 
            |
| 21 | 
                + def __unicode__(self):  | 
            |
| 22 | 
                + return unicode(self.pk)  | 
            
                @@ -0,0 +1,7 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +from __future__ import unicode_literals  | 
            |
| 3 | 
                +  | 
            |
| 4 | 
                +from django.test import TestCase  | 
            |
| 5 | 
                +  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +# Create your tests here.  | 
            
                @@ -0,0 +1,7 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +from __future__ import unicode_literals  | 
            |
| 3 | 
                +  | 
            |
| 4 | 
                +from django.shortcuts import render  | 
            |
| 5 | 
                +  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +# Create your views here.  | 
            
                @@ -13,6 +13,7 @@ from TimeConvert import TimeConvert as tc  | 
            ||
| 13 | 13 | 
                 | 
            
| 14 | 14 | 
                from account.models import UserInfo  | 
            
| 15 | 15 | 
                from statistic.models import RegisterStatisticInfo  | 
            
| 16 | 
                +from utils.error.errno_utils import ProductBrandStatusCode  | 
            |
| 16 | 17 | 
                from utils.redis.connect import r  | 
            
| 17 | 18 | 
                from utils.redis.rprofile import set_profile_info  | 
            
| 18 | 19 | 
                 | 
            
                @@ -23,6 +24,11 @@ WECHAT = settings.WECHAT  | 
            ||
| 23 | 24 | 
                @logit  | 
            
| 24 | 25 | 
                @transaction.atomic  | 
            
| 25 | 26 | 
                def get_userinfo_api(request):  | 
            
| 27 | 
                +    brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
               | 
            |
| 28 | 
                +  | 
            |
| 29 | 
                + if brand_id != settings.KODO_DEFAULT_BRAND_ID:  | 
            |
| 30 | 
                + return response(ProductBrandStatusCode.BRAND_NOT_MATCH)  | 
            |
| 31 | 
                +  | 
            |
| 26 | 32 | 
                     wxcfg = WECHAT.get('MINIAPP', {})
               | 
            
| 27 | 33 | 
                 | 
            
| 28 | 34 | 
                     appid = wxcfg.get('appID')
               | 
            
                @@ -18,6 +18,7 @@ class SaleclerkStatusCode(BaseStatusCode):  | 
            ||
| 18 | 18 | 
                class ProductBrandStatusCode(BaseStatusCode):  | 
            
| 19 | 19 | 
                """ 品牌相关错误码 5010xx """  | 
            
| 20 | 20 | 
                BRAND_NOT_FOUND = StatusCodeField(501001, 'Brand Not Found', description=u'品牌不存在')  | 
            
| 21 | 
                + BRAND_NOT_MATCH = StatusCodeField(501011, 'Brand Not Match', description=u'品牌不匹配')  | 
            |
| 21 | 22 | 
                 | 
            
| 22 | 23 | 
                 | 
            
| 23 | 24 | 
                class ProductModelStatusCode(BaseStatusCode):  |