| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773 | 
              - from __future__ import division
 - import json
 - from collections import defaultdict
 - from datetime import datetime
 - from django.conf import settings
 - from django.contrib.auth.hashers import make_password
 - from django.db import transaction
 - from django.db.models import Count, Q, Sum
 - from django_logit import logit
 - from django_query import get_query_value
 - from django_response import response
 - from paginator import pagination
 - from pysnippets.strsnippets import strip
 - from TimeConvert import TimeConvert as tc
 - from account.models import UserInfo
 - from api.encrypt_views import get_ciphertext
 - from coupon.models import CouponInfo, UserCouponInfo
 - from integral.models import SaleclerkSubmitLogInfo
 - from kodo.decorators import check_admin
 - from logs.models import AdministratorLoginLogInfo, ComplementCodeLogInfo, MchInfoEncryptLogInfo
 - from mch.models import AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, ModelInfo
 - from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityContributionInfo,
 -                            MemberActivityContributionWelfareInfo, MemberActivityContributionWelfareUnlockingInfo,
 -                            MemberActivityGroupShareInfo, MemberActivityInfo, MemberActivitySignupInfo)
 - from pre.custom_message import sendtemplatemessage, sendwxasubscribemessage
 - from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo
 - from utils.error.errno_utils import (AdministratorStatusCode, ComplementCodeStatusCode, CouponStatusCode,
 -                                      MemberActivityContributionStatusCode, MemberActivityContributionWelfareStatusCode,
 -                                      MemberActivityContributionWelfareUnblockingStatusCode, MemberActivityStatusCode,
 -                                      MemberGoodStatusCode, ProductCouponStatusCode, ProductMachineStatusCode,
 -                                      UserStatusCode)
 - WECHAT = settings.WECHAT
 - @logit
 - @check_admin
 - def querysn(request, administrator):
 -     model_id = request.POST.get('model_id', '')
 -     sn = request.POST.get('sn', '')
 -     if administrator.admin_type != AdministratorInfo.MAINTENANCE:
 -         return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
 -     log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, model_id=model_id, serialNo=sn, submit_during_activity=True, status=True).order_by('has_used', '-pk').first()
 -     if not log:
 -         log = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, model_id=model_id, serialNo=sn, status=True).order_by('-submit_during_activity', 'dupload').first()
 -     if not log:
 -         return response(ProductMachineStatusCode.SN_NOT_FOUND)
 -     return response(200, 'Query SN Success', u'查询序列号成功', data=log.data)
 - @logit
 - @check_admin
 - def queryusedsn(request, administrator):
 -     if administrator.admin_type != AdministratorInfo.MAINTENANCE:
 -         return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
 -     logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, admin_id=administrator.admin_id, has_used=True, status=True).order_by('-used_at')
 -     logs = [log.data for log in logs]
 -     return response(200, 'Query Used SN Success', u'查询核销序列号成功', data={
 -         'logs': logs,
 -     })
 - @logit
 - @check_admin
 - @transaction.atomic
 - def usecoupon(request, administrator):
 -     model_id = request.POST.get('model_id', '')
 -     sn = request.POST.get('sn', '')
 -     if administrator.admin_type != AdministratorInfo.MAINTENANCE:
 -         return response(AdministratorStatusCode.MAINTENANCE_NOT_FOUND)
 -     log = ConsumeInfoSubmitLogInfo.objects.filter(
 -         brand_id=administrator.brand_id,
 -         model_id=model_id,
 -         serialNo=sn,
 -         submit_during_activity=True,
 -         has_used=False,
 -         status=True
 -     ).first()
 -     if not log:
 -         return response(ProductMachineStatusCode.SN_NOT_FOUND)
 -     logdata = log.data
 -     if logdata.get('final_coupon_info', {}).get('coupon_has_expired', True):
 -         return response(ProductCouponStatusCode.COUPON_HAS_EXPIRED)
 -     log.has_used = True
 -     log.used_at = tc.utc_datetime()
 -     log.save()
 -     return response(200, 'Use Coupon Success', u'核销优惠券成功')
 - @logit
 - @check_admin
 - def userinfo(request, administrator):
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     userinfos = UserInfo.objects.filter(status=True).order_by('-pk')
 -     count = userinfos.count()
 -     userinfos, left = pagination(userinfos, page, num)
 -     userinfos = [userinfo.admindata for userinfo in userinfos]
 -     return response(200, 'Userinfo Success', u'用户列表获取成功', data={
 -         'userinfos': userinfos,
 -         'count': count,
 -         'left': left,
 -     })
 - @logit
 - @check_admin
 - def query_usercoupons(request, administrator):
 -     user_id = request.POST.get('user_id', '')
 -     
 -     try:
 -         user = UserInfo.objects.get(user_id=user_id)
 -     except UserInfo.DoesNotExist:
 -         return response(UserStatusCode.USER_NOT_FOUND)
 -     coupons = UserCouponInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-pk')
 -     coupons = [coupon.admindata for coupon in coupons]
 -     return response(200, 'User Coupon Success', u'用户劵列表获取成功', data={
 -         'coupons': coupons,
 -     })
 - @logit
 - @check_admin
 - def query_usergoods(request, administrator):
 -     user_id = request.POST.get('user_id', '')
 -     dupload = request.POST.get('dupload', '')
 -     
 -     try:
 -         user = UserInfo.objects.get(user_id=user_id)
 -     except UserInfo.DoesNotExist:
 -         return response(UserStatusCode.USER_NOT_FOUND)
 -     logs = ConsumeInfoSubmitLogInfo.objects.filter(brand_id=administrator.brand_id, user_id=user_id, status=True).order_by('-pk')
 -     if dupload:
 -         logs = logs.filter(dupload=dupload)
 -     logs = [log.adminuserdata for log in logs]
 -     return response(200, 'Userinfo Goods Success', u'用户商品列表获取成功', data={
 -         'logs': logs,
 -     })
 - @logit
 - @check_admin
 - def query_userinfo(request, administrator):
 -     query = request.POST.get('query', '')
 -     level = request.POST.get('level', '')
 -     is_member = request.POST.get('is_member', '')
 -     code_version = request.POST.get('code_version', 0)
 -     sex = request.POST.get('sex', '')
 -     subscribe = request.POST.get('subscribe', '')
 -     has_membercard = request.POST.get('has_membercard', '')
 -     province = request.POST.get('province', '')
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     userinfos = UserInfo.objects.filter(Q(status=True) & (Q(user_id__icontains=query) | Q(nickname__icontains=query) | Q(phone__icontains=query) | Q(memberusercardcode__icontains=query))).order_by('-pk')
 -     if level:
 -         userinfos = userinfos.filter(level=level)
 -     if code_version:
 -         userinfos = userinfos.filter(code_version=code_version)
 -     if subscribe:
 -         userinfos = userinfos.filter(subscribe=subscribe)
 -     if has_membercard:
 -         userinfos = userinfos.filter(has_membercard=has_membercard)
 -     if is_member:
 -         userinfos = userinfos.filter(level__gte=1)
 -     if sex:
 -         userinfos = userinfos.filter(sex=sex)
 -     if province:
 -         userinfos = userinfos.filter(province_name=province)
 -     if start_time and end_time:
 -         ftime = datetime.strptime(start_time + ' 00:00:00', '%Y%m%d %H:%M:%S')
 -         ttime = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
 -         userinfos = userinfos.filter(created_at__range=[ftime, ttime])
 -     count = userinfos.count()
 -     userinfos, left = pagination(userinfos, page, num)
 -     userinfos = [userinfo.admindata for userinfo in userinfos]
 -     return response(200, 'Userinfo Success', u'用户列表获取成功', data={
 -         'userinfos': userinfos,
 -         'count': count,
 -         'left': left
 -     })
 - @logit
 - @check_admin
 - @transaction.atomic
 - def userinfo_update(request, administrator):
 -     user_id = request.POST.get('user_id', '')
 -     integral = int(request.POST.get('integral', 0))
 -     
 -     try:
 -         user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True)
 -     except UserInfo.DoesNotExist:
 -         return response(UserStatusCode.USER_NOT_FOUND)
 -     user.integral = integral
 -     user.save()
 -     return response(200, 'Userinfo Update Success', u'修改用户信息成功', data={})
 - @check_admin
 - def statistic_userprofile(request, administrator):
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     model_name = request.POST.get('model_name', '')
 -     if model_name:
 -         logs = ConsumeModelSaleStatisticInfo.objects.filter(model_name=model_name, ymd__gte=start_time, ymd__lte=end_time)
 -     else:
 -         logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
 -     sexs = {0: 0, 1: 0, 2: 0}
 -     subscribes = {0: 0, 1: 0}
 -     has_membercards = {0: 0, 1: 0}
 -     provinces = defaultdict(int)
 -     for log in logs:
 -         for user in log.users:
 -             try:
 -                 user = UserInfo.objects.get(user_id=user, status=True)
 -             except UserInfo.DoesNotExist:
 -                 continue
 -             provinces[user.province_name] += 1
 -             sexs[user.sex] += 1
 -             subscribes[user.subscribe] += 1
 -             has_membercards[user.has_membercard] += 1
 -     return response(200, 'Get User Profile Success', u'获取用户画像成功', data={
 -         'provinces': provinces,
 -         'sexs': sexs,
 -         'subscribe': subscribes,
 -         'has_membercards': has_membercards,
 -     })
 - @check_admin
 - def statistic_daily(request, administrator):
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     sale_logs = ConsumeSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
 -     user_logs = ConsumeUserStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time)
 -     sale_logs = [log.data for log in sale_logs]
 -     user_logs = [log.data for log in user_logs]
 -     return response(200, 'Get User Sales Statistic Success', u'获取销量统计成功', data={
 -         'sale_logs': sale_logs,
 -         'user_logs': user_logs,
 -     })
 - @check_admin
 - def statistic_model(request, administrator):
 -     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
 -     admin_id = request.POST.get('admin_id', '')
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     logs = ConsumeModelSaleStatisticInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time).values_list('model_name').annotate(Sum('num'))
 -     logs = [{'model_name': log[0], 'num': log[1]} for log in logs]
 -     return response(200, 'Get Model Statistic Success', u'获取型号统计成功', data={
 -         'logs': logs
 -     })
 - @check_admin
 - def statistic_distributor(request, administrator):
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     model_name = request.POST.get('model_name', '')
 -     distributor_name = request.POST.get('distributor_name', '')
 -     daily_sql = 'select id, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s %s GROUP BY ymd;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '', ('AND distributor_name="%s"' % (distributor_name)) if distributor_name else '')
 -     daily_logs = SaleclerkSubmitLogInfo.objects.raw(daily_sql)
 -     daily_logs = [{'ymd': log.ymd, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in daily_logs]
 -     model_logs = []
 -     if model_name == '':
 -         model_sql = 'select id, model_uni_name, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s GROUP BY model_uni_name;' % (start_time, end_time, ('AND distributor_name="%s"' % (distributor_name)) if distributor_name else '')
 -         model_logs = SaleclerkSubmitLogInfo.objects.raw(model_sql)
 -         model_logs = [{'model_uni_name': log.model_uni_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in model_logs]
 -     distributor_logs = []
 -     if distributor_name == '':
 -         distributor_sql = 'select id, distributor_name, Count(*) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2, Count((code_version=1 AND has_scan=True) or NULL) AS has_code1_scan_num, Count((code_version=2 AND has_scan=True) or NULL) AS has_code2_scan_num FROM integral_saleclerksubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND test_sn=False AND status=True %s GROUP BY distributor_name;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '')
 -         distributor_logs = SaleclerkSubmitLogInfo.objects.raw(distributor_sql)
 -         distributor_logs = [{'distributor_name': log.distributor_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2, 'has_code1_scan_num': log.has_code1_scan_num, 'has_code2_scan_num': log.has_code2_scan_num} for log in distributor_logs]
 -     return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={
 -         'daily_logs': daily_logs,
 -         'model_logs': model_logs,
 -         'distributor_logs': distributor_logs
 -     })
 - @check_admin
 - def dashboard(request, administrator):
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     
 -     sale_logs = SaleclerkSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, test_sn=False, status=True)
 -     sale_count = sale_logs.count()
 -     sale_daily_logs = list(sale_logs.values('ymd').annotate(num=Count('pk')))
 -     sale_model_logs = list(sale_logs.values('model_uni_name').annotate(num=Count('pk')).order_by('-num'))[:10]
 -     sale_distributor_logs = list(sale_logs.values('distributor_name').annotate(num=Count('pk')).order_by('-num'))[:10]
 -     
 -     logs = ConsumeInfoSubmitLogInfo.objects.filter(ymd__gte=start_time, ymd__lte=end_time, test_user=False, dupload=False, status=True)
 -     consumer_count = logs.count()
 -     consumer_daily_logs = list(logs.values('ymd').annotate(num=Count('pk')).order_by('ymd'))
 -     consumer_model_logs = list(logs.values('model_uni_name').annotate(num=Count('pk')).order_by('-num'))[:10]
 -     consumer_province_logs = list(logs.values('province').annotate(num=Count('pk')).order_by('-num'))[:10]
 -     return response(200, 'Get Distributor Statistic Success', u'获取经销商统计成功', data={
 -         'sale_daily_logs': sale_daily_logs,
 -         'sale_model_logs': sale_model_logs,
 -         'sale_distributor_logs': sale_distributor_logs,
 -         'consumer_daily_logs': consumer_daily_logs,
 -         'consumer_model_logs': consumer_model_logs,
 -         'consumer_province_logs': consumer_province_logs,
 -         'sale_count': sale_count,
 -         'consumer_count': consumer_count,
 -     })
 - @check_admin
 - def statistic_consumer(request, administrator):
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     model_name = request.POST.get('model_name', '')
 -     
 -     daily_sql = 'select id, Count(id) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True %s GROUP BY ymd;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '')
 -     daily_logs = ConsumeInfoSubmitLogInfo.objects.raw(daily_sql)
 -     daily_logs = [{'ymd': log.ymd, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in daily_logs]
 -     model_logs = []
 -     if model_name == '':
 -         model_sql = 'select id, model_uni_name, Count(id) AS num, Count(code_version=1 or NULL) AS code1 , Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True GROUP BY model_uni_name ORDER BY num desc;' % (start_time, end_time)
 -         model_logs = ConsumeInfoSubmitLogInfo.objects.raw(model_sql)
 -         model_logs = [{'model_uni_name': log.model_uni_name, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in model_logs]
 -     province_sql = 'select id, province, Count(id) AS num, Count(code_version=1 or NULL) AS code1, Count(code_version=2 or NULL) AS code2 FROM mch_consumeinfosubmitloginfo where ymd >= %s AND ymd <= %s AND test_user=False AND dupload=False AND status=True %s GROUP BY province ORDER BY num desc;' % (start_time, end_time, ('AND model_uni_name="%s"' % (model_name)) if model_name else '')
 -     province_logs = ConsumeInfoSubmitLogInfo.objects.raw(province_sql)
 -     province_logs = [{'province': log.province, 'num': log.num, 'code1': log.code1, 'code2': log.code2} for log in province_logs]
 -     return response(200, 'Get Consumer Statistic Success', u'获取消费者统计成功', data={
 -         'daily_logs': daily_logs,
 -         'model_logs': model_logs,
 -         'province_logs': province_logs,
 -     })
 - @check_admin
 - def statistic_member(request, administrator):
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     
 -     if start_time and end_time:
 -         start_time = datetime.strptime(start_time, '%Y%m%d')
 -         end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
 -         userinfos = UserInfo.objects.filter(test_user=False, level__gte=1, resgister_at__range=(start_time, end_time))
 -     else:
 -         userinfos = UserInfo.objects.filter(test_user=False, level__gte=1, status=True)
 -     
 -     mp_num = userinfos.filter(subscribe=True).count()
 -     
 -     membercard_num = userinfos.filter(has_membercard=True).count()
 -     
 -     level_logs = list(userinfos.values('level').annotate(num=Count('user_id')))
 -     
 -     integral_logs = list(userinfos.values('integral').annotate(num=Count('user_id')))
 -     
 -     shot_logs = list(userinfos.values('shots_num').annotate(num=Count('user_id')))
 -     
 -     sex_logs = list(userinfos.values('sex').annotate(num=Count('user_id')))
 -     
 -     province_logs = list(userinfos.values('province_name').annotate(num=Count('user_id')).order_by('-num'))
 -     return response(200, 'Get Consumer Statistic Success', u'获取消费者统计成功', data={
 -         'mp_num': mp_num,
 -         'membercard_num': membercard_num,
 -         'level_logs': level_logs,
 -         'integral_logs': integral_logs,
 -         'shot_logs': shot_logs,
 -         'sex_logs': sex_logs,
 -         'province_logs': province_logs,
 -     })
 - @check_admin
 - def statistic_coupon(request, administrator):
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     if start_time and end_time:
 -         start_time = datetime.strptime(start_time, '%Y%m%d')
 -         end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
 -         coupons = UserCouponInfo.objects.filter(active_at__range=(start_time, end_time), status=True)
 -     else:
 -         coupons = UserCouponInfo.objects.filter(status=True)
 -     froms_logs = list(coupons.values('coupon_from').annotate(num=Count('user_coupon_id')))
 -     type_logs = list(coupons.values('coupon_title', 'coupon_value').annotate(num=Count('user_coupon_id')))
 -     if start_time and end_time:
 -         used_coupons = UserCouponInfo.objects.filter(used_at__range=(start_time, end_time), status=True)
 -     else:
 -         used_coupons = UserCouponInfo.objects.filter(has_used=True, status=True)
 -     type_has_used_logs = list(used_coupons.values('coupon_title', 'coupon_value').annotate(num=Count('user_coupon_id')))
 -     return response(200, 'Get Consumer Statistic Success', u'获取用户劵统计成功', data={
 -         'froms_logs': froms_logs,
 -         'type_logs': type_logs,
 -         'type_has_used_logs': type_has_used_logs,
 -     })
 - @check_admin
 - def record_consumer(request, administrator):
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     query = request.POST.get('query', '')
 -     dupload = request.POST.get('dupload', '')
 -     code_version = request.POST.get('code_version', 0)
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     logs = ConsumeInfoSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & (Q(model_name__icontains=query) | Q(phone__icontains=query) | Q(serialNo__icontains=query))).order_by('-pk')
 -     if dupload:
 -         logs = logs.filter(dupload=dupload)
 -     if code_version:
 -         logs = logs.filter(code_version=code_version)
 -     if start_time and end_time:
 -         logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time)
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     logs = [log.admindata for log in logs]
 -     return response(200, 'Get Consumer Record Success', u'获取消费者销售记录成功', data={
 -         'logs': logs,
 -         'count': count,
 -         'left': left
 -     })
 - @check_admin
 - def record_consumer_batch(request, administrator):
 -     logs = json.loads(request.POST.get('logs', '[]'))
 -     infos = []
 -     unknows = []
 -     for log in logs:
 -         try:
 -             infos.append(ConsumeInfoSubmitLogInfo.objects.get(model_name__icontains=log['model_name'], serialNo=log['code'], status=True, dupload=False).admindata)
 -         except ConsumeInfoSubmitLogInfo.DoesNotExist:
 -             unknows.append(log)
 -     return response(200, 'Batch Get Record Sale Success', u'批量获取销售员销售记录', data={
 -         'logs': infos,
 -         'unknows': unknows
 -     })
 - @check_admin
 - def record_sale(request, administrator):
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     query = request.POST.get('query', '')
 -     dupload = request.POST.get('dupload', '')
 -     has_scan = request.POST.get('has_scan', '')
 -     code_version = request.POST.get('code_version', 0)
 -     is_online_sale = request.POST.get('is_online_sale', '')
 -     logs = SaleclerkSubmitLogInfo.objects.filter(Q(status=True) & Q(test_user=False) & Q(test_sn=False) & (Q(model_name__icontains=query) | Q(clerk_name__icontains=query) | Q(distributor_name__icontains=query) | Q(code__icontains=query))).order_by('-created_at')
 -     if dupload:
 -         logs = logs.filter(dupload=dupload)
 -     if code_version:
 -         logs = logs.filter(code_version=code_version)
 -     if has_scan:
 -         logs = logs.filter(has_scan=has_scan)
 -     if start_time and end_time:
 -         logs = logs.filter(ymd__gte=start_time, ymd__lte=end_time)
 -     if is_online_sale:
 -         logs = logs.filter(remark=('扫描条形码' if is_online_sale == '1' else ''))
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     logs = [log.admindata for log in logs]
 -     return response(200, 'Get Sale Record Success', u'获取销售员销售记录成功', data={
 -         'logs': logs,
 -         'count': count,
 -         'left': left
 -     })
 - @check_admin
 - def record_sale_batch(request, administrator):
 -     logs = json.loads(request.POST.get('logs', '[]'))
 -     infos = []
 -     unknows = []
 -     for log in logs:
 -         try:
 -             infos.append(SaleclerkSubmitLogInfo.objects.get(model_name__icontains=log['model_name'], code=log['code'], status=True, dupload=False).admindata)
 -         except SaleclerkSubmitLogInfo.DoesNotExist:
 -             unknows.append(log)
 -     return response(200, 'Batch Get Record Sale Success', u'批量获取销售员销售记录', data={
 -         'logs': infos,
 -         'unknows': unknows
 -     })
 - @check_admin
 - def model_list(request, administrator):
 -     infos = list(ModelInfo.objects.filter(status=True).values_list('model_uni_name', flat=True).distinct().order_by('model_uni_name'))
 -     return response(200, 'Get Model List Success', u'获取型号列表成功', data={
 -         'models': infos
 -     })
 - @check_admin
 - def distributor_list(request, administrator):
 -     infos = list(DistributorInfo.objects.filter(status=True).values_list('distributor_name', flat=True).distinct().order_by('distributor_name'))
 -     return response(200, 'Get Model List Success', u'获取经销商列表成功', data={
 -         'distributors': infos
 -     })
 - @check_admin
 - def member_goods_order(request, administrator):
 -     query = request.POST.get('query', '')
 -     good_type = request.POST.get('good_type', '')
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     order_status = int(request.POST.get('order_status', 0))
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     orders = GoodsOrderInfo.objects.filter(Q(phone__icontains=query) | Q(user_id=query) | Q(title__icontains=query) & Q(status=True)).order_by('-pk')
 -     if good_type:
 -         orders = orders.filter(good_type=good_type)
 -     if start_time and end_time:
 -         start_time = datetime.strptime(start_time, '%Y%m%d')
 -         end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
 -         orders = orders.filter(created_at__range=(start_time, end_time))
 -     
 -     if order_status == 1:
 -         orders = orders.filter(Q(tracking_number__isnull=True) | Q(tracking_number=''))
 -     elif order_status == 2:
 -         orders = orders.filter(tracking_number__isnull=False).exclude(tracking_number='')
 -     count = orders.count()
 -     orders, left = pagination(orders, page, num)
 -     orders = [order.admindata for order in orders]
 -     return response(200, 'Get Member Goods Order List Success', u'获取会员商品订单列表成功', data={
 -         'orders': orders,
 -         'left': left,
 -         'count': count
 -     })
 - @check_admin
 - def member_goods_order_update(request, administrator):
 -     order_id = request.POST.get('order_id', '')
 -     tracking_number = request.POST.get('tracking_number', '')
 -     remark = request.POST.get('remark', u'您的礼品正在快马加鞭赶来,请耐心等待呦~')
 -     if not send_trackingNumber_message(order_id, tracking_number, remark):
 -         return response(400001, 'Member Goods Order Update Failure', u'会员商品订单修改失败')
 -     return response(200, 'Member Goods Order Update Success', u'会员商品订单修改成功')
 - @check_admin
 - def member_goods_order_batch_update(request, administrator):
 -     orders = json.loads(request.POST.get('orders', '[]'))
 -     err_orders = []
 -     for order in orders:
 -         if not send_trackingNumber_message(order.get('order_id', ''), order.get('tracking_number', ''), order.get('remark', u'您的礼品正在快马加鞭赶来,请耐心等待呦~')):
 -             err_orders.append(order.get('order_id', ''))
 -     if err_orders:
 -         return response(40001, 'Member Goods Order Update Error', u'部分会员商品订单修改失败', data={
 -             'orders': err_orders
 -         })
 -     return response(200, 'Member Goods Order Update Success', u'会员商品订单修改成功')
 - def send_trackingNumber_message(order_id, tracking_number, remark):
 -     try:
 -         order = GoodsOrderInfo.objects.get(order_id=order_id, status=True)
 -         order.remark = remark
 -         order.tracking_number = tracking_number
 -         if tracking_number and order.good_type == GoodsInfo.PHYSICAL and not order.has_send_template_message:
 -             order.has_send_template_message = True
 -             
 -             user = UserInfo.objects.get(user_id=order.user_id)
 -             data = {
 -                 "thing6": {
 -                     "value": order.title,
 -                     "color": "#173177"
 -                 },
 -                 "character_string7": {
 -                     "value": tracking_number,
 -                     "color": "#173177"
 -                 },
 -                 "number2": {
 -                     "value": order.integral,
 -                     "color": "#173177"
 -                 },
 -                 "thing5": {
 -                     "value": order.remark,
 -                     "color": "#173177"
 -                 },
 -             }
 -             res = sendwxasubscribemessage(openid=user.openid_miniapp, template_id=settings.TEMPLATE_ID_TRACKING, data=data, miniprogram_state=None, lang=None, page=None)
 -             order.send_template_message_res = json.dumps(res)
 -         order.save()
 -         return True
 -     except Exception:
 -         return False
 - @check_admin
 - def record_warehouse(request, administrator):
 -     model_name = request.POST.get('model_name', '')
 -     sn = request.POST.get('sn', '')
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     models = ModelInfo.objects.filter(model_name__icontains=model_name, status=True).values_list('pk', flat=True)
 -     logs = MchInfoEncryptLogInfo.objects.filter(model_pk__in=models, sn__icontains=sn, status=True)
 -     if start_time and end_time:
 -         start_time = datetime.strptime(start_time, '%Y%m%d')
 -         end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
 -         logs = logs.filter(created_at__range=(start_time, end_time))
 -     logs = logs.order_by('-pk')
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     logs = [log.admindata for log in logs]
 -     return response(200, 'Get Warehouse Record Success', u'获取入库记录成功', data={
 -         'logs': logs,
 -         'left': left,
 -         'count': count
 -     })
 - @check_admin
 - def member_activity_list(request, administrator):
 -     activity_type = request.POST.get('activity_type', '')
 -     title = request.POST.get('title', '')
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     logs = MemberActivityInfo.objects.filter(status=True)
 -     if activity_type:
 -         logs = logs.filter(activity_type=activity_type)
 -     if title:
 -         logs = logs.filter(title__icontains=title)
 -     if start_time and end_time:
 -         start_time = datetime.strptime(start_time, '%Y%m%d')
 -         end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
 -         logs = logs.filter(created_at__range=(start_time, end_time))
 -     logs = logs.order_by('-pk')
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     logs = [log.admindata for log in logs]
 -     return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
 -         'logs': logs,
 -         'left': left,
 -         'count': count
 -     })
 - @check_admin
 - def member_activity_detail(request, administrator):
 -     activity_id = request.POST.get('activity_id', '')
 -     try:
 -         log = MemberActivityInfo.objects.get(activity_id=activity_id)
 -     except MemberActivityInfo.DoesNotExist:
 -         return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
 -     return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={
 -         'log': log.admindetails,
 -     })
 - @check_admin
 - def member_activity_update(request, administrator):
 -     activity_id = request.POST.get('activity_id', '')
 -     activity_type = int(request.POST.get('activity_type', 0))
 -     title = request.POST.get('title', '')
 -     subtitle = request.POST.get('subtitle', '')
 -     start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE)
 -     end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE)
 -     start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE)
 -     end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE)
 -     city = request.POST.get('city', '')
 -     location = request.POST.get('location', '')
 -     integral = int(request.POST.get('integral', 0))
 -     is_slider = request.POST.get('is_slider', 0)
 -     slider_image_path = request.POST.get('banner_path', '') or request.POST.get('slider_image_path', '')
 -     cover_path = request.POST.get('cover_path', '')
 -     
 -     limit_image_num = int(request.POST.get('limit_image_num', 3))
 -     is_signup = request.POST.get('is_signup', 0)
 -     group_share_max_integral = int(request.POST.get('share_max_integral', 0))
 -     group_share_integral = int(request.POST.get('share_integral', 0))
 -     content_rich_text = request.POST.get('content_rich_text', '')
 -     share_h5_link = request.POST.get('share_h5_link', '')
 -     activity_state = int(request.POST.get('activity_state', 0))
 -     poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
 -     poster_content = request.POST.get('poster_content', '')
 -     contribution_content_placeholder = request.POST.get('contribution_content_placeholder', '')
 -     try:
 -         log = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
 -     except MemberActivityInfo.DoesNotExist:
 -         return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
 -     log.activity_type = activity_type
 -     log.title = title
 -     log.subtitle = subtitle
 -     log.date = date
 -     log.start_date = start_date
 -     log.end_date = end_date
 -     log.start_display_date = start_display_date
 -     log.end_display_date = end_display_date
 -     log.city = city
 -     log.location = location
 -     log.integral = integral
 -     log.is_slider = is_slider
 -     log.slider_image = slider_image_path
 -     log.cover = cover_path
 -     
 -     log.limit_image_num = limit_image_num
 -     log.is_signup = is_signup
 -     log.group_share_integral = group_share_integral
 -     log.group_share_max_integral = group_share_max_integral
 -     log.content_rich_text = content_rich_text
 -     log.share_h5_link = share_h5_link
 -     log.activity_state = activity_state
 -     log.poster_kv_img_url = poster_kv_img_url
 -     log.poster_content = poster_content
 -     log.contribution_content_placeholder = contribution_content_placeholder
 -     log.save()
 -     return response(200, 'MemberActivityInfo Update Success', u'会员活动更新成功')
 - @check_admin
 - def member_activity_create(request, administrator):
 -     activity_type = int(request.POST.get('activity_type', 0))
 -     title = request.POST.get('title', '')
 -     subtitle = request.POST.get('subtitle', '')
 -     start_date = tc.to_date(request.POST.get('start_date', '') or settings.DEFAULT_START_DATE)
 -     end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE)
 -     start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE)
 -     end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE)
 -     city = request.POST.get('city', '')
 -     location = request.POST.get('location', '')
 -     integral = int(request.POST.get('integral', 0))
 -     is_slider = request.POST.get('is_slider', 0)
 -     slider_image_path = request.POST.get('banner_path', '') or request.POST.get('slider_image_path', '')
 -     cover_path = request.POST.get('cover_path', '')
 -     
 -     limit_image_num = int(request.POST.get('limit_image_num', 3))
 -     is_signup = request.POST.get('is_signup', 0)
 -     group_share_max_integral = int(request.POST.get('share_max_integral', 0))
 -     group_share_integral = int(request.POST.get('share_integral', 0))
 -     content_rich_text = request.POST.get('content_rich_text', '')
 -     share_h5_link = request.POST.get('share_h5_link', '')
 -     activity_state = int(request.POST.get('activity_state', 0))
 -     poster_kv_img_url = request.POST.get('poster_kv_img_url', '')
 -     poster_content = request.POST.get('poster_content', '')
 -     act = MemberActivityInfo.objects.create(
 -         brand_id=administrator.brand_id,
 -         activity_type=activity_type,
 -         title=title,
 -         subtitle=subtitle,
 -         date=date,
 -         start_date=start_date,
 -         end_date=end_date,
 -         start_display_date=start_display_date,
 -         end_display_date=end_display_date,
 -         city=city,
 -         location=location,
 -         integral=integral,
 -         is_slider=is_slider,
 -         slider_image=slider_image_path,
 -         cover=cover_path,
 -         
 -         limit_image_num=limit_image_num,
 -         is_signup=is_signup,
 -         group_share_max_integral=group_share_max_integral,
 -         group_share_integral=group_share_integral,
 -         content_rich_text=content_rich_text,
 -         share_h5_link=share_h5_link,
 -         activity_state=activity_state,
 -         poster_kv_img_url=poster_kv_img_url,
 -         poster_content=poster_content,
 -         contribution_content_placeholder=contribution_content_placeholder
 -     )
 -     return response(200, 'MemberActivityInfo Create Success', u'会员活动创建成功', data={
 -         'activity': act.admindetails
 -     })
 - @check_admin
 - def member_activity_share_list(request, administrator):
 -     activity_id = request.POST.get('activity_id', '')
 -     page = int(request.POST.get('page', 1))
 -     num = int(request.POST.get('num', 20))
 -     logs = MemberActivityGroupShareInfo.objects.filter(activity_id=activity_id, status=True)
 -     total_integral = logs.aggregate(Sum('integral'))['integral__sum']
 -     logs = logs.values('share_user_id').annotate(integral_sum=Sum('integral'), group_count=Count('open_gid'), user_count=Count('click_user_id')).order_by('-user_count')
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
 -         'logs': list(logs),
 -         'count': count,
 -         'left': left,
 -         'total_integral': total_integral
 -     })
 - @check_admin
 - def member_activity_register_list(request, administrator):
 -     activity_id = request.POST.get('activity_id', '')
 -     page = int(request.POST.get('page', 1))
 -     num = int(request.POST.get('num', 20))
 -     logs = MemberActivitySignupInfo.objects.filter(activity_id=activity_id, status=True)
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     logs = [log.admindata for log in logs]
 -     return response(200, 'Get Member Activity Record Success', u'获取会员活动成功', data={
 -         'logs': list(logs),
 -         'count': count,
 -         'left': left,
 -     })
 - @check_admin
 - @logit
 - def member_activity_contribute_list(request, administrator):
 -     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
 -     activity_id = request.POST.get('activity_id', '')
 -     content_type = get_query_value(request, 'content_type', val_cast_type='int')
 -     audit_status = request.POST.get('audit_status', '')
 -     is_selected = request.POST.get('is_selected', '')
 -     query = request.POST.get('query', '')
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     contributions = MemberActivityContributionInfo.objects.filter(activity_id=activity_id, status=True)
 -     if 'content_type' in request.POST:
 -         contributions = contributions.filter(content_type=content_type)
 -     if audit_status != '':
 -         contributions = contributions.filter(audit_status=audit_status)
 -     if is_selected != '':
 -         contributions = contributions.filter(is_selected=is_selected)
 -     if query:
 -         contributions = contributions.filter(Q(title__icontains=query) | Q(user_name__icontains=query))
 -     contributions = contributions.order_by('-pk')
 -     count = contributions.count()
 -     contributions, left = pagination(contributions, page, num)
 -     contributions = [contribution.admindata for contribution in contributions]
 -     return response(data={
 -         'contributions': contributions,
 -         'left': left,
 -         'count': count
 -     })
 - @check_admin
 - @transaction.atomic
 - def member_activity_contribute_audit(request, administrator):
 -     contribution_id = request.POST.get('contribution_id', '')
 -     audit_status = get_query_value(request, 'audit_status', val_cast_type='int')
 -     try:
 -         contribution = MemberActivityContributionInfo.objects.select_for_update().get(contribution_id=contribution_id, status=True)
 -     except MemberActivityContributionInfo.DoesNotExist:
 -         return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND)
 -     contribution.audit_status = audit_status
 -     contribution.save()
 -     return response(200, 'Member Activity Contribution Audit Success', u'会员活动投稿审批成功')
 - @check_admin
 - @transaction.atomic
 - def member_activity_contribute_selected(request, administrator):
 -     contribution_id = request.POST.get('contribution_id', '')
 -     selected = get_query_value(request, 'selected', val_cast_type='int')
 -     try:
 -         contribution = MemberActivityContributionInfo.objects.select_for_update().get(contribution_id=contribution_id, status=True)
 -     except MemberActivityContributionInfo.DoesNotExist:
 -         return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND)
 -     contribution.is_selected = selected
 -     contribution.save()
 -     return response(200, 'Member Activity Contribution Selected Success', u'会员活动投稿入围成功')
 - @check_admin
 - def member_activity_contribute_welfare_list(request, administrator):
 -     welfare_type = request.POST.get('welfare_type', '')
 -     welfare_title = request.POST.get('welfare_title', '')
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     welfares = MemberActivityContributionWelfareInfo.objects.filter(status=True)
 -     if welfare_type:
 -         welfares = welfares.filter(welfare_type=welfare_type)
 -     if welfare_title:
 -         welfares = welfares.filter(welfare_title__icontains=welfare_title)
 -     welfares = welfares.order_by('-pk')
 -     count = welfares.count()
 -     welfares, left = pagination(welfares, page, num)
 -     welfares = [welfare.data for welfare in welfares]
 -     return response(200, 'Get Member Activity Contribute Welfare List Success', u'获取会员活动投稿福利列表成功', data={
 -         'welfares': welfares,
 -         'left': left,
 -         'count': count
 -     })
 - @check_admin
 - def member_activity_contribute_welfare_detail(request, administrator):
 -     welfare_id = request.POST.get('welfare_id', '')
 -     try:
 -         welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id)
 -     except MemberActivityContributionWelfareInfo.DoesNotExist:
 -         return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)
 -     return response(200, 'Get Member Activity Contribute Welfare Detail Success', u'获取会员活动投稿福利详情成功', data={
 -         'welfare': welfare.data,
 -     })
 - @check_admin
 - def member_activity_contribute_welfare_update(request, administrator):
 -     activity_id = request.POST.get('activity_id', '')
 -     welfare_id = request.POST.get('welfare_id', '')
 -     welfare_type = int(request.POST.get('welfare_type', 0))
 -     welfare_title = request.POST.get('welfare_title', '')
 -     welfare_detail = request.POST.get('welfare_detail', '')
 -     welfare_value = request.POST.get('welfare_value', 0)
 -     welfare_image_path = request.POST.get('welfare_image_path', '')
 -     try:
 -         welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True)
 -     except MemberActivityContributionWelfareInfo.DoesNotExist:
 -         return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)
 -     welfare.activity_id = activity_id
 -     welfare.welfare_type = welfare_type
 -     welfare.welfare_title = welfare_title
 -     welfare.welfare_detail = welfare_detail
 -     welfare.welfare_value = welfare_value if welfare_value else 0
 -     welfare.welfare_image = welfare_image_path
 -     welfare.save()
 -     return response(200, 'Update Member Activity Contribute Welfare Success', u'更新会员活动投稿福利成功')
 - @check_admin
 - def member_activity_contribute_welfare_create(request, administrator):
 -     activity_id = request.POST.get('activity_id', '')
 -     welfare_type = int(request.POST.get('welfare_type', 0))
 -     welfare_title = request.POST.get('welfare_title', '')
 -     welfare_detail = request.POST.get('welfare_detail', '')
 -     welfare_value = request.POST.get('welfare_value', 0)
 -     welfare_image_path = request.POST.get('welfare_image_path', None)
 -     MemberActivityContributionWelfareInfo.objects.create(
 -         brand_id=administrator.brand_id,
 -         activity_id=activity_id,
 -         welfare_type=welfare_type,
 -         welfare_title=welfare_title,
 -         welfare_detail=welfare_detail,
 -         welfare_value=welfare_value if welfare_value else 0,
 -         welfare_image=welfare_image_path,
 -     )
 -     return response(200, 'Create Member Activity Contribute Welfare Success', u'创建会员活动投稿福利成功')
 - @check_admin
 - def member_activity_contribute_welfare_delete(request, administrator):
 -     welfare_id = request.POST.get('welfare_id', '')
 -     try:
 -         welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True)
 -     except MemberActivityContributionWelfareInfo.DoesNotExist:
 -         return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)
 -     welfare.status = False
 -     welfare.save()
 -     return response(200, 'Delete Member Activity Contribute Welfare Success', u'删除会员活动投稿福利成功')
 - @check_admin
 - def member_activity_contribute_welfare_unlock(request, administrator):
 -     admin_id = request.POST.get('admin_id', '')
 -     contribution_id = request.POST.get('contribution_id', '')
 -     welfare_id = request.POST.get('welfare_id', '')
 -     try:
 -         contribution = MemberActivityContributionInfo.objects.get(contribution_id=contribution_id, status=True)
 -     except MemberActivityContributionInfo.DoesNotExist:
 -         return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND)
 -     try:
 -         welfare = MemberActivityContributionWelfareInfo.objects.get(welfare_id=welfare_id, status=True)
 -     except MemberActivityContributionWelfareInfo.DoesNotExist:
 -         return response(MemberActivityContributionWelfareStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_NOT_FOUND)
 -     unlocking_info, _ = MemberActivityContributionWelfareUnlockingInfo.objects.get_or_create(
 -         brand_id=administrator.brand_id,
 -         user_id=contribution.user_id,
 -         activity_id=contribution.activity_id,
 -         welfare_id=welfare_id,
 -         defaults={
 -             'admin_id': admin_id,
 -             'contribution_id': contribution_id,
 -             'welfare_type': welfare.welfare_type,
 -             'welfare_value': welfare.welfare_value,
 -         }
 -     )
 -     
 -     try:
 -         user = UserInfo.objects.get(user_id=contribution.user_id, status=True)
 -     except UserInfo.DoesNotExist:
 -         return response(UserStatusCode.USER_NOT_FOUND)
 -     try:
 -         act = MemberActivityInfo.objects.get(activity_id=contribution.activity_id, status=True)
 -     except MemberActivityInfo.DoesNotExist:
 -         return (MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
 -     data = {
 -         "first": {
 -             "value": u'你的活动福利已解锁。',
 -             "color": "#173177"
 -         },
 -         "keyword1": {
 -             "value": act.title,
 -             "color": "#173177"
 -         },
 -         "keyword2": {
 -             "value": welfare.welfare_title,
 -             "color": "#173177"
 -         },
 -         "remark": {
 -             "value": u'请点击详情填写收货地址。' if welfare.welfare_type == 0 else u'请点击详情进入小程序,收取福利。',
 -             "color": "#173177"
 -         }
 -     }
 -     wxcfg = WECHAT.get('MINIAPP', {})
 -     appid = wxcfg.get('appID')
 -     sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_UNLOCKING_WELFARE, data=data, miniappid=appid, minipagepath='/pages/member/activity/activity?unlocking_id={}'.format(unlocking_info.unlocking_id))
 -     return response(200, 'Unlock Member Activity Contribute Welfare Success', u'解锁会员活动投稿福利成功')
 - @logit
 - @check_admin
 - def member_activity_contribute_welfare_unlocking_list(request, administrator):
 -     user_id = request.POST.get('user_id', '')
 -     activity_id = request.POST.get('activity_id', '')
 -     contribution_id = request.POST.get('contribution_id', '')
 -     welfare_id = request.POST.get('welfare_id', '')
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     unlockings = MemberActivityContributionWelfareUnlockingInfo.objects.filter(status=True)
 -     if user_id:
 -         unlockings = unlockings.filter(user_id=user_id)
 -     if activity_id:
 -         unlockings = unlockings.filter(activity_id=activity_id)
 -     if contribution_id:
 -         unlockings = unlockings.filter(contribution_id=contribution_id)
 -     if welfare_id:
 -         unlockings = unlockings.filter(welfare_id=welfare_id)
 -     unlockings = unlockings.order_by('-pk')
 -     count = unlockings.count()
 -     unlockings, left = pagination(unlockings, page, num)
 -     unlockings = [unlocking.data for unlocking in unlockings]
 -     return response(data={
 -         'unlockings': unlockings,
 -         'left': left,
 -         'count': count,
 -     })
 - @logit
 - @check_admin
 - def member_activity_contribute_welfare_unlocking_detail(request, administrator):
 -     unlocking_id = request.POST.get('unlocking_id', '')
 -     try:
 -         unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.get(unlocking_id=unlocking_id, status=True)
 -     except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist:
 -         return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND)
 -     return response(data=unlocking.data)
 - @logit
 - @check_admin
 - @transaction.atomic
 - def member_activity_contribute_welfare_unlocking_update(request, administrator):
 -     unlocking_id = request.POST.get('unlocking_id', '')
 -     name = request.POST.get('name', '')
 -     phone = request.POST.get('phone', '')
 -     address = request.POST.get('address', '')
 -     tracking_number = request.POST.get('tracking_number', '')
 -     try:
 -         unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.select_for_update().get(unlocking_id=unlocking_id, status=True)
 -     except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist:
 -         return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND)
 -     if name:
 -         unlocking.name = name
 -     if phone:
 -         unlocking.phone = phone
 -     if address:
 -         unlocking.address = address
 -     if tracking_number:
 -         unlocking.tracking_number = tracking_number
 -     unlocking.save()
 -     return response(200, 'Update Member Activity Contribute Welfare Unblocking Success', u'更新会员活动投稿福利解锁成功')
 - @logit
 - @check_admin
 - @transaction.atomic
 - def member_activity_contribute_welfare_unlocking_delete(request, administrator):
 -     unlocking_id = request.POST.get('unlocking_id', '')
 -     try:
 -         unlocking = MemberActivityContributionWelfareUnlockingInfo.objects.select_for_update().get(unlocking_id=unlocking_id, status=True)
 -     except MemberActivityContributionWelfareUnlockingInfo.DoesNotExist:
 -         return response(MemberActivityContributionWelfareUnblockingStatusCode.ACTIVITY_CONTRIBUTION_WELFARE_UNBLOCKING_NOT_FOUND)
 -     unlocking.status = False
 -     unlocking.save()
 -     return response(200, 'Delete Member Activity Contribute Welfare Unblocking Success', u'删除会员活动投稿福利解锁成功')
 - @check_admin
 - def coupon_list(request, administrator):
 -     title = request.POST.get('title', '')
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     logs = CouponInfo.objects.filter(coupon_title__icontains=title, status=True)
 -     if start_time and end_time:
 -         start_time = datetime.strptime(start_time, '%Y%m%d')
 -         end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
 -         logs = logs.filter(created_at__range=(start_time, end_time))
 -     logs = logs.order_by('-pk')
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     logs = [log.admindata for log in logs]
 -     return response(200, 'Get CouponInfo List Success', u'获取劵列表成功', data={
 -         'logs': logs,
 -         'left': left,
 -         'count': count
 -     })
 - @check_admin
 - def coupon_detail(request, administrator):
 -     coupon_id = request.POST.get('coupon_id', '')
 -     try:
 -         log = CouponInfo.objects.get(coupon_id=coupon_id)
 -     except CouponInfo.DoesNotExist:
 -         return response(CouponStatusCode.COUPON_NOT_FOUND)
 -     log = log.admindetails
 -     return response(200, 'Get Member Activity Record Details Success', u'获取会员活动详情成功', data={
 -         'log': log,
 -     })
 - @check_admin
 - def coupon_create(request, administrator):
 -     coupon_title = request.POST.get('coupon_title', '')
 -     coupon_detail = request.POST.get('coupon_detail', '')
 -     coupon_value = int(request.POST.get('coupon_value', 0))
 -     coupon_image = request.POST.get('coupon_image', '')
 -     coupon_expire_type = int(request.POST.get('coupon_expire_type', 0))
 -     coupon_valid_period = int(request.POST.get('coupon_valid_period', 0))
 -     coupon_expire_at = request.POST.get('coupon_expire_at', '')
 -     is_coupon_admin_writeoff = int(request.POST.get('is_coupon_admin_writeoff', 1))
 -     info = CouponInfo.objects.create(
 -         brand_id=administrator.brand_id,
 -         coupon_title=coupon_title,
 -         coupon_detail=coupon_detail,
 -         coupon_value=coupon_value,
 -         coupon_image=coupon_image,
 -         coupon_expire_type=coupon_expire_type,
 -         coupon_valid_period=coupon_valid_period,
 -         is_coupon_admin_writeoff=is_coupon_admin_writeoff,
 -     )
 -     if coupon_expire_at:
 -         info.coupon_expire_at = datetime.strptime(coupon_expire_at + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
 -         info.save()
 -     return response(200, 'CouponInfo Create Success', u'劵创建成功')
 - @check_admin
 - def coupon_update(request, administrator):
 -     coupon_id = request.POST.get('coupon_id', '')
 -     coupon_title = request.POST.get('coupon_title', '')
 -     coupon_detail = request.POST.get('coupon_detail', '')
 -     coupon_value = int(request.POST.get('coupon_value', 0))
 -     coupon_image = request.POST.get('coupon_image', '')
 -     coupon_expire_type = int(request.POST.get('coupon_expire_type', 0))
 -     coupon_valid_period = int(request.POST.get('coupon_valid_period', 0))
 -     coupon_expire_at = request.POST.get('coupon_expire_at', '')
 -     is_coupon_admin_writeoff = int(request.POST.get('is_coupon_admin_writeoff', 1))
 -     try:
 -         log = CouponInfo.objects.get(coupon_id=coupon_id, status=True)
 -     except CouponInfo.DoesNotExist:
 -         return response(CouponStatusCode.COUPON_NOT_FOUND)
 -     log.brand_id = administrator.brand_id
 -     log.coupon_title = coupon_title
 -     log.coupon_detail = coupon_detail
 -     log.coupon_value = coupon_value
 -     log.coupon_image = coupon_image
 -     log.coupon_expire_type = coupon_expire_type
 -     log.coupon_valid_period = coupon_valid_period
 -     if coupon_expire_at:
 -         log.coupon_expire_at = datetime.strptime(coupon_expire_at + ' 23:59:59', '%Y-%m-%d %H:%M:%S')
 -     log.is_coupon_admin_writeoff = is_coupon_admin_writeoff
 -     log.save()
 -     return response(200, 'CouponInfo Update Success', u'劵更新成功')
 - @check_admin
 - def coupon_delete(request, administrator):
 -     coupon_id = request.POST.get('activity_id', '')
 -     try:
 -         log = CouponInfo.objects.get(coupon_id=coupon_id, status=True)
 -     except CouponInfo.DoesNotExist:
 -         return response(CouponStatusCode.COUPON_NOT_FOUND)
 -     log.status = False
 -     log.save()
 -     return response(200, 'CouponInfo Delete Success', u'劵删除成功')
 - @check_admin
 - def member_goods_list(request, administrator):
 -     title = request.POST.get('title', '')
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     logs = GoodsInfo.objects.filter(title__icontains=title, only_for_member=False).order_by('-pk')
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     logs = [log.admindata for log in logs]
 -     return response(200, 'Get Member Goods Success', u'获取会员商品成功', data={
 -         'logs': logs,
 -         'left': left,
 -         'count': count
 -     })
 - @check_admin
 - def member_goods_detail(request, administrator):
 -     good_id = request.POST.get('good_id', '')
 -     try:
 -         log = GoodsInfo.objects.get(good_id=good_id)
 -     except GoodsInfo.DoesNotExist:
 -         return response(MemberGoodStatusCode.GOOD_NOT_FOUND)
 -     log = log.admindetails
 -     return response(200, 'Get Member Goods Details Success', u'获取积分商品详情成功', data={
 -         'log': log,
 -     })
 - @check_admin
 - def member_goods_update(request, administrator):
 -     good_id = request.POST.get('good_id', '')
 -     title = request.POST.get('title', '')
 -     desc = request.POST.get('desc', '')
 -     value = int(request.POST.get('value', 0))
 -     left_num = int(request.POST.get('left_num', 0))
 -     image = request.POST.get('image_path', '')
 -     coupon_id = request.POST.get('coupon_id', '')
 -     slider_image = request.POST.get('slider_path', '')
 -     integral = int(request.POST.get('integral', 0))
 -     fee = int(request.POST.get('fee', 0))
 -     try:
 -         log = GoodsInfo.objects.get(good_id=good_id, status=True)
 -     except GoodsInfo.DoesNotExist:
 -         return response(MemberGoodStatusCode.GOOD_NOT_FOUND)
 -     log.title = title
 -     log.desc = desc
 -     log.value = value
 -     log.left_num = left_num
 -     log.image = image
 -     log.coupon_id = coupon_id
 -     log.slider_image = slider_image
 -     log.integral = integral
 -     log.fee = fee
 -     log.save()
 -     return response(200, 'GoodsInfo Update Success', u'积分商品更新成功')
 - @check_admin
 - def member_goods_create(request, administrator):
 -     good_type = int(request.POST.get('good_type', 0))
 -     title = request.POST.get('title', '')
 -     desc = request.POST.get('desc', '')
 -     value = int(request.POST.get('value', 0))
 -     left_num = int(request.POST.get('left_num', 0))
 -     image = request.POST.get('image_path', '')
 -     coupon_id = request.POST.get('coupon_id', '')
 -     slider_image = request.POST.get('slider_path', '')
 -     integral = int(request.POST.get('integral', 0))
 -     fee = int(request.POST.get('fee', 0))
 -     GoodsInfo.objects.create(
 -         brand_id=administrator.brand_id,
 -         good_type=good_type,
 -         title=title,
 -         desc=desc,
 -         value=value,
 -         left_num=left_num,
 -         image=image,
 -         coupon_id=coupon_id,
 -         slider_image=slider_image,
 -         integral=integral,
 -         fee=fee,
 -     )
 -     return response(200, 'GoodsInfo Create Success', u'积分商品创建成功')
 - @check_admin
 - def complement_code_list(request, administrator):
 -     start_time = request.POST.get('start_time', '')
 -     end_time = request.POST.get('end_time', '')
 -     type_ = request.POST.get('type', '')
 -     query = request.POST.get('query', '')
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     logs = ComplementCodeLogInfo.objects.filter(status=True)
 -     if start_time and end_time:
 -         start_time = datetime.strptime(start_time, '%Y%m%d')
 -         end_time = datetime.strptime(end_time + ' 23:59:59', '%Y%m%d %H:%M:%S')
 -         logs = logs.filter(created_at__range=(start_time, end_time))
 -     if type_ == 'todo':
 -         logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_TODO)
 -     elif type_ == 'pass':
 -         logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_PASS)
 -     elif type_ == 'refused':
 -         logs = logs.filter(audit_status=ComplementCodeLogInfo.AUDIT_REFUSED)
 -     logs = logs.order_by('audit_status', '-pk')
 -     if query:
 -         logs = logs.filter(Q(phone=query) | Q(name__icontains=query) | Q(sn=query))
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     logs = [log.data for log in logs]
 -     return response(200, 'Get Complement Code List Success', u'获取补码列表成功', data={
 -         'logs': logs,
 -         'left': left,
 -         'count': count
 -     })
 - @check_admin
 - @transaction.atomic
 - def complement_code_audit(request, administrator):
 -     brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID)
 -     admin_id = request.POST.get('admin_id', '')
 -     log_id = request.POST.get('log_id', '')
 -     audit_status = int(request.POST.get('audit_status', 0))  
 -     if audit_status not in [ComplementCodeLogInfo.AUDIT_REFUSED, ComplementCodeLogInfo.AUDIT_PASS]:
 -         return response(ComplementCodeStatusCode.COMPLEMENT_CODE_STATUS_INVALID)
 -     try:
 -         log = ComplementCodeLogInfo.objects.select_for_update().get(log_id=log_id, status=True)
 -     except ComplementCodeLogInfo.DoesNotExist:
 -         return response(ComplementCodeStatusCode.COMPLEMENT_CODE_NOT_FOUND)
 -     if log.audit_status != ComplementCodeLogInfo.AUDIT_TODO:
 -         return response(ComplementCodeStatusCode.COMPLEMENT_CODE_HAS_AUDITED)
 -     log.audit_status = audit_status
 -     log.save()
 -     
 -     if log.audit_status == ComplementCodeLogInfo.AUDIT_PASS:
 -         try:
 -             brand = BrandInfo.objects.get(brand_id=brand_id)
 -         except BrandInfo.DoesNotExist:
 -             brand = None
 -         try:
 -             model = ModelInfo.objects.get(model_id=log.model_id)
 -         except ModelInfo.DoesNotExist:
 -             model = None
 -         
 -         
 -         
 -         plaintext = '{}#{}#{}#{}#{}'.format(
 -             brand.pk if brand else 0,
 -             model.pk if model else 0,
 -             0,
 -             log.sn,
 -             tc.local_string(format='%Y%m%d')[2:],
 -         )
 -         ciphertext = get_ciphertext(plaintext, admin_id, True)
 -         log.ciphertext = ciphertext
 -         log.save()
 -         try:
 -             user = UserInfo.objects.get(user_id=log.user_id, status=True)
 -         except UserInfo.DoesNotExist:
 -             return response(UserStatusCode.USER_NOT_FOUND)
 -         
 -         data = {
 -             "first": {
 -                 "value": u'你的补码申请已通过,请点击消息绑定您的电子保修卡',
 -                 "color": "#173177"
 -             },
 -             "keyword1": {
 -                 "value": log.name,
 -                 "color": "#173177"
 -             },
 -             "keyword2": {
 -                 "value": log.model_name,
 -                 "color": "#173177"
 -             },
 -             "keyword3": {
 -                 "value": log.sn,
 -                 "color": "#173177"
 -             },
 -             "remark": {
 -                 "value": u'感谢您的使用',
 -                 "color": "#173177"
 -             }
 -         }
 -         wxcfg = WECHAT.get('MINIAPP', {})
 -         appid = wxcfg.get('appID')
 -         sendtemplatemessage(openid=user.openid, template_id=settings.TEMPLATE_ID_COMPLEMENT, data=data, miniappid=appid, minipagepath='/pages/register/consumer/consumer?q={}&marketcode=1'.format(ciphertext))
 -         return response(data={
 -             'ciphertext': ciphertext,
 -         })
 -     return response()
 - @check_admin
 - @transaction.atomic
 - def complement_code_contacted(request, administrator):
 -     log_id = request.POST.get('log_id', '')
 -     is_contacted = int(request.POST.get('is_contacted', 0))  
 -     try:
 -         log = ComplementCodeLogInfo.objects.select_for_update().get(log_id=log_id, status=True)
 -     except ComplementCodeLogInfo.DoesNotExist:
 -         return response(ComplementCodeStatusCode.COMPLEMENT_CODE_NOT_FOUND)
 -     log.is_contacted = is_contacted
 -     log.save()
 -     return response()
 - @check_admin
 - def administrator_list(request, administrator):
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
 -         return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)
 -     logs = AdministratorInfo.objects.filter(status=True).order_by('-created_at')
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     logs = [log.admindata for log in logs]
 -     return response(200, 'Get Admin List Success', u'获取后台管理员成功', data={
 -         'logs': logs,
 -         'left': left,
 -         'count': count
 -     })
 - @check_admin
 - def administrator_create(request, administrator):
 -     admin_type = request.POST.get('admin_type', '')
 -     phone = request.POST.get('phone', '')
 -     name = request.POST.get('name', '')
 -     password = request.POST.get('password', '')
 -     brand_name = request.POST.get('brand_name', '')
 -     if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
 -         return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)
 -     encryption = make_password(strip(password), settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)
 -     AdministratorInfo.objects.create(
 -         brand_id=administrator.brand_id,
 -         brand_name=brand_name or administrator.brand_name,
 -         admin_type=admin_type,
 -         phone=phone,
 -         name=name,
 -         password='',
 -         encryption=encryption,
 -     )
 -     return response(200, 'Create Admin Success', u'创建后台管理员成功')
 - @check_admin
 - def administrator_update(request, administrator):
 -     target_admin_id = request.POST.get('target_admin_id', '')
 -     admin_type = int(request.POST.get('admin_type', -1))
 -     phone = request.POST.get('phone', '')
 -     name = request.POST.get('name', '')
 -     password = request.POST.get('password', '')
 -     if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
 -         return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)
 -     target_admin = AdministratorInfo.objects.get(admin_id=target_admin_id, status=True)
 -     if admin_type != -1:
 -         target_admin.admin_type = admin_type
 -     if phone:
 -         target_admin.phone = phone
 -     if name:
 -         target_admin.name = name
 -         AdministratorLoginLogInfo.objects.filter(admin_id=target_admin_id).update(admin_name=name)
 -     if password:
 -         encryption = make_password(strip(password), settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)
 -         target_admin.encryption = encryption
 -     target_admin.save()
 -     return response(200, 'Update Admin Success', u'更新后台管理员成功')
 - @check_admin
 - def administrator_delete(request, administrator):
 -     target_admin_id = request.POST.get('target_admin_id', '')
 -     if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
 -         return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)
 -     AdministratorInfo.objects.filter(admin_id=target_admin_id).update(status=False)
 -     return response(200, 'Delete Admin Success', u'删除后台管理员成功')
 - @check_admin
 - def administrator_login_list(request, administrator):
 -     page = request.POST.get('page', 1)
 -     num = request.POST.get('num', 20)
 -     target_admin_id = request.POST.get('target_admin_id', '')
 -     if administrator.admin_type != AdministratorInfo.ADMINISTRATOR:
 -         return response(AdministratorStatusCode.ADMINISTRATOR_PERMISSION_DENIED)
 -     logs = AdministratorLoginLogInfo.objects.filter(status=True).order_by('-login_at')
 -     if target_admin_id:
 -         logs = logs.filter(admin_id=target_admin_id)
 -     count = logs.count()
 -     logs, left = pagination(logs, page, num)
 -     logs = [log.admindata for log in logs]
 -     return response(200, 'Get Administrator Login List Success', u'获取后台管理员登录日志成功', data={
 -         'logs': logs,
 -         'left': left,
 -         'count': count
 -     })
 
 
  |