Selaa lähdekoodia

兼容查询正式服app设备图标

guanhailong 2 vuotta sitten
vanhempi
commit
08bd6c63a5
1 muutettua tiedostoa jossa 186 lisäystä ja 240 poistoa
  1. 186 240
      AdminController/DeviceManagementController.py

+ 186 - 240
AdminController/DeviceManagementController.py

@@ -90,93 +90,20 @@ class DeviceManagement(View):
 
     @classmethod
     def get_app_bundle(cls, response):
+        """
+        获取app版本id
+        """
         app_bundle_qs = AppBundle.objects.all().values('id', 'app_bundle_id')
         if not app_bundle_qs.exists():
-            return response.json(444)
-        try:
-            app_bundle_list = []
-            for app_bundle in app_bundle_qs:
-                app_bundle_qs.exists()
-                app_bundle_list.append(app_bundle)
-            return response.json(0, app_bundle_list)
-        except Exception as e:
-            return response.json(500, e)
-
-    @staticmethod
-    def add_app_device_type(request_dict, response, request):
-        # 添加APP设备类型
-        app_bundle_name = request_dict.get(
-            'appbundleName', '')[
-                          1:-1].split(',')  # '[1,2]' -> ['1','2']
-        app_bundle_id = request_dict.get(
-            'app_bundle_id', '')[
-                        1:-1].split(',')  # '[1,2]' -> ['1','2']
-        # app_device_type表数据
-        model = request_dict.get('model', None)
-        type = request_dict.get('type', None)
-        # device_name_language表数据
-        lang = request_dict.get('lang', None)
-        name = request_dict.get('name', None)
-        sort = request_dict.get('sort', None)
-        # 上传图标
-        file = request.FILES.get('iconFile', None)
-        fileName = file.name
-
-        if not all([model, type, lang, name, sort]):
-            return response.json(444)
-        type = int(type)
-
-        try:
-            with transaction.atomic():
-                # 判断包是否存在,并创建
-                new_bundle_list = []
-                for bundle_name in app_bundle_name:
-                    if not bundle_name == '':
-                        app_bundle_name_qs = AppBundle.objects.filter(app_bundle_id=bundle_name).values('id')
-                        if not app_bundle_name_qs.exists():
-                            app_bundle_name_qs.create(app_bundle_id=bundle_name)
-                        app_bundle_qs = AppBundle.objects.filter(app_bundle_id=bundle_name).values('id')
-                        id = app_bundle_qs[0]['id']
-                        new_bundle_list.append(id)
-                for app_id in app_bundle_id:
-                    if not app_id == '':
-                        app_bundle_qs = AppBundle.objects.filter(id=app_id).values('id')
-                        if not app_bundle_qs.exists():
-                            AppBundle.objects.create(app_bundle_id=app_bundle_name, id=app_id)
-                # 判断数据是否存在,是否上传
-                # app_device_type_qs = AppDeviceType.objects.filter(type=type).values()
-                # if app_device_type_qs.exists():
-                #     return response.json(174)
-                # S3下文件夹路径+文件名 组成对象key
-                file_key = 'app/device_type_images/{}'.format(fileName)
-                s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
-                # 存储桶
-                bucket = 'ansjerfilemanager'
-                # 地址:https://ansjerfilemanager.s3.amazonaws.com/app/device_type_images/camera_c190.png
-                s3.upload_file_obj(bucket, file_key, file,
-                                   {'ContentType': file.content_type, 'ACL': 'public-read'})
-                response_url = 'https://ansjerfilemanager.s3.amazonaws.com/app/device_type_images/' + format(fileName)
-                app_device_type_qs = AppDeviceType.objects.create(model=model, type=type, icon=response_url)
-                DeviceNameLanguage.objects.create(lang=lang, name=name, sort=sort,
-                                                  app_device_type_id=app_device_type_qs.id)
-                # 关联包
-                for app_id in app_bundle_id:
-                    if app_id == '':
-                        for app_id in new_bundle_list:
-                            app_bundle_qs = AppBundle.objects.filter(id=app_id).values('id')
-                            app_bundle_qs = app_bundle_qs[0]['id']
-                            app_device_type_qs.appbundle_set.add(app_bundle_qs)
-                        return response.json(0)
-                    app_bundle_qs = AppBundle.objects.filter(id=app_id).values('id')
-                    app_bundle_qs = app_bundle_qs[0]['id']
-                    app_device_type_qs.appbundle_set.add(app_bundle_qs)
-                return response.json(0)
-        except Exception as e:
-            print(e)
-            return response.json(500, repr(e))
+            return response.json(0)
+        app_bundle_list = []
+        for app_bundle in app_bundle_qs:
+            app_bundle_qs.exists()
+            app_bundle_list.append(app_bundle)
+        return response.json(0, app_bundle_list)
 
-    @staticmethod
-    def get_device_info_list(request_dict, response):
+    @classmethod
+    def get_device_info_list(cls, request_dict, response):
         pageNo = request_dict.get('pageNo', None)
         pageSize = request_dict.get('pageSize', None)
         UID = request_dict.get('UID', None)
@@ -532,151 +459,7 @@ class DeviceManagement(View):
             return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, repr(e))
-
-    def get_device_icon(self, request_dict, response):
-        """
-        查询设备信息图标
-        @parm
-        """
-        lang = request_dict.get('lang', 'en')
-        app_bundle_id = request_dict.get('appBundleId', None)
-        version_number = request_dict.get('versionNumber', None)
-        if not all([lang, app_bundle_id, version_number]):
-            return response.json(444)
-        lang_list = ['cn', 'en', 'cn_tw']
-        if lang in lang_list:
-            lang = lang
-        else:
-            lang = 'en'
-        # 中性app
-        zhong_xin = ['com.cloudlife.commissionf', 'com.cloudlife.commissionf_a']
-        if version_number >= '2.6.2.1' or app_bundle_id in zhong_xin:
-            return self.newAppVersion(response, app_bundle_id, lang, version_number)  # 新版app获取设备图标
-        else:
-            return self.oldAppVersion(response, app_bundle_id, lang, version_number)  # 旧版app获取设备图标(无用可删)
-
-    def newAppVersion(self, response, app_bundle_id, lang, version_number):
-        version_number_qs = AppVersionNumber.objects.filter(app_bundle__app_bundle_id=app_bundle_id).values(
-            'version_number')  # 获取包
-        if not version_number_qs.exists():
-            return response.json(173)
-        # 获取版本号
-        try:
-            app_bundle_list = []
-            version_qs = version_number_qs.filter(version_number=version_number).values('version_number')
-            #  判断版本是否存在, 不存在则获取输入版本范围内最接近的输入版本
-            if version_qs.exists():
-                version_number = version_qs[0]['version_number']
-            else:
-                all_version_number_qs = version_number_qs.values('version_number')  # 输入版本号不存在,则获取全部版本号
-                test_list = [item[key] for item in all_version_number_qs for key in item]
-                if version_number > test_list[-1] or version_number < test_list[0]:  # 判断该版本最靠进已有版本号
-                    version_qs = version_number_qs.filter().values('version_number').order_by('version_number')
-                    total_list = [item[key] for item in version_qs for key in item]
-                    version_number = total_list[-1]
-                else:
-                    pos = bisect_left(test_list, version_number)
-                    if pos == 0:
-                        return test_list[0]
-                    if pos == len(test_list):
-                        return test_list[-1]
-                    before = test_list[pos - 1]
-                    version_qs = AppVersionNumber.objects.filter(version_number=before).values('version_number')
-                    version_number = version_qs[0]['version_number']
-            all_version_list = [item[key] for item in version_number_qs for key in item]
-            index = all_version_list.index(version_number)  # 获取版本号的索引
-            zosi_samrt = ['com.ansjer.zccloud', 'com.ansjer.zccloud_a']
-            zhong_xin = ['com.cloudlife.commissionf', 'com.cloudlife.commissionf_a']
-            if app_bundle_id in zosi_samrt or app_bundle_id in zhong_xin:  # 判断App包
-                version_number_qs = version_number_qs.values('version_number')[0:index + 1]
-            else:
-                version_number_qs = version_number_qs.values('version_number')[1:index + 1]
-            for version_number in version_number_qs:  # 获取版本号对应的设备信息图标
-                version_number = version_number['version_number']
-                version_number_qs = AppVersionNumber.objects.filter(version_number=version_number,
-                                                                    app_bundle__app_bundle_id=app_bundle_id).values(
-                    'id')
-                version_number_id = version_number_qs[0]['id']
-                app_bundle_qs = AppBundle.objects.filter(app_bundle_id=app_bundle_id,
-                                                         app_device_type__devicenamelanguage__lang=lang,
-                                                         app_device_type__app_version_number_id=version_number_id). \
-                    annotate(
-                    model=F('app_device_type__model'), type=F('app_device_type__type'), icon=F('app_device_type__icon'),
-                    name=F('app_device_type__devicenamelanguage__name'),
-                    sort=F('app_device_type__devicenamelanguage__sort'),
-                    app_version_number_id=F('app_device_type__app_version_number_id')).values('model', 'type', 'icon',
-                                                                                              'name', 'sort',
-                                                                                              'app_device_type__app_version_number_id')
-                for app_bundle in app_bundle_qs:
-                    app_bundle_list.append({
-                        'model': app_bundle['model'],
-                        'type': app_bundle['type'],
-                        'icon': app_bundle['icon'],
-                        'name': app_bundle['name'],
-                        'sort': app_bundle['sort'],
-                        'app_device_type__app_version_number_id': app_bundle['app_device_type__app_version_number_id'],
-                    })
-            dvr_list = [app_bundle for app_bundle in app_bundle_list if app_bundle['model'] == 1]
-            ipc_list = [app_bundle for app_bundle in app_bundle_list if app_bundle['model'] == 2]
-            print(dvr_list, ipc_list)
-            res = {
-                'deviceDvr': sorted(dvr_list, key=operator.itemgetter('sort')),
-                'deviceIpc': sorted(ipc_list, key=operator.itemgetter('sort')),
-            }
-
-            return response.json(0, res)
-        except Exception as e:
-            print(e)
-            return response.json(500, repr(e))
-
-    def oldAppVersion(self, response, app_bundle_id, lang, version_number):
-        version_number_qs = AppVersionNumber.objects.filter(app_bundle__app_bundle_id=app_bundle_id,
-                                                            version_number=version_number)
-        if not version_number_qs.exists():
-            version_number_qs = AppVersionNumber.objects.filter(app_bundle__app_bundle_id=app_bundle_id)
-            if not version_number_qs.exists():
-                return response.json(173)
-            version_qs = version_number_qs.values('version_number')
-            test_list = [item[key] for item in version_qs for key in item]  # 判断该版本最靠进已有版本号
-            if version_number > test_list[-1] or version_number < test_list[0]:
-                version_number_qs = version_number_qs.filter().values('id').order_by('id')
-                total_list = [item[key] for item in version_number_qs for key in item]
-                version_number_id = total_list[-1]
-            else:
-                pos = bisect_left(test_list, version_number)
-                if pos == 0:
-                    return test_list[0]
-                if pos == len(test_list):
-                    return test_list[-1]
-                before = test_list[pos - 1]
-                version_number_qs = AppVersionNumber.objects.filter(version_number=before).values('id')
-                version_number_id = version_number_qs[0]['id']
-        else:
-            version_number_qs = AppVersionNumber.objects.filter(version_number=version_number).values('id')
-            version_number_id = version_number_qs[0]['id']
-        try:
-            app_bundle_qs = AppBundle.objects.filter(app_bundle_id=app_bundle_id,
-                                                     app_device_type__devicenamelanguage__lang=lang,
-                                                     app_device_type__app_version_number_id=version_number_id). \
-                annotate(
-                model=F('app_device_type__model'), type=F('app_device_type__type'), icon=F('app_device_type__icon'),
-                name=F('app_device_type__devicenamelanguage__name'),
-                sort=F('app_device_type__devicenamelanguage__sort'),
-                app_version_number_id=F('app_device_type__app_version_number_id')).values('model', 'type', 'icon',
-                                                                                          'name', 'sort',
-                                                                                          'app_device_type__app_version_number_id')
-            dvr_list = [app_bundle for app_bundle in app_bundle_qs if app_bundle['model'] == 1]
-            ipc_list = [app_bundle for app_bundle in app_bundle_qs if app_bundle['model'] == 2]
-            print(dvr_list, ipc_list)
-            res = {
-                'deviceDvr': sorted(dvr_list, key=operator.itemgetter('sort')),
-                'deviceIpc': sorted(ipc_list, key=operator.itemgetter('sort')),
-            }
-            return response.json(0, res)
-        except Exception as e:
-            print(e)
-            return response.json(500, (repr(e)))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
     @staticmethod
     def get_app_device_type_list(request_dict, response):
@@ -787,17 +570,7 @@ class DeviceManagement(View):
             # 记录操作日志
             ip = CommonService.get_ip_address(request)
             content = json.loads(json.dumps(request_dict))
-            log = {
-                'ip': ip,
-                'user_id': 2,
-                'status': 200,
-                'time': int(time.time()),
-                'url': 'deviceManagement/resetAll',
-                'content': json.dumps(content),
-                'operation': '{}重置所有'.format(uid),
-            }
             with transaction.atomic():
-                LogModel.objects.create(**log)
                 # 删除主用户
                 Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
                 # 删除云存
@@ -813,7 +586,180 @@ class DeviceManagement(View):
                 # 删除AI
                 ExperienceAiModel.objects.filter(uid=uid).delete()
                 AiService.objects.filter(uid=uid).delete()
+                log = {
+                    'ip': ip,
+                    'user_id': 2,
+                    'status': 200,
+                    'time': int(time.time()),
+                    'url': 'deviceManagement/resetAll',
+                    'content': json.dumps(content),
+                    'operation': '{}重置所有'.format(uid),
+                }
+                LogModel.objects.create(**log)
                 return response.json(0)
         except Exception as e:
             print(e)
-            return response.json(500, repr(e))
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def add_app_device_type(request_dict, response, request):
+        """
+        添加app设备类型数据并上传图标
+        @param request_dict: 请求参数
+        @request_dict lang: 语言
+        @request_dict app_bundle_id: app包id
+        @request_dict version_number: app版本号
+        @request_dict model: 设备类型
+        @request_dict type: 设备型号
+        @request_dict name: 设备名称
+        @request_dict sort: 升序排序
+        @request_dict file: 文件
+        @param response: 响应对象
+        @return:
+        """
+        # 添加APP设备类型
+        app_bundle_id = request_dict.get(
+            'app_bundle_id', '')[
+                        1:-1].split(',')  # '[1,2]' -> ['1','2']
+        # 版本号
+        version_number = request_dict.get('version_number', None)
+        # app_device_type表数据
+        model = request_dict.get('model', None)
+        type = request_dict.get('type', None)
+        # device_name_language表数据
+        lang = request_dict.get('lang', None)
+        name = request_dict.get('name', None)
+        sort = request_dict.get('sort', None)
+        # 上传图标
+        file = request.FILES.get('iconFile', None)
+        fileName = file.name
+        if not all([model, type, lang, name, sort, version_number]):
+            return response.json(444, 'model, type, lang, name, sort, version_number')
+        type = int(type)
+        try:
+            with transaction.atomic():
+                app_bundle_qs = AppBundle.objects.filter(id__in=app_bundle_id,
+                                                         app_device_type__devicenamelanguage__lang=lang,
+                                                         app_device_type__app_version_number_id=version_number,
+                                                         app_device_type__type=type,
+                                                         app_device_type__model=model)
+                #  数据是否重复
+                if app_bundle_qs.exists():
+                    return response.json(174)
+                # 是否存在相同的url
+                response_url = 'https://ansjerfilemanager.s3.amazonaws.com/app/device_type_images/' + format(fileName)
+                app_bundle_qs = AppDeviceType.objects.filter(appbundle__id__in=app_bundle_id, type=type, model=model)
+                if not app_bundle_qs.exists():
+                    #  上传设备图标至存储桶
+                    bucket_name = 'ansjerfilemanager'
+                    file_key = 'app/device_type_images/{}'.format(fileName)
+                    s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
+                    # 地址:https://ansjerfilemanager.s3.amazonaws.com/app/device_type_images/camera_c190.png
+                    s3.upload_file_obj(
+                        bucket_name,
+                        file_key,
+                        file,
+                        {'ContentType': file.content_type, 'ACL': 'public-read'})
+                #  创建
+                for app_id in app_bundle_id:
+                    app_bundle_qs = AppBundle.objects.filter(id=app_id).values('id')
+                    app_device_type_qs = AppDeviceType.objects.create(model=model, type=type, icon=response_url,
+                                                                      app_version_number_id=version_number)
+                    DeviceNameLanguage.objects.create(lang=lang, name=name, sort=sort,
+                                                      app_device_type_id=app_device_type_qs.id)
+                    #  关联app包
+                    app_device_type_qs.appbundle_set.add(app_bundle_qs[0]['id'])
+                return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    def get_device_icon(self, request_dict, response):
+        """
+        查询设备信息图标
+        @param request_dict: 请求参数
+        @request_dict lang: 语言
+        @request_dict app_bundle_id: app版本id
+        @request_dict version_number: app版本号
+        @param response: 响应对象
+        @return:
+        """
+        lang = request_dict.get('lang', 'en')
+        app_bundle_id = request_dict.get('appBundleId', None)
+        version_number = request_dict.get('versionNumber', None)
+        if not all([lang, app_bundle_id, version_number]):
+            return response.json(444)
+        try:
+            version_number = list(map(int, version_number.split('.')))
+            app_bundle_qs = AppBundle.objects.filter(app_bundle_id=app_bundle_id).values(
+                'app_device_type__app_version_number_id').distinct().order_by('app_device_type__app_version_number_id')
+            #  判断版本是否存在, 不存在则获取输入版本范围内最接近的输入版本
+            version_number_list = []
+            app_bundle_list = []
+            id_list = []
+            for version in app_bundle_qs:
+                version = version['app_device_type__app_version_number_id']
+                # 必须是版本号
+                if len(version) > 3:
+                    version_parts = list(map(int, version.split('.')))
+                    if version_parts <= version_number:
+                        version_number_list.append(version)
+                else:
+                    id_list.append(int(version))
+            # app_device_type__app_version_number_id为AppVersionNumber的主键时
+            version_list = []
+            if len(version_number_list) == 0:
+                version_qs = AppVersionNumber.objects.filter(
+                    id__in=id_list).values('version_number').distinct()
+                for version in version_qs:
+                    version_qs = AppVersionNumber.objects.filter(version_number=version['version_number'],
+                                                                 app_bundle__app_bundle_id=app_bundle_id).values('id')
+                    if not version_qs.exists():
+                        continue
+                    version_number_data = {
+                        version_qs[0]['id']: version['version_number']
+                    }
+                    version_list.append(version_number_data)
+                for version in version_list:
+                    for k, v in version.items():
+                        version_parts = list(map(int, v.split('.')))
+                        if version_parts <= version_number:
+                            version_number_list.append(k)
+            # 版本号对应的设备信息图标
+            for version_number in version_number_list:
+                app_bundle_qs = AppBundle.objects.filter(app_bundle_id=app_bundle_id,
+                                                         app_device_type__devicenamelanguage__lang=lang,
+                                                         app_device_type__app_version_number_id=version_number). \
+                    annotate(
+                    model=F('app_device_type__model'), type=F('app_device_type__type'), icon=F('app_device_type__icon'),
+                    name=F('app_device_type__devicenamelanguage__name'),
+                    sort=F('app_device_type__devicenamelanguage__sort'),
+                    app_version_number_id=F('app_device_type__app_version_number_id')).values('model', 'type', 'icon',
+                                                                                              'name', 'sort',
+                                                                                              'app_device_type__app_version_number_id')
+                for app_bundle in app_bundle_qs:
+                    device_type = any(item['type'] == app_bundle['type'] for item in app_bundle_list)
+                    if device_type:
+                        break
+                    else:
+                        app_bundle_list.append({
+                            'model': app_bundle['model'],
+                            'type': app_bundle['type'],
+                            'icon': app_bundle['icon'],
+                            'name': app_bundle['name'],
+                            'sort': app_bundle['sort'],
+                            'app_device_type__app_version_number_id': app_bundle[
+                                'app_device_type__app_version_number_id'],
+                        })
+            # 去重
+            dvr_list = [app_bundle for app_bundle in app_bundle_list if app_bundle['model'] == 1]
+            ipc_list = [app_bundle for app_bundle in app_bundle_list if app_bundle['model'] == 2]
+            res = {
+                'deviceDvr': sorted(dvr_list, key=operator.itemgetter('sort')),
+                'deviceIpc': sorted(ipc_list, key=operator.itemgetter('sort')),
+            }
+
+            return response.json(0, res)
+        except Exception as e:
+            print(e)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))