浏览代码

Merge branch 'dev' into master_devma

lang 4 年之前
父节点
当前提交
0cd0234f68

+ 2 - 2
Ansjer/config_test.py

@@ -40,8 +40,8 @@ PAYPAL_CRD = {
 #     "client_id": "ATXTpWs8sajNYeU46jNs1yzpy4H_o3RRrGVIJ8Tscc312BjMx12cpRgCucfWX07a4G6GbK8hzElB04Pd",
 #     "client_secret": "EHcnfrpL1o1ev9WnlQ-C1uymeRKDoJ6li6Y0d6iHoRGj4u8Sx5lSEEH774XphP4LQZ0DrDUdvxbux0T2"
 # }
-DETECT_PUSH_DOMAIN = 'http://push.dvema.com/'
-DETECT_PUSH_DOMAINS = 'https://push.dvema.com/'
+DETECT_PUSH_DOMAIN = 'http://test.push.dvema.com/'
+DETECT_PUSH_DOMAINS = 'https://test.push.dvema.com/'
 DETECT_PUSH_DOMAIN_JIUAN = 'http://jiuan.push.dvema.com/'
 DETECT_PUSH_DOMAINS_JIUAN = 'https://jiuan.push.dvema.com/'
 # 数据库dyanamo品牌日志数据库

+ 30 - 14
Ansjer/formal_settings.py

@@ -195,6 +195,10 @@ LOGGING = {
             # 'format': '{"asctime":"%(asctime)s","thread":"%(threadName)s:%(thread)d","errorline":"%(lineno)d","errorlevel":"%(levelname)s","errorcontent":"%(message)s"}'
             'format': '%(asctime)s %(threadName)s %(thread)d %(lineno)d %(levelname)s %(message)s'
         },
+        'standard': {
+            'format': '[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] '
+                      '[%(levelname)s]- %(message)s'},
+
     },
     'filters': {
     },
@@ -206,10 +210,10 @@ LOGGING = {
         },
         'default': {
             'level': 'ERROR',
-            'class': 'logging.handlers.RotatingFileHandler',
-            'filename': BASE_DIR + '/static/log/error.log',
-            'maxBytes': 1024 * 1024 * 5,  # 5 MB
-            'backupCount': 5,
+            'class': 'logging.handlers.TimedRotatingFileHandler',
+            'filename': BASE_DIR + '/static/log/error/error.log',
+            'backupCount': 30,
+            'when': 'D',
             'formatter': 'error_format',
         },
         'console': {
@@ -217,22 +221,34 @@ LOGGING = {
             'class': 'logging.StreamHandler',
             'formatter': 'error_format'
         },
-        # 'info': {  # 向文件中输出日志
-        #     'level': 'INFO',
-        #     'class': 'logging.handlers.RotatingFileHandler',
-        #     'filename': BASE_DIR + '/static/log/print.log',  # 日志文件的位置
-        #     'maxBytes': 20 * 1024 * 1024,  # 20M大小
-        #     'backupCount': 10,
-        #     'formatter': 'verbose',
-        #     'encoding': 'utf-8'
-        # },
+        'info': {
+            'level': 'INFO',
+            'class': 'logging.handlers.TimedRotatingFileHandler',
+            'filename': BASE_DIR + '/static/log/info/info.log',
+            'backupCount': 30,
+            'when': 'D',
+            'formatter': 'standard',
+            'encoding': 'utf-8',
+        },
     },
     'loggers': {
         'django': {
             'handlers': ['default', 'console'],
             # 'handlers': ['mail_admins','default','console'],
+            # 'level': 'ERROR',
             'level': 'ERROR',
             'propagate': False
         },
+        # log 调用时需要当作参数传入
+        'info': {
+            'handlers': ['info'],
+            'level':'INFO',
+            'propagate': False
+        }
+        # 'django.db.backends': {
+        #     'handlers': ['console'],
+        #     'propagate': True,
+        #     'level': 'DEBUG',
+        # },
     }
-}
+}

+ 12 - 9
Ansjer/formal_zositech_help_weekly_task.py

@@ -19,28 +19,31 @@ res = requests.post(url=login_url, data=data)
 res = res.json()
 
 if res['result_code'] == 0:
-    isbool = True
-    while isbool:
+    request_times = 0
+    while request_times < 5:
         try:
             statistics_url = base_url + 'faq/synZositechHelp'
-            zhcnDatares = requests.get(
-                url='https://mobileapphelp.zendesk.com/api/v2/help_center/articles/embeddable_search.json?locale=zh-cn&section=null&origin=web_widget', timeout=1).text
-
-            enusDatares = requests.get(
-                url='https://mobileapphelp.zendesk.com/api/v2/help_center/articles/embeddable_search.json?locale=en-us&section=null&origin=web_widget', timeout=1).text
+            # zh_url = 'https://mobileapphelp.zendesk.com/api/v2/help_center/articles/embeddable_search.json?locale=zh-cn&section=null&origin=web_widget'
+            zh_url = 'https://mobileapphelp.zendesk.com/api/v2/help_center/zh-cn/articles.json?page%5Bsize%5D=100'
+            zhcnDatares = requests.get(url=zh_url, timeout=10).text
 
+            en_url = 'https://mobileapphelp.zendesk.com/api/v2/help_center/en-us/articles.json?page%5Bsize%5D=100'
+            # en_url = 'https://mobileapphelp.zendesk.com/api/v2/help_center/articles/embeddable_search.json?locale=en-us&section=null&origin=web_widget'
+            enusDatares = requests.get(url=en_url, timeout=10).text
             data = {
                 'token': res['result']['access_token'],
                 'zhresults': zhcnDatares,
                 'enresults': enusDatares
             }
-            isbool = False
             res = requests.post(url=statistics_url, data=data)
 
         except Exception as e:
-            isbool=True
+            print(e)
+            request_times += 1
+            print(request_times)
             time.sleep(3)
 
+print('success')
 
 
 

+ 17 - 19
Ansjer/test_settings.py

@@ -203,9 +203,7 @@ LOGGING = {
         'standard': {
             'format': '[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] '
                       '[%(levelname)s]- %(message)s'},
-        'simple': {  # 简单格式
-            'format': '%(levelname)s %(message)s'
-        },
+
     },
     'filters': {
     },
@@ -217,25 +215,25 @@ LOGGING = {
         },
         'default': {
             'level': 'ERROR',
-            'class': 'logging.handlers.RotatingFileHandler',
-            'filename': BASE_DIR + '/static/log/error.log',
-            'maxBytes': 1024 * 1024 * 5,  # 5 MB
-            'backupCount': 5,
+            'class': 'logging.handlers.TimedRotatingFileHandler',
+            'filename': BASE_DIR + '/static/log/error/error.log',
+            'backupCount': 30,
+            'when': 'D',
             'formatter': 'error_format',
         },
         'console': {
             'level': 'ERROR',
             'class': 'logging.StreamHandler',
             'formatter': 'error_format'
-        },# 输出info日志
+        },
         'info': {
             'level': 'INFO',
-            'class': 'logging.handlers.RotatingFileHandler',
-            'filename': BASE_DIR + '/static/log/info.log',
-            'maxBytes': 1024 * 1024 * 5,
-            'backupCount': 5,
+            'class': 'logging.handlers.TimedRotatingFileHandler',
+            'filename': BASE_DIR + '/static/log/info/info.log',
+            'backupCount': 30,
+            'when': 'D',
             'formatter': 'standard',
-            'encoding': 'utf-8',  # 设置默认编码
+            'encoding': 'utf-8',
         },
     },
     'loggers': {
@@ -247,15 +245,15 @@ LOGGING = {
             'propagate': False
         },
         # log 调用时需要当作参数传入
-        'log': {
-            'handlers': ['info', 'console', 'default'],
-            'level': 'INFO',
-            'propagate': True
-        },
+        'info': {
+            'handlers': ['info'],
+            'level':'INFO',
+            'propagate': False
+        }
         # 'django.db.backends': {
         #     'handlers': ['console'],
         #     'propagate': True,
         #     'level': 'DEBUG',
         # },
     }
-}
+}

+ 13 - 11
Ansjer/test_zositech_help_weekly_task.py

@@ -15,32 +15,34 @@ data = {
     'userName': username,
     'userPwd': password
 }
-res = requests.post(url=login_url, data=data)
+res = requests.post(url=login_url, data=data, timeout=10)
 res = res.json()
 
 if res['result_code'] == 0:
-    isbool = True
-    while isbool:
+    request_times = 0
+    while request_times < 5:
         try:
             statistics_url = base_url + 'faq/synZositechHelp'
-            zhcnDatares = requests.get(
-                url='https://mobileapphelp.zendesk.com/api/v2/help_center/articles/embeddable_search.json?locale=zh-cn&section=null&origin=web_widget', timeout=1).text
-
-            enusDatares = requests.get(
-                url='https://mobileapphelp.zendesk.com/api/v2/help_center/articles/embeddable_search.json?locale=en-us&section=null&origin=web_widget', timeout=1).text
+            # zh_url = 'https://mobileapphelp.zendesk.com/api/v2/help_center/articles/embeddable_search.json?locale=zh-cn&section=null&origin=web_widget'
+            zh_url = 'https://mobileapphelp.zendesk.com/api/v2/help_center/zh-cn/articles.json?page%5Bsize%5D=100'
+            zhcnDatares = requests.get(url=zh_url, timeout=10).text
 
+            en_url = 'https://mobileapphelp.zendesk.com/api/v2/help_center/en-us/articles.json?page%5Bsize%5D=100'
+            # en_url = 'https://mobileapphelp.zendesk.com/api/v2/help_center/articles/embeddable_search.json?locale=en-us&section=null&origin=web_widget'
+            enusDatares = requests.get(url=en_url, timeout=10).text
             data = {
                 'token': res['result']['access_token'],
                 'zhresults': zhcnDatares,
                 'enresults': enusDatares
             }
-            isbool = False
             res = requests.post(url=statistics_url, data=data)
 
         except Exception as e:
-            isbool=True
+            print(e)
+            request_times += 1
+            print(request_times)
             time.sleep(3)
 
-
+print('success')
 
 

+ 77 - 25
Controller/CloudStorage.py

@@ -38,10 +38,13 @@ from pyfcm import FCMNotification
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
     SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN, APNS_MODE, APNS_CONFIG, BASE_DIR, \
     JPUSH_CONFIG, FCM_CONFIG, OAUTH_ACCESS_TOKEN_SECRET
+from Controller.CheckUserData import DataValid
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
     ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel, \
-    Unused_Uid_Meal, UIDMainUser
+    Unused_Uid_Meal, UIDMainUser, UserModel
+from Object.AWS.S3Email import S3Email
 from Object.AliPayObject import AliPayObject
+from Object.AliSmsObject import AliSmsObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
@@ -302,7 +305,7 @@ class CloudStorageView(View):
         print(channel)
         print(uid)
         now_time = int(time.time())
-        ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time). \
+        ubqs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time, channel=channel). \
                    values("bucket__mold", "bucket__bucket", "bucket__endpoint",
                           "bucket__region", "endTime").order_by('addTime')[:1]
         if ubqs.exists():
@@ -395,7 +398,7 @@ class CloudStorageView(View):
         if dv_qs[0]['vodPrimaryUserID'] != userID:
             return response.json(10034)
         now_time = int(time.time())
-        bv_qs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time).values('bucket_id').order_by('addTime')
+        bv_qs = UID_Bucket.objects.filter(uid=uid, endTime__gte=now_time ,channel=channel).values('bucket_id').order_by('addTime')
         if not bv_qs.exists():
             return response.json(10030)
         vh_qs = VodHlsModel.objects.filter \
@@ -460,7 +463,7 @@ class CloudStorageView(View):
         print('channel:')
         print(channel)
         now_time = int(time.time())
-        ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, endTime__gte=now_time). \
+        ubqs = UID_Bucket.objects.filter(uid=UID, endTime__gte=now_time, channel=channel). \
                    values("bucket__mold", "bucket__bucket", "bucket__endpoint",
                           "bucket__region", "status", "bucket__storeDay", "bucket__id").order_by('addTime')[:1]
         if ubqs.exists():
@@ -786,7 +789,8 @@ class CloudStorageView(View):
                     #     UIDMainUser.objects.create(**uid_main_dict)
 
                     order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
-                    sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
+                    datetime = time.strftime("%Y-%m-%d", time.localtime())
+                    sys_msg_text_list = ['尊重的客户,您的'+UID+'设备在'+datetime+'已成功购买云存套餐,特此通知。', 'Dear customer, your '+UID+' device has successfully purchased the cloud storage package at '+datetime+', hereby notified.']
                     self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
                     red_url = "{SERVER_DOMAIN_SSL}web/paid2/success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                     if lang != 'cn':
@@ -806,7 +810,6 @@ class CloudStorageView(View):
         PayerID = request_dict.get('PayerID', None)
         orderID = request_dict.get('orderID', None)
         lang = request_dict.get('lang', 'en')
-        file_handle=open('/web/www/AnsjerFormal/static/log/info.log',mode='w')
         try:
             order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
 
@@ -823,8 +826,6 @@ class CloudStorageView(View):
             payres = payment.execute({"payer_id": PayerID})
             print(payres)
             if not payres:
-                file_handle.write('----pal----payres')
-                file_handle.write(payres)
                 red_url = "{SERVER_DOMAIN_SSL}web/paid2/fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                 if lang != 'cn':
                     red_url = "{SERVER_DOMAIN_SSL}web/paid2/en_fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
@@ -894,7 +895,10 @@ class CloudStorageView(View):
                 #     UIDMainUser.objects.create(**uid_main_dict)
 
                 order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
-                sys_msg_text_list = ['成功购买云存','Successful purchase of cloud storage']
+                datetime = time.strftime("%Y-%m-%d", time.localtime())
+                sys_msg_text_list = ['尊重的客户,您的' + UID + '设备在' + datetime + '已成功购买云存套餐,特此通知。',
+                                     'Dear customer, your ' + UID + ' device has successfully purchased the cloud storage package at ' + datetime + ', hereby notified.']
+
                 self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
 
                 # return response.json(0)
@@ -905,8 +909,6 @@ class CloudStorageView(View):
                 return HttpResponseRedirect(red_url)
         except Exception as e:
             print(repr(e))
-            file_handle.write('----pal----repr')
-            file_handle.write(repr(e))
             if order_qs:
                 order_qs.update(status=10)
             red_url = "{SERVER_DOMAIN_SSL}web/paid2/fail.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
@@ -996,7 +998,9 @@ class CloudStorageView(View):
                     #     UIDMainUser.objects.create(**uid_main_dict)
 
                     order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
-                    sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
+                    datetime = time.strftime("%Y-%m-%d", time.localtime())
+                    sys_msg_text_list = ['尊重的客户,您的' + UID + '设备在' + datetime + '已成功购买云存套餐,特此通知。',
+                                         'Dear customer, your ' + UID + ' device has successfully purchased the cloud storage package at ' + datetime + ', hereby notified.']
                     self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list)
                     return HttpResponse(pay.xml_to_dict({'return_code': 'SUCCESS', 'return_msg': 'OK'}))
             else:
@@ -1275,7 +1279,9 @@ class CloudStorageView(View):
                 #     }
                 #     UIDMainUser.objects.create(**uid_main_dict)
 
-                sys_msg_text_list = ['成功购买云存', 'Successful purchase of cloud storage']
+                datetime = time.strftime("%Y-%m-%d", time.localtime())
+                sys_msg_text_list = ['尊重的客户,您的' + uid + '设备在' + datetime + '已成功购买云存套餐,特此通知。',
+                                     'Dear customer, your ' + uid + ' device has successfully purchased the cloud storage package at ' + datetime + ', hereby notified.']
                 # return response.json(0)
                 returnurl = "{SERVER_DOMAIN_SSL}cloudstorage/payOK?lang={lang}".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL,lang=lang)
                 if pay_type == 10:
@@ -1285,7 +1291,9 @@ class CloudStorageView(View):
                         do_time=nowTime
                     )
                     returnurl = "{SERVER_DOMAIN_SSL}cloudstorage/payOK?paytype=10&lang={lang}".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL,lang=lang)
-                    sys_msg_text_list = ['成功体验云存', 'Successful experience of cloud storage']
+                    datetime = time.strftime("%Y-%m-%d", time.localtime())
+                    sys_msg_text_list = ['尊重的客户,您的' + uid + '设备在' + datetime + '已成功体验云存,特此通知。',
+                                         'Dear customers, your '+uid+' device has successfully experienced cloud storage at '+datetime+', hereby notified.']
 
                 if pay_type == 11:
                     update_dict = {}
@@ -1293,7 +1301,10 @@ class CloudStorageView(View):
                     update_dict['order'] = orderID
                     CDKcontextModel.objects.filter(cdk=cdk).update(**update_dict)
                     returnurl = "{SERVER_DOMAIN_SSL}cloudstorage/payOK?paytype=11&lang={lang}".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL,lang=lang)
-                    sys_msg_text_list = ['成功兑换云存', 'Successful exchange of cloud storage']
+
+                    datetime = time.strftime("%Y-%m-%d", time.localtime())
+                    sys_msg_text_list = ['尊重的客户,您的' + uid + '设备在' + datetime + '已成功兑换云存,特此通知。',
+                                         'Dear customer, your '+uid+' device has been redeemed for cloud deposit at '+datetime+', hereby notified.']
 
 
                 self.do_vod_msg_Notice(uid, channel, userID, lang, sys_msg_text_list)
@@ -1437,20 +1448,38 @@ class CloudStorageView(View):
             create_data = {'userID_id': userID, 'msg': sys_msg_text, 'addTime': nowTime,
                            'updTime': nowTime, 'uid': uid, 'eventType': 0}
             SysMsgModel.objects.create(**create_data)
-            self.pushApp(nowTime, uid, channel, sys_msg_text)
+
+            user_qs = Device_User.objects.filter(userID=userID)
+            if user_qs.exists():
+                user = user_qs[0]
+                username = user.username
+                data_valid = DataValid()
+                if data_valid.email_validate(username):
+                    S3Email.faEmail(sys_msg_text,username)
+                elif data_valid.mobile_validate(username):
+                    params = u'{"devname":"' + uid + '","submittime":"' + time.strftime("%Y-%m-%d",time.localtime()) + '"}'
+                    self.sendMessage(username, params, 'SMS_217405528')
+
+                self.pushApp(nowTime, uid, channel, sys_msg_text)
+
 
             logger.info('出去了')
         except Exception as e:
             return repr(e)
-    # 云存到期续费提醒   提前1天
+    # 云存到期续费提醒   提前3
     def do_vod_msg_end(self, request_dict):
         response = ResponseObject()
         now_time = int(time.time())
+        # 前7天提示一次
+        list = UID_Bucket.objects.filter(Q(endTime__lte=(now_time - 3600 * 168)) & Q(endTime__gt=now_time - 3600 * 72)).values('id','uid','bucket__area','channel','endTime')
+        self.do_vod_msg(now_time,list)
 
-        list = UID_Bucket.objects.filter(Q(endTime__lte=(now_time - 3600 * 24)) & Q(endTime__gt=now_time)).values('id',
-                                                                                                                  'uid',
-                                                                                                                  'bucket__area','channel')
+        # 前3天提示一次
+        list = UID_Bucket.objects.filter(Q(endTime__lte=(now_time - 3600 * 72)) & Q(endTime__gt=now_time)).values('id','uid','bucket__area','channel','endTime')
+        self.do_vod_msg(now_time,list)
+        return response.json(0)
 
+    def do_vod_msg(self, now_time, list):
         uq_list = []
         ids = []
         for ub in list:
@@ -1462,9 +1491,12 @@ class CloudStorageView(View):
             for oo in oqlist:
                 if ub['id'] == oo['uid_bucket_id']:
                     if ub['bucket__area'] == 'cn':
-                        sys_msg_text = "云存即将过期,请您注意!"
+                        sys_msg_text = "尊重的客户,您" + ub['uid'] + "设备的云存套餐将在" + time.strftime("%Y-%m-%d",
+                                                                                           ub['endTime']) + "到期,特此通知。"
                     else:
-                        sys_msg_text = "Cloud storage is about to expire, please pay attention!"
+                        sys_msg_text = "Dear customer, the cloud storage package of your " + ub[
+                            'uid'] + " device will expire in " + time.strftime("%Y-%m-%d",
+                                                                               ub['endTime']) + ", hereby notified."
                     uq_list.append(SysMsgModel(
                         userID_id=oo['userID_id'],
                         addTime=now_time,
@@ -1474,13 +1506,25 @@ class CloudStorageView(View):
                         msg=sys_msg_text,
                         status=0
                     ))
-                    self.pushApp(now_time, ub['uid'], ub['channel'], sys_msg_text)
+                    user_qs = Device_User.objects.filter(userID=oo['userID_id'])
+                    if user_qs.exists():
+                        user = user_qs[0]
+                        username = user.username
+                        data_valid = DataValid()
+
+                        if data_valid.email_validate(username):
+                            S3Email.faEmail(sys_msg_text, username)
+                        elif data_valid.mobile_validate(username):
+                            params = u'{"devname":"' + ub['uid'] + '","submittime":"' + time.strftime("%Y-%m-%d",
+                                                                                                      ub[
+                                                                                                          'endTime']) + '"}'
+                            self.sendMessage(username, params, 'SMS_217425550')
+
+                        self.pushApp(now_time, ub['uid'], ub['channel'], sys_msg_text)
 
         SysMsgModel.objects.bulk_create(uq_list)
 
 
-        return response.json(0)
-
     def pushApp(self, nowTime, uid, channel, sys_msg_text):
         n_time = nowTime
 
@@ -1598,6 +1642,14 @@ class CloudStorageView(View):
                 print(res)
                 return res.status_code
 
+    def sendMessage(self, phone , params, temp_msg):
+            # 购买成功
+            sign_ms = 'Ansjer'
+            # 发送手机验证码
+            aliSms = AliSmsObject()
+            res = aliSms.send_code_sms_cloud(phone=phone, params = params, sign_name=sign_ms,
+                                       temp_msg=temp_msg)
+
 
 
 # 删除过期云存播放列表

+ 16 - 0
Controller/DeviceShare.py

@@ -56,6 +56,8 @@ class DeviceShareView(View):
                     return self.do_query_user(userID, request_dict, response)
                 elif operation == 'deleteUser':
                     return self.do_delete_user(userID, request_dict, response)
+                elif operation == 'deleteUserV2':
+                    return self.do_delete_userV2(userID, request_dict, response)
                 else:
                     return response.json(414)
             else:
@@ -244,3 +246,17 @@ class DeviceShareView(View):
                 return response.json(0)
         else:
             return response.json(444, 'id')
+
+    def do_delete_userV2(self, userID, request_dict, response):
+        ids = request_dict.get('ids', None)
+        if id:
+            try:
+                # redisObj = RedisObject(db=8)
+                # redisObj.del_data(key='uid_qs_' + userID)
+                Device_Info.objects.filter(id__in=ids, primaryUserID=userID).update(isExist=0)
+            except Exception as e:
+                return response.json(10, repr(e))
+            else:
+                return response.json(0)
+        else:
+            return response.json(444, 'id')

+ 2 - 2
Controller/FAQController.py

@@ -360,7 +360,7 @@ class FAQView(View):
 
         ZositechHelpModel.objects.all().delete()
 
-        for data in zhresults['results']:
+        for data in zhresults['articles']:
             labname = ""
             if data['label_names']:
                 for lab in data['label_names']:
@@ -375,7 +375,7 @@ class FAQView(View):
                 'origin': 'web_widget',
                 'content': json.dumps(data).replace("\'", "\"").replace("XX??????XX", "\'")
             })
-        for data in enresults['results']:
+        for data in enresults['articles']:
             labname = ""
             if data['label_names']:
                 for lab in data['label_names']:

+ 2 - 1
Controller/OrderContrller.py

@@ -110,7 +110,7 @@ class OrderView(View):
                                                               "updTime", "paypal", "rank__day", "payType",
                                                               "rank__price", "status",
                                                               "rank__content", "rank__title", "rank__currency",
-                                                              "rank_id")
+                                                              "rank_id","rank__expire")
         order_list = list(order_ql)
         data = []
         nowTime = int(time.time())
@@ -128,6 +128,7 @@ class OrderView(View):
                     d['did'] = did['id']
                     d['Type'] = did['Type']
                     data.append(d)
+            d['rank__expire_unit'] = '月' if lang == 'cn' else 'month'
         return response.json(0, {'data': data, 'count': count})
 
     # admins ^^^^^^^^^^^^

+ 18 - 21
Controller/SerialNumberController.py

@@ -60,36 +60,33 @@ class SerialNumberView(View):
                 return response.json(404)
 
     def do_create(self, request_dict, response):
-        quantity = int(request_dict.get('quantity', None))
-        p2p = int(request_dict.get('p2p', None))
+        quantity = int(request_dict.get('quantity', 0))
+        p2p = int(request_dict.get('p2p', 0))
 
         if not quantity:
             return response.json(444)
-        start_time = time.strftime('%Y-%m-%d %H:%M:%S')
-        print('start create ' + start_time)
-        tmp = []
-        algorithm = AlgorithmBaseOn35()
 
-        for i in range(quantity):
+        try:
             try:
                 sum = SerialNumberModel.objects.last().id
             except:
                 sum = 0
-            serial_number = algorithm.getLetter(sum)
-            tmp_len = 6 - len(serial_number)
-            # 前面补0
-            for j in range(tmp_len):
-                serial_number = '0' + serial_number
-            data = []
+            serial_number_bulk = []
             now_time = int(time.time())
-            data.append(SerialNumberModel(serial_number=serial_number, add_time=now_time, p2p=p2p))
-            SerialNumberModel.objects.bulk_create(data)
-            data.clear()
-            start_time = time.strftime('%Y-%m-%d %H:%M:%S')
-            print('start create ' + start_time)
-            redis = RedisObject()
-            redis.del_data(key='serial_number_count')
-        return response.json(0)
+            algorithm = AlgorithmBaseOn35()
+            for i in range(quantity):
+                serial_number = algorithm.getLetter(sum)
+                sum += 1    # sum每次递增1
+                # 前面补0至六位
+                serial_number = (6-len(serial_number))*'0' + serial_number
+                serial_number_bulk.append(SerialNumberModel(serial_number=serial_number, add_time=now_time, p2p=p2p))
+            # 开启事务写入
+            with transaction.atomic():
+                SerialNumberModel.objects.bulk_create(serial_number_bulk)
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
 
     # 提供给pc端获取序列号
     def do_get_serial_number(self, request_dict, response):

+ 2 - 2
Controller/shareUserPermission.py

@@ -46,7 +46,7 @@ class searchUserView(View):
         else:
             User = Device_User.objects.filter(**fieldDict).order_by('-data_joined')
         if User.exists():
-            ddUser = User[0].device_info_set.all()
+            ddUser = User[0].device_info_set.filter(isShare=False)
             sqlJSON = serializers.serialize('json', User)
             sqlList = json.loads(sqlJSON)
             if ddUser:
@@ -107,7 +107,7 @@ class searchUserView(View):
                 for k, v in enumerate(sqlDict["datas"]):
                     for val in device_user_res:
                         if v['pk'] == val.userID:
-                            dvqs = val.device_info_set.all()
+                            dvqs = val.device_info_set.filter(isShare=False)
                             device_info_list = CommonService.qs_to_dict(dvqs)
                             # device_user关联到device_info
                             sqlDict["datas"][k]['device_info'] = device_info_list

+ 3 - 3
Model/models.py

@@ -651,7 +651,7 @@ class OssCrdModel(models.Model):
 
 class StsCrdModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
-    uid = models.CharField(max_length=20, verbose_name='设备UID')
+    uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
     data = models.TextField(verbose_name='设备sts')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
@@ -671,7 +671,7 @@ class StsCrdModel(models.Model):
 
 class UID_Bucket(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
-    uid = models.CharField(max_length=20, verbose_name='设备UID')
+    uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
     bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, verbose_name='存储空间')
     status = models.SmallIntegerField(default=0, verbose_name='状态[0:开启,1:关闭]')
@@ -689,7 +689,7 @@ class UID_Bucket(models.Model):
 
 class Unused_Uid_Meal(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
-    uid = models.CharField(max_length=20, verbose_name='设备UID')
+    uid = models.CharField(max_length=20, verbose_name='设备UID', db_index=True)
     channel = models.SmallIntegerField(default=0, verbose_name='通道')
     bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, verbose_name='存储空间')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)

+ 52 - 0
Object/AWS/S3Email.py

@@ -0,0 +1,52 @@
+import smtplib
+import email.utils
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+
+class S3Email:
+
+   def __init__(self, *args, **kwargs):
+       SENDER = 'rdpublic@ansjer.com'  # 邮箱名
+       SENDERNAME = 'rdpublic@ansjer.com'
+       USERNAME_SMTP = "AKIA2E67UIMD6MOSFKXW"  # 带有邮件权限的 IAM 帐号
+       PASSWORD_SMTP = "BHuQ6EQTtFK4qh46o9omO9ZzO3NXzjk/JCWLXnVFmqzM"  # 带有邮件权限的 IAM 密码
+       PORT = 587
+       HOST = "email-smtp.us-east-1.amazonaws.com"
+
+
+   def faEmail(self, content ,RECIPIENT):
+
+        SUBJECT = 'Amazon SES Error (Python smtplib)'
+        BODY_TEXT = ("Amazon SES Test\r\n"
+                     "This email was sent through the Amazon SES SMTP "
+                     "Interface using the Python smtplib package."
+                     )
+        BODY_HTML = """<html>
+        <head></head>
+        <body>
+          <h1>{}<h1>
+        </body>
+        </html>
+                    """.format(content)
+
+        msg = MIMEMultipart('alternative')
+        msg['Subject'] = SUBJECT
+        msg['From'] = email.utils.formataddr((self.SENDERNAME, self.SENDER))
+        msg['To'] = RECIPIENT
+        part1 = MIMEText(BODY_TEXT, 'plain')
+        part2 = MIMEText(BODY_HTML, 'html')
+        msg.attach(part1)
+        msg.attach(part2)
+
+        try:
+            server = smtplib.SMTP(self.HOST, self.PORT)
+            server.ehlo()
+            server.starttls()
+            server.ehlo()
+            server.login(self.USERNAME_SMTP, self.PASSWORD_SMTP)
+            server.sendmail(self.SENDER, RECIPIENT, msg.as_string())
+            server.close()
+        except Exception as e:
+            print("Error: ", e)
+        else:
+            print("Email sent!")

+ 20 - 0
Object/AliSmsObject.py

@@ -76,6 +76,26 @@ class AliSmsObject(object):
         # {"Message":"OK","RequestId":"985FA027-C887-4186-A8F5-B6B8F3D123DB","BizId":"973407842937195533^0","Code":"OK"}
         # code = isv.BUSINESS_LIMIT_CONTROL 一分钟只能发一次
         return res_json
+
+        # 发送验证码
+
+    def send_code_sms_cloud(self, phone, params, sign_name, temp_msg):
+        __business_id = uuid.uuid1()
+        # print(__business_id)
+        # params = "{\"code\":\"{"+str(code)+"}\"}"
+        params = params
+        # params = u'{"name":"wqb","code":"12345678","address":"bz","phone":"13000000000"}'
+        # 签名
+        # sign_name = 'Ansjer'
+        # 模板信息
+        # temp_msg = 'SMS_151600991'
+        res = self.do_send_sms(__business_id, phone, sign_name, temp_msg, params)
+        # print(send_sms(__business_id, "13119657713", "云通信测试", "SMS_5250008", params))
+        res_json = json.loads(res.decode('utf-8'))
+        print(res_json)
+        # {"Message":"OK","RequestId":"985FA027-C887-4186-A8F5-B6B8F3D123DB","BizId":"973407842937195533^0","Code":"OK"}
+        # code = isv.BUSINESS_LIMIT_CONTROL 一分钟只能发一次
+        return res_json
 #
 # aliSms = AliSmsObject()
 # aliSms.send_sign_in_sms(phone=13119657713,code=123456)

+ 1 - 1
Service/AlgorithmService.py

@@ -7,7 +7,7 @@ class AlgorithmBaseOn35:
 
     letters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
-               'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
+               'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
                'U', 'V', 'W', 'X', 'Y', 'Z']
 
     len1 = len(letters)

+ 1 - 0
Service/TemplateService.py

@@ -53,6 +53,7 @@ class TemplateService:
             'deviceShare/showShareInfo',
             'deviceShare/confirm',
             'deviceShare/deleteUser',
+            'deviceShare/deleteUserV2',
             'order/querylist',
             'detect/changeStatus',
             # 'notify/push',