Эх сурвалжийг харах

Merge branch 'dev' into lang

lang 3 жил өмнө
parent
commit
78979f33e1

+ 1 - 1
AdminController/ServeManagementController.py

@@ -827,7 +827,7 @@ class serveManagement(View):
 
             list_data = []
             count = uid_bucket_qs.count()
-            uid_bucket_qs = uid_bucket_qs[(page - 1) * line:page * line]
+            uid_bucket_qs = uid_bucket_qs.order_by('-addTime')[(page - 1) * line:page * line]
 
             for uid_bucket in uid_bucket_qs:
                 data = {

+ 11 - 9
AdminController/UserManageController.py

@@ -341,11 +341,12 @@ class UserManagement(View):
                     device_user_qs = Device_User.objects.filter(userEmail__contains=userEmail)
                 if not device_user_qs.exists():
                     return response.json(0)
+                total = len(device_user_qs)
+                device_users = device_user_qs[(page - 1) * line:page * line]
 
             else:
-                device_user_qs = Device_User.objects.filter()  # 查询全部
-            total = len(device_user_qs)
-            device_users = device_user_qs[(page - 1) * line:page * line]
+                total = Device_User.objects.filter().count()
+                device_users = Device_User.objects.filter()[(page - 1) * line:page * line]
             user_list = []
             for device_user in device_users:
                 role = device_user.role.first()
@@ -376,14 +377,15 @@ class UserManagement(View):
         password = request_dict.get('password', None)
         isEdit = request_dict.get('isEdit', None)
 
-        if not all([username, userEmail, roleName, password]):
-            return response.json(444)
-
         # 校验用户名,邮箱,密码是否符合规则
         dataValid = DataValid()
-        if not dataValid.name_validate(username) or not dataValid.email_validate(userEmail) \
-                or not dataValid.password_validate(password):
-            return response.json(444)
+        if not username or not dataValid.name_validate(username):
+            return response.json(444, {'Parameter error': 'username'})
+        if userEmail and not dataValid.email_validate(userEmail):
+            return response.json(444, {'Parameter error': 'userEmail'})
+        if not isEdit:  # 添加用户需要输入密码
+            if not password or not dataValid.password_validate(password):
+                return response.json(444, {'Parameter error': 'password'})
 
         try:
             if isEdit:  # 编辑用户信息

+ 7 - 0
Ansjer/config.py

@@ -136,6 +136,13 @@ AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA = 'ap-southeast-1'
 AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE = 'eu-west-1'
 AWS_IOT_SES_ACCESS_FOREIGN_ROLE = 'arn:aws:iam::697864307463:role/Ansjer_Iot_Admin'
 
+# Iot 获取上传S3日志 key国外
+AWS_IOT_GETS3_PULL_FOREIGN_ID = 'AKIA2E67UIMDZSLTUD22'
+AWS_IOT_GETS3_PULL_FOREIGN_SECRET = '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'
+
+# Iot 获取上传S3日志 key国内
+AWS_IOT_GETS3_PULL_CHINA_ID = 'AKIA2MMWBR4D3F4IEZE5'
+AWS_IOT_GETS3_PULL_CHINA_SECRET = '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'
 
 # Iot Core国内
 AWS_IOT_SES_ACCESS_CHINA_ID = 'AKIA2MMWBR4DUUYPCFNJ'

+ 8 - 8
Ansjer/us_config/config_formal.py

@@ -19,16 +19,16 @@ SERVER_DOMAIN = 'http://www.dvema.com/'
 DOMAIN_HOST = 'www.dvema.com'
 SERVER_HOST = 'backendserver.5tgle2.0001.usw1.cache.amazonaws.com'
 PUSH_REDIS_ADDRESS = 'pushredis.5tgle2.0001.usw1.cache.amazonaws.com'
-# PAYPAL_CRD = {
-#     "mode": "live",  # sandbox or live
-#     "client_id": "AdSRd6WBn-qLl9OiQHQuNYTDFSx0ZX0RUttqa58au8bPzoGYQUrt8bc6591RmH8_pEAIPijdvVYSVXyI",
-#     "client_secret": "ENT-J08N3Fw0B0uAokg4RukljAwO9hFHPf8whE6-Dwd8oBWJO8AWMgpdTKpfB1pOy89t4bsFEzMWDowm"
-# }
 PAYPAL_CRD = {
-    "mode": "sandbox",  # sandbox or live
-    "client_id": "AVLoQVq3xHZ6FrF4mxHwlCPgVBAw4Fw5RtMkuxmYd23SkUTIY643n2g3KdK-Al8wV05I28lza5uoQbAA",
-    "client_secret": "EO8kRc8yioDk0i2Qq-QMcVFfwkmyMJorTvBSLDTnxDJJ_wb9VoM_0jkUY9iEng2Flp1ze8wQOGpH5nB2"
+    "mode": "live",  # sandbox or live
+    "client_id": "AdSRd6WBn-qLl9OiQHQuNYTDFSx0ZX0RUttqa58au8bPzoGYQUrt8bc6591RmH8_pEAIPijdvVYSVXyI",
+    "client_secret": "ENT-J08N3Fw0B0uAokg4RukljAwO9hFHPf8whE6-Dwd8oBWJO8AWMgpdTKpfB1pOy89t4bsFEzMWDowm"
 }
+# PAYPAL_CRD = {
+#     "mode": "sandbox",  # sandbox or live
+#     "client_id": "AVLoQVq3xHZ6FrF4mxHwlCPgVBAw4Fw5RtMkuxmYd23SkUTIY643n2g3KdK-Al8wV05I28lza5uoQbAA",
+#     "client_secret": "EO8kRc8yioDk0i2Qq-QMcVFfwkmyMJorTvBSLDTnxDJJ_wb9VoM_0jkUY9iEng2Flp1ze8wQOGpH5nB2"
+# }
 
 DETECT_PUSH_DOMAIN = 'http://push.dvema.com/'
 DETECT_PUSH_DOMAINS = 'https://push.dvema.com/'

+ 1 - 0
Ansjer/us_config/formal_settings.py

@@ -24,6 +24,7 @@ MIDDLEWARE = [
     'django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
+    'MiddleWare.requestRecord.RequestRecordMiddleware',  # 记录请求信息
     # 'django.middleware.csrf.CsrfViewMiddleware',
     'corsheaders.middleware.CorsPostCsrfMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',

+ 4 - 1
Controller/CDKController.py

@@ -12,6 +12,7 @@
 @Contact: chanjunkai@163.com
 """
 import json
+import logging
 import time
 import urllib
 import uuid
@@ -123,7 +124,8 @@ class CDKView(View):
             searchVal = order.strip()
         elif is_activate:
             searchVal = is_activate.strip()
-
+        logger = logging.getLogger('info')
+        logger.info('CDK测试打印1: {}'.format(time.localtime(time.time())))
         if page and line:
             cdk_qs = CDKcontextModel.objects.filter().all()  # values('cdk','create_time','valid_time','is_activate','rank__id','order__id')
             if searchVal:
@@ -153,6 +155,7 @@ class CDKView(View):
                 'datas': list(cdk_qs),
                 'count': count
             }
+            logger.info('CDK测试打印2: {}'.format(time.localtime(time.time())))
             return response.json(0, res)
         else:
             return response.json(444, 'page,line')

+ 33 - 11
Controller/EquipmentManager.py

@@ -8,7 +8,7 @@ import requests
 import simplejson as json
 from django.utils import timezone
 from Model.models import Device_User, Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel, \
-    UIDCompanySerialModel, iotdeviceInfoModel, UIDMainUser
+    UIDCompanySerialModel, iotdeviceInfoModel, UIDMainUser, UidChannelSetModel
 from django.db.models import Q
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -253,8 +253,16 @@ def modifyUserEquipmentInterface(request):
                 }
                 UidSetModel.objects.create(**uid_set_create_dict)
             Device_Info.objects.filter(UID=uid).update(NickName=nickname)
-            # redisObj = RedisObject(db=8)
-            # redisObj.del_data(key='uid_qs_' + userID)
+            if deviceData.__contains__('NickName') and us_qs[0].is_alexa == 1:
+                encrypt_pwd = ''
+                if deviceData.__contains__('View_Password'):
+                    encrypt_pwd = deviceData['View_Password']
+                # 请求Alexa服务器更新事件网关
+                url = 'https://www.zositech.xyz/deviceStatus/addOrUpdateV2'
+                data_list = [{'userID': userID, 'UID': uid, 'uid_nick': nickname, 'password': encrypt_pwd}]
+                data_list = json.dumps(data_list)
+                data = {'data_list': data_list}
+                requests.post(url, data=data, timeout=2)
         return response.json(0, res)
 
 
@@ -484,14 +492,28 @@ def addInterface(request):
                     else:
                         Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
                                                                    vodPrimaryMaster=vodPrimaryMaster)
-                    # if isCheckMainUser == '1':
-                    #     uid_main_dict = {
-                    #         'UID': UID,
-                    #         'user_id': vodPrimaryUserID
-                    #     }
-                    #     UIDMainUser.objects.create(**uid_main_dict)
-                # redisObj = RedisObject(db=8)
-                    # redisObj.del_data(key='uid_qs_' + userID)
+                    if not us_qs.exists():
+                        us_qs = UidSetModel.objects.filter(uid=UID)
+
+                    if us_qs.exists() and us_qs[0].is_alexa == 1:
+                        if us_qs[0].channel > 1:
+                            data_list = []
+                            uid_channel_set_qs = UidChannelSetModel.objects.filter(uid_id=us_qs[0].id). \
+                                values('channel', 'channel_name')
+                            if uid_channel_set_qs.exists():
+                                # 多通道设备名为 UidChannelSetModel 的 channel_name
+                                for uid_channel_set in uid_channel_set_qs:
+                                    data_list.append(
+                                        {'userID': userID, 'UID': UID, 'uid_nick': uid_channel_set['channel_name'],
+                                         'channel': uid_channel_set['channel'], 'password': View_Password})
+                        else:
+                            data_list = [{'userID': userID, 'UID': UID, 'uid_nick': NickName, 'password': View_Password}]
+
+                        # 请求Alexa服务器更新事件网关
+                        data_list = json.dumps(data_list)
+                        data = {'data_list': data_list}
+                        url = 'https://www.zositech.xyz/deviceStatus/addOrUpdateV2'
+                        requests.post(url, data=data, timeout=2)
                 except Exception as e:
                     return response.json(10, repr(e))
                 else:

+ 114 - 1
Controller/IotCoreController.py

@@ -9,7 +9,10 @@ import boto3
 import requests
 
 from django.views import View
-from Ansjer.config import BASE_DIR
+from Ansjer.config import BASE_DIR, AWS_IOT_GETS3_PULL_CHINA_ID, AWS_IOT_GETS3_PULL_CHINA_SECRET, \
+    AWS_IOT_GETS3_PULL_FOREIGN_ID, AWS_IOT_GETS3_PULL_FOREIGN_SECRET, AWS_ARN, AWS_IOT_SES_ACCESS_CHINA_REGION, \
+    AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA, AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE, \
+    AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA
 from base64 import b64encode, encodebytes
 from Controller.DeviceConfirmRegion import Device_Region
 from Model.models import Device_User, Device_Info, iotdeviceInfoModel, UIDCompanySerialModel, \
@@ -44,6 +47,8 @@ class IotCoreView(View):
             return self.create_keys_and_certificate(request_dict, response, request)
         elif operation == 'requestPublishMessage':
             return self.request_publish_message(request_dict, response, request)
+        elif operation == 'getS3PullKey':
+            return self.get_s3_pull_key(request_dict, response, request)
         elif operation == 'thingRegroup':
             return self.thing_regroup(request_dict, response, request)
         else:
@@ -280,6 +285,114 @@ class IotCoreView(View):
             # print(e)
             return response.json(500, repr(e))
 
+    def request_publish_mqtt(self, request_dict, response, request):
+        # 通用发布主题通知
+        UID = request_dict.get('UID', None)
+        MSG = request_dict.get('MSG', None)
+        return_topic_name = request_dict.get('return_topic_name', None)
+        if not all([UID, MSG]):
+            return response.json(444)
+
+        try:
+            # 获取检查uid的序列号,如果没有序列号,不使用MQTT下发消息
+            device_info_qs = Device_Info.objects.filter(UID=UID).values('UID', 'serial_number')
+            if not device_info_qs.exists():
+                return response.json(10043)
+            uid = device_info_qs[0]['UID']
+            serial_number = device_info_qs[0]['serial_number']
+            # 如果device_info表的serial_number不为空,物品名为'Ansjer_Device_序列号'
+            thing_name_suffix = serial_number if serial_number != '' else uid
+            # 获取数据组织将要请求的url
+            iot = iotdeviceInfoModel.objects.filter(thing_name__contains=thing_name_suffix).values('thing_name',
+                                                                                                   'endpoint',
+                                                                                                   'token_iot_number')
+            if not iot.exists():
+                return response.json(10043)
+            thing_name = iot[0]['thing_name'][14:]  # IoT core上的物品名: Ansjer_Device_ + 序列号+企业编码/uid
+            endpoint = iot[0]['endpoint']
+            Token = iot[0]['token_iot_number']
+            # Token = '297a601b3925e04daab5a60280650e09'
+            topic_name = thing_name + return_topic_name     # MQTT主题
+            if return_topic_name == 'get_s3_key_return':
+                MSG = self.get_s3_key_return_msg(endpoint)
+
+            # api doc: https://docs.aws.amazon.com/zh_cn/iot/latest/developerguide/http.html
+            # url: https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
+            # post请求url来发布MQTT消息
+            url = 'https://{}/topics/{}'.format(endpoint, topic_name)
+            authorizer_name = 'Ansjer_Iot_Auth'
+            signature = self.rsa_sign(Token)  # Token签名
+            headers = {'x-amz-customauthorizer-name': authorizer_name, 'Token': Token,
+                       'x-amz-customauthorizer-signature': signature}
+            params = {'command': MSG}
+            r = requests.post(url=url, headers=headers, json=params, timeout=2)
+            if r.status_code == 200:
+                res = r.json()
+                if res['message'] == 'OK':
+                    return response.json(0)
+                return response.json(10044)
+            else:
+                # print('发布失败')
+                return response.json(10044)
+        except Exception as e:
+            # print(e)
+            return response.json(500, repr(e))
+
+    def get_s3_pull_key(self, request_dict, response, request):
+        # 通用发布主题通知
+        UID = request_dict.get('UID', None)
+        if not all([UID]):
+            return response.json(444)
+
+        try:
+            # 获取检查uid的序列号,如果没有序列号,不使用MQTT下发消息
+            device_info_qs = Device_Info.objects.filter(UID=UID).values('UID', 'serial_number')
+            if not device_info_qs.exists():
+                return response.json(10043)
+            uid = device_info_qs[0]['UID']
+            serial_number = device_info_qs[0]['serial_number']
+            # 如果device_info表的serial_number不为空,物品名为'Ansjer_Device_序列号'
+            thing_name_suffix = serial_number if serial_number != '' else uid
+            # 获取数据组织将要请求的url
+            iot = iotdeviceInfoModel.objects.filter(thing_name__contains=thing_name_suffix).values('thing_name',
+                                                                                                   'endpoint',
+                                                                                                   'token_iot_number')
+            if not iot.exists():
+                return response.json(10043)
+            endpoint = iot[0]['endpoint']
+            MSG = self.get_s3_key_return_msg(endpoint)
+
+            return response.json(0,MSG)
+        except Exception as e:
+            # print(e)
+            return response.json(500, repr(e))
+
+    def get_s3_key_return_msg(self,endpoint):
+        MSG = {}
+        if 'cn-northwest-1' in endpoint :
+            key = AWS_IOT_GETS3_PULL_CHINA_ID
+            secret = AWS_IOT_GETS3_PULL_CHINA_SECRET
+            arn = AWS_ARN[0]
+            region_name = AWS_IOT_SES_ACCESS_CHINA_REGION
+        else:
+            key = AWS_IOT_GETS3_PULL_FOREIGN_ID
+            secret = AWS_IOT_GETS3_PULL_FOREIGN_SECRET
+            arn = AWS_ARN[1]
+            if 'ap-southeast-1' in endpoint :
+                region_name = AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA
+            if 'eu-west-1' in endpoint :
+                region_name = AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE
+            if 'us-east-1' in endpoint :
+                region_name = AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA
+
+        MSG['AccessKeyId'] = key
+        MSG['AccessKeySecret'] = secret
+        MSG['bucket_name'] = 'asj-log'
+        MSG['arn'] = arn
+        MSG['region_name'] = region_name
+        return MSG
+
+
     def rsa_sign(self, Token):
         # 私钥签名Token
         private_key_file = '''-----BEGIN RSA PRIVATE KEY-----

+ 12 - 8
Controller/PcInfo.py

@@ -204,11 +204,7 @@ class PcInfo(View):
         token = request_dict.get('token', None)
         tko = TokenObject(token)
         response.lang = tko.lang
-        if tko.code != 0:
-            return response.json(tko.code)
-        userID = tko.userID
-        if not userID:
-            return response.json(104)
+
         pc_name = request_dict.get('pc_name', None)
         bundle_version = request_dict.get('bundle_version', None)
         pc_version = request_dict.get('pc_version', None)
@@ -218,6 +214,8 @@ class PcInfo(View):
         file_type = request_dict.get('file_type', None)
         package = request_dict.get('package', None)
         explain = request_dict.get('explain', '')
+        content = request_dict.get('content', '')
+        authority = request_dict.get('authority', '')
         is_update = request_dict.get('is_update', None)
         is_open = request_dict.get('is_open', None)
         # logger.info('文件名字:')
@@ -268,6 +266,8 @@ class PcInfo(View):
                     'file_type': file_type,
                     'package': package,
                     'explain': explain,
+                    'content': content,
+                    'authority': authority,
                     'is_update': is_update,
                     'is_open': is_open
                 }
@@ -291,6 +291,8 @@ class PcInfo(View):
                            'file_type': pc_Info.file_type,
                            'package': pc_Info.package,
                            'explain': pc_Info.explain,
+                           'content': pc_Info.content,
+                           'authority': pc_Info.authority,
                            'is_update': pc_Info.is_update,
                            'is_open': pc_Info.is_open,
                            'upload_url': response_url
@@ -409,6 +411,8 @@ class PcInfo(View):
     def edit(self, request_dict, response):
         id = request_dict.get('id', None)
         explain = request_dict.get('explain', None)
+        content = request_dict.get('content', None)
+        authority = request_dict.get('authority', None)
         is_open = request_dict.get('is_open', None)
         param_flag = CommonService.get_param_flag(
             data=[id, explain, is_open])
@@ -417,9 +421,9 @@ class PcInfo(View):
         file = Pc_Info.objects.filter(id=id)
         if not file.exists():
             return response.json(173)
-        else:
-            file.update(explain=explain, is_open=is_open)
-            return response.json(0)
+
+        file.update(explain=explain, content=content, authority=authority, is_open=is_open)
+        return response.json(0)
 
     def s3delete(self, request_dict, response):
         global file

+ 3 - 0
Controller/TestApi.py

@@ -25,6 +25,7 @@ import time
 import urllib
 import datetime
 from Object.AliPayObject import AliPayObject
+import logging
 import boto3
 from boto3.session import Session
 from botocore.exceptions import ClientError
@@ -90,6 +91,8 @@ class testView(View):
         if operation is None:
             return response.json(444, 'error path')
         elif operation == 'tests':
+            logger = logging.getLogger('info')
+            logger.info('测试打印')
             res = make_password(123456)
             return JsonResponse(status=200, data=res,safe=False)
         elif operation == 'testMiddleWare':

+ 3 - 0
Model/models.py

@@ -1615,6 +1615,9 @@ class Pc_Info(models.Model):
     explain = models.TextField(blank=True, default='', verbose_name=u'更新内容')
     is_update = models.SmallIntegerField(blank=True, default=0, verbose_name='强制更新。0:否,1:是')
     is_open = models.SmallIntegerField(blank=True, default=0, verbose_name='是否开启版本。0:否,1:是')
+    content = models.TextField(blank=True, default='', verbose_name=u'内容信息')
+    authority = models.SmallIntegerField(blank=True, default=0, verbose_name='权限')
+
 
     class Meta:
         db_table = 'pc_info'