|
@@ -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)))
|