DeviceManagementController.py 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import json
  4. import operator
  5. import time
  6. from bisect import bisect_left
  7. import oss2
  8. from django.db import transaction
  9. from django.db.models import Q, F
  10. from django.views.generic.base import View
  11. from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, \
  12. AWS_SES_ACCESS_REGION, UNUSED_SERIAL_REDIS_LIST
  13. from Model.models import Device_Info, UidSetModel, LogModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
  14. VodHlsModel, ExperienceContextModel, DeviceTypeModel, Equipment_Info, UidUserModel, ExperienceAiModel, AiService, \
  15. AppBundle, App_Info, AppDeviceType, DeviceNameLanguage, AppVersionNumber, UIDCompanySerialModel, UIDModel, \
  16. CompanySerialModel
  17. from Object.AWS.AmazonS3Util import AmazonS3Util
  18. from Object.RedisObject import RedisObject
  19. from Object.ResponseObject import ResponseObject
  20. from Object.TokenObject import TokenObject
  21. from Service.CommonService import CommonService
  22. from Service.EquipmentInfoService import EquipmentInfoService
  23. from Service.ModelService import ModelService
  24. from Service.VodHlsService import SplitVodHlsObject
  25. class DeviceManagement(View):
  26. def get(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. operation = kwargs.get('operation')
  29. return self.validation(request.GET, request, operation)
  30. def post(self, request, *args, **kwargs):
  31. request.encoding = 'utf-8'
  32. operation = kwargs.get('operation')
  33. return self.validation(request.POST, request, operation)
  34. def validation(self, request_dict, request, operation):
  35. language = request_dict.get('language', 'en')
  36. response = ResponseObject(language, 'pc')
  37. if operation == 'addDeviceType':
  38. return self.addDeviceType(request, request_dict, response)
  39. elif operation == 'delDeviceData': # 删除设备数据
  40. return self.del_device_data(request_dict, response)
  41. elif operation == 'getDeviceIcon': # app获取设备图标
  42. response = ResponseObject(language)
  43. return self.get_device_icon(request_dict, response)
  44. elif operation == 'addAppDeviceType': # 添加app设备类型数据并上传图标
  45. return self.add_app_device_type(request_dict, response, request)
  46. else:
  47. tko = TokenObject(
  48. request.META.get('HTTP_AUTHORIZATION'),
  49. returntpye='pc')
  50. if tko.code != 0:
  51. return response.json(tko.code)
  52. response.lang = tko.lang
  53. userID = tko.userID
  54. if not userID:
  55. return response.json(444, 'userID')
  56. if operation == 'getDeviceInfoList': # 获取设备信息数据
  57. return self.get_device_info_list(request_dict, response)
  58. elif operation == 'deleteDevice':
  59. return self.deleteDevice(request_dict, response)
  60. elif operation == 'resetVod': # 重置云存
  61. return self.resetVod(request, request_dict, response)
  62. elif operation == 'resetAi': # 重置AI
  63. return self.reset_ai(request, request_dict, response)
  64. elif operation == 'resetPrimaryUser':
  65. return self.resetPrimaryUser(request, request_dict, response)
  66. elif operation == 'getDeviceTypeList':
  67. return self.getDeviceTypeList(request_dict, response)
  68. elif operation == 'deleteDeviceType':
  69. return self.deleteDeviceType(request_dict, response)
  70. elif operation == 'getAppDeviceTypeList': # 获取app设备类型数据
  71. return self.get_app_device_type_list(request_dict, response)
  72. elif operation == 'getAppBundleIdList': # 获取app包id数据
  73. return self.get_app_bundle_id_list(response)
  74. elif operation == 'editAppDeviceType': # 编辑app设备类型数据
  75. return self.edit_app_device_type(request_dict, response)
  76. elif operation == 'deleteAppDeviceType': # 删除app设备类型数据
  77. return self.delete_app_device_type(request_dict, response)
  78. elif operation == 'getAppBundle': # 获取app版本包
  79. return self.get_app_bundle(response)
  80. elif operation == 'resetAll': # 重置设备主用户/云存/AI
  81. return self.reset_all(request, request_dict, response)
  82. else:
  83. return response.json(444, 'operation')
  84. @classmethod
  85. def get_app_bundle(cls, response):
  86. app_bundle_qs = AppBundle.objects.all().values('id', 'app_bundle_id')
  87. if not app_bundle_qs.exists():
  88. return response.json(444)
  89. try:
  90. app_bundle_list = []
  91. for app_bundle in app_bundle_qs:
  92. app_bundle_qs.exists()
  93. app_bundle_list.append(app_bundle)
  94. return response.json(0, app_bundle_list)
  95. except Exception as e:
  96. return response.json(500, e)
  97. @staticmethod
  98. def add_app_device_type(request_dict, response, request):
  99. # 添加APP设备类型
  100. app_bundle_name = request_dict.get(
  101. 'appbundleName', '')[
  102. 1:-1].split(',') # '[1,2]' -> ['1','2']
  103. app_bundle_id = request_dict.get(
  104. 'app_bundle_id', '')[
  105. 1:-1].split(',') # '[1,2]' -> ['1','2']
  106. # app_device_type表数据
  107. model = request_dict.get('model', None)
  108. type = request_dict.get('type', None)
  109. # device_name_language表数据
  110. lang = request_dict.get('lang', None)
  111. name = request_dict.get('name', None)
  112. sort = request_dict.get('sort', None)
  113. # 上传图标
  114. file = request.FILES.get('iconFile', None)
  115. fileName = file.name
  116. if not all([model, type, lang, name, sort]):
  117. return response.json(444)
  118. type = int(type)
  119. try:
  120. with transaction.atomic():
  121. # 判断包是否存在,并创建
  122. new_bundle_list = []
  123. for bundle_name in app_bundle_name:
  124. if not bundle_name == '':
  125. app_bundle_name_qs = AppBundle.objects.filter(app_bundle_id=bundle_name).values('id')
  126. if not app_bundle_name_qs.exists():
  127. app_bundle_name_qs.create(app_bundle_id=bundle_name)
  128. app_bundle_qs = AppBundle.objects.filter(app_bundle_id=bundle_name).values('id')
  129. id = app_bundle_qs[0]['id']
  130. new_bundle_list.append(id)
  131. for app_id in app_bundle_id:
  132. if not app_id == '':
  133. app_bundle_qs = AppBundle.objects.filter(id=app_id).values('id')
  134. if not app_bundle_qs.exists():
  135. AppBundle.objects.create(app_bundle_id=app_bundle_name, id=app_id)
  136. # 判断数据是否存在,是否上传
  137. # app_device_type_qs = AppDeviceType.objects.filter(type=type).values()
  138. # if app_device_type_qs.exists():
  139. # return response.json(174)
  140. # S3下文件夹路径+文件名 组成对象key
  141. file_key = 'app/device_type_images/{}'.format(fileName)
  142. s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
  143. # 存储桶
  144. bucket = 'ansjerfilemanager'
  145. # 地址:https://ansjerfilemanager.s3.amazonaws.com/app/device_type_images/camera_c190.png
  146. s3.upload_file_obj(bucket, file_key, file,
  147. {'ContentType': file.content_type, 'ACL': 'public-read'})
  148. response_url = 'https://ansjerfilemanager.s3.amazonaws.com/app/device_type_images/' + format(fileName)
  149. app_device_type_qs = AppDeviceType.objects.create(model=model, type=type, icon=response_url)
  150. DeviceNameLanguage.objects.create(lang=lang, name=name, sort=sort,
  151. app_device_type_id=app_device_type_qs.id)
  152. # 关联包
  153. for app_id in app_bundle_id:
  154. if app_id == '':
  155. for app_id in new_bundle_list:
  156. app_bundle_qs = AppBundle.objects.filter(id=app_id).values('id')
  157. app_bundle_qs = app_bundle_qs[0]['id']
  158. app_device_type_qs.appbundle_set.add(app_bundle_qs)
  159. return response.json(0)
  160. app_bundle_qs = AppBundle.objects.filter(id=app_id).values('id')
  161. app_bundle_qs = app_bundle_qs[0]['id']
  162. app_device_type_qs.appbundle_set.add(app_bundle_qs)
  163. return response.json(0)
  164. except Exception as e:
  165. print(e)
  166. return response.json(500, repr(e))
  167. @staticmethod
  168. def get_device_info_list(request_dict, response):
  169. pageNo = request_dict.get('pageNo', None)
  170. pageSize = request_dict.get('pageSize', None)
  171. UID = request_dict.get('UID', None)
  172. serialNumber = request_dict.get('serialNumber', None)
  173. NickName = request_dict.get('NickName', None)
  174. username = request_dict.get('username', None)
  175. version = request_dict.get('version', None)
  176. if not all([pageNo, pageSize]):
  177. return response.json(444)
  178. page = int(pageNo)
  179. line = int(pageSize)
  180. try:
  181. if any([UID, serialNumber, NickName, username, version]): # 条件查询
  182. if UID:
  183. device_info_qs = Device_Info.objects.filter(UID__icontains=UID)
  184. if serialNumber:
  185. device_info_qs = Device_Info.objects.filter(serial_number__icontains=serialNumber)
  186. if NickName:
  187. device_info_qs = Device_Info.objects.filter(NickName__icontains=NickName)
  188. if username:
  189. device_info_qs = Device_Info.objects.filter(Q(userID__username__icontains=username) |
  190. Q(userID__userEmail__icontains=username) |
  191. Q(userID__phone__icontains=username))
  192. if version:
  193. uid_list = UidSetModel.objects.filter(version__icontains=version).values_list('uid', flat=True)
  194. device_info_qs = Device_Info.objects.filter(UID__in=uid_list)
  195. total = device_info_qs.count()
  196. if not total:
  197. return response.json(0, {'list': {}, 'total': 0})
  198. device_info_qs = device_info_qs[(page - 1) * line:page * line]
  199. else: # 查询全部
  200. total = Device_Info.objects.filter().count()
  201. device_info_qs = Device_Info.objects.filter()[(page - 1) * line:page * line]
  202. if not device_info_qs.exists():
  203. return response.json(0, {'list': {}, 'total': 0})
  204. device_info_list = CommonService.qs_to_dict(device_info_qs)
  205. for k, v in enumerate(device_info_list["datas"]):
  206. for device_info in device_info_qs:
  207. if v['pk'] == device_info.id:
  208. # 设备的用户名和主用户
  209. username = ModelService.get_user_name(device_info_list["datas"][k]['fields']['userID'])
  210. device_info_list["datas"][k]['fields']['username'] = username
  211. device_info_list["datas"][k]['fields']['vodPrimaryMaster'] = \
  212. device_info_list["datas"][k]['fields']['vodPrimaryMaster']
  213. # 是否支持移动侦测
  214. iSNotification = '开' if device_info_list["datas"][k]['fields']['iSNotification'] == 1 else '关'
  215. device_info_list["datas"][k]['fields']['iSNotification'] = iSNotification
  216. # 设备类型,是否支持Alexa和ip
  217. type = device_info_list["datas"][k]['fields']['Type']
  218. device_type_qs = DeviceTypeModel.objects.filter(type=type).values('name')
  219. if device_type_qs.exists():
  220. device_info_list["datas"][k]['fields']['Type'] = device_type_qs[0]['name']
  221. uid_set_qs = UidSetModel.objects.filter(
  222. uid=device_info_list["datas"][k]['fields']['UID']).values('is_alexa', 'ip', 'version',
  223. 'is_ai', 'is_human', 'cloud_vod')
  224. if uid_set_qs.exists():
  225. isAlexa = '是' if uid_set_qs[0]['is_alexa'] else '否'
  226. isHuman = '是' if uid_set_qs[0]['is_human'] else '否'
  227. if uid_set_qs[0]['cloud_vod'] == 2:
  228. cloud_vod = '不支持'
  229. elif uid_set_qs[0]['cloud_vod'] == 1:
  230. cloud_vod = '开启'
  231. else:
  232. cloud_vod = '关闭'
  233. if uid_set_qs[0]['is_ai'] == 2:
  234. isAI = '不支持'
  235. elif uid_set_qs[0]['is_ai'] == 1:
  236. isAI = '开启'
  237. else:
  238. isAI = '关闭'
  239. device_info_list["datas"][k]['fields']['isHuman'] = isHuman
  240. device_info_list["datas"][k]['fields']['isAI'] = isAI
  241. device_info_list["datas"][k]['fields']['isAlexa'] = isAlexa
  242. device_info_list["datas"][k]['fields']['cloudVod'] = cloud_vod
  243. device_info_list["datas"][k]['fields']['ip'] = uid_set_qs[0]['ip']
  244. device_info_list["datas"][k]['fields']['version'] = uid_set_qs[0]['version']
  245. return response.json(0, {'list': device_info_list, 'total': total})
  246. except Exception as e:
  247. print(e)
  248. return response.json(500, repr(e))
  249. # 根据id删除设备
  250. def deleteDevice(self, request_dict, response):
  251. deviceID = request_dict.get('deviceID', None)
  252. userID = request_dict.get('userID', None)
  253. uid = request_dict.get('uid', None)
  254. if not all([deviceID, userID, uid]):
  255. return response.json(444)
  256. try:
  257. with transaction.atomic():
  258. Device_Info.objects.filter(id=deviceID).delete()
  259. # 删除推送消息
  260. for val in range(1, 8):
  261. EquipmentInfoService.get_equipment_info_model('', val). \
  262. filter(device_user_id=userID, device_uid=uid).delete()
  263. return response.json(0)
  264. except Exception as e:
  265. print(e)
  266. return response.json(500, repr(e))
  267. # 重置设备主用户
  268. def resetPrimaryUser(self, request, request_dict, response):
  269. uid = request_dict.get('uid', None)
  270. if not uid:
  271. return response.json(404)
  272. try:
  273. # 记录操作日志
  274. ip = CommonService.get_ip_address(request)
  275. content = json.loads(json.dumps(request_dict))
  276. log = {
  277. 'ip': ip,
  278. 'user_id': 2,
  279. 'status': 200,
  280. 'time': int(time.time()),
  281. 'url': 'deviceManagement/resetPrimaryUser',
  282. 'content': json.dumps(content),
  283. 'operation': '{}重置设备主用户'.format(uid),
  284. }
  285. LogModel.objects.create(**log)
  286. Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
  287. return response.json(0)
  288. except Exception as e:
  289. return response.json(500, repr(e))
  290. # 重置设备云存
  291. def resetVod(self, request, request_dict, response):
  292. uid = request_dict.get('uid', None)
  293. if not uid:
  294. return response.json(444)
  295. try:
  296. # 记录操作日志
  297. ip = CommonService.get_ip_address(request)
  298. content = json.loads(json.dumps(request_dict))
  299. log = {
  300. 'ip': ip,
  301. 'user_id': 2,
  302. 'status': 200,
  303. 'time': int(time.time()),
  304. 'url': 'deviceManagement/resetVod',
  305. 'content': json.dumps(content),
  306. 'operation': '{}重置云存'.format(uid),
  307. }
  308. with transaction.atomic():
  309. LogModel.objects.create(**log)
  310. # 删除和更新设备云存相关数据
  311. UID_Bucket.objects.filter(uid=uid).delete()
  312. Unused_Uid_Meal.objects.filter(uid=uid).delete()
  313. Order_Model.objects.filter(UID=uid, order_type=0).delete()
  314. StsCrdModel.objects.filter(uid=uid).delete()
  315. VodHlsModel.objects.filter(uid=uid).delete()
  316. # 删除vod_hls分表数据
  317. split_vod_hls_obj = SplitVodHlsObject()
  318. split_vod_hls_obj.del_vod_hls_data(uid=uid)
  319. ExperienceContextModel.objects.filter(uid=uid).delete()
  320. Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
  321. return response.json(0)
  322. except Exception as e:
  323. print(e)
  324. return response.json(500, repr(e))
  325. @staticmethod
  326. def reset_ai(request, request_dict, response):
  327. uid = request_dict.get('uid', None)
  328. if not uid:
  329. return response.json(444)
  330. try:
  331. # 记录操作日志
  332. ip = CommonService.get_ip_address(request)
  333. content = json.loads(json.dumps(request_dict))
  334. log = {
  335. 'ip': ip,
  336. 'user_id': 2,
  337. 'status': 200,
  338. 'time': int(time.time()),
  339. 'url': 'deviceManagement/resetAi',
  340. 'content': json.dumps(content),
  341. 'operation': '{}重置AI'.format(uid),
  342. }
  343. with transaction.atomic():
  344. LogModel.objects.create(**log)
  345. # 删除和更新设备AI相关数据
  346. ExperienceAiModel.objects.filter(uid=uid).delete()
  347. AiService.objects.filter(uid=uid).delete()
  348. return response.json(0)
  349. except Exception as e:
  350. print(e)
  351. return response.json(500, repr(e))
  352. # 获取设备类型数据
  353. def getDeviceTypeList(self, request_dict, response):
  354. name = request_dict.get('name', None)
  355. pageNo = request_dict.get('pageNo', None)
  356. pageSize = request_dict.get('pageSize', None)
  357. if not all([pageNo, pageSize]):
  358. return response.json(444)
  359. page = int(pageNo)
  360. line = int(pageSize)
  361. try:
  362. if name:
  363. device_type_qs = DeviceTypeModel.objects.filter(name__contains=name).values()
  364. total = len(device_type_qs)
  365. else:
  366. device_type_qs = DeviceTypeModel.objects.filter().values()[(page - 1) * line:page * line]
  367. total = DeviceTypeModel.objects.filter().count()
  368. if not device_type_qs.exists():
  369. return response.json(173)
  370. device_type_list = []
  371. for device_type in device_type_qs:
  372. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  373. bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
  374. icon = device_type['icon']
  375. url = 'device_type/' + icon
  376. device_type['icon'] = bucket.sign_url('GET', url, 3600)
  377. device_type_list.append(device_type)
  378. return response.json(0, {'list': device_type_list, 'total': total})
  379. except Exception as e:
  380. print(e)
  381. return response.json(500, repr(e))
  382. # 删除设备类型
  383. def deleteDeviceType(self, request_dict, response):
  384. deviceTypeID = request_dict.get('deviceTypeID', None)
  385. if not deviceTypeID:
  386. return response.json(444)
  387. try:
  388. DeviceTypeModel.objects.filter(id=deviceTypeID).delete()
  389. return response.json(0)
  390. except Exception as e:
  391. print(e)
  392. return response.json(500, repr(e))
  393. # 添加设备类型
  394. def addDeviceType(self, request, request_dict, response):
  395. iconFile = request.FILES.get('iconFile', None)
  396. name = request_dict.get('name', None)
  397. model = request_dict.get('model', None)
  398. type = request_dict.get('type', None)
  399. ptz_type = request_dict.get('ptz_type', None)
  400. if not all([iconFile, name, model, type, ptz_type]):
  401. return response.json(444)
  402. try:
  403. model = int(model)
  404. ptz_type = int(ptz_type)
  405. icon = iconFile.name
  406. now_time = int(time.time())
  407. # 上传文件到阿里云OSS
  408. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  409. bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
  410. key = 'device_type/' + icon # 图片文件存放于 device_type 目录下
  411. # https://oss.console.aliyun.com/bucket/oss-cn-shenzhen/ansjer-static-resources/object?path=device_type%2F
  412. bucket.put_object(key=key, data=iconFile)
  413. DeviceTypeModel.objects.create(name=name, model=model, type=type, ptz_type=ptz_type, icon=icon,
  414. add_time=now_time, update_time=now_time)
  415. return response.json(0)
  416. except Exception as e:
  417. print(e)
  418. return response.json(500, repr(e))
  419. @staticmethod
  420. def del_device_data(request_dict, response):
  421. uidList = request_dict.get('uidList', None)
  422. delDataOptions = request_dict.get('delDataOptions', None)
  423. serialNumberList = request_dict.get('serialNumberList', None)
  424. if not all([uidList or serialNumberList, delDataOptions]):
  425. return response.json(444)
  426. try:
  427. with transaction.atomic():
  428. if uidList:
  429. # uid
  430. uidList = uidList.splitlines() # 按行('\r', '\r\n', \n')切割字符串返回列表
  431. else:
  432. # 序列号
  433. serialNumberList = serialNumberList.splitlines() # 按行('\r', '\r\n', \n')切割字符串返回列表
  434. serial_number_list = []
  435. for serial_number in serialNumberList:
  436. serial_number_list.append(serial_number[0:6])
  437. uid_company_serial_qs = UIDCompanySerialModel.objects.filter(
  438. company_serial__serial_number__in=serial_number_list).values('uid__uid')
  439. uidList = [item[key] for item in uid_company_serial_qs for key in item]
  440. # 解绑uid数据,重置序列号状态
  441. UIDModel.objects.filter(uid__in=uidList).update(status=0)
  442. UIDCompanySerialModel.objects.filter(uid__uid__in=uidList).delete()
  443. CompanySerialModel.objects.filter(serial_number__in=serial_number_list).update(status=1)
  444. # 根据删除项删除相关数据
  445. if '设备信息数据' in delDataOptions:
  446. Device_Info.objects.filter(UID__in=uidList).delete()
  447. if '设备配置数据' in delDataOptions:
  448. UidSetModel.objects.filter(uid__in=uidList).delete()
  449. if '设备推送数据' in delDataOptions:
  450. Equipment_Info.objects.filter(devUid__in=uidList).delete()
  451. if '设备AP信息数据' in delDataOptions:
  452. UidUserModel.objects.filter(UID__in=uidList).delete()
  453. if '设备AI数据' in delDataOptions:
  454. ExperienceAiModel.objects.filter(uid__in=uidList).delete()
  455. Order_Model.objects.filter(UID__in=uidList, order_type=1).delete()
  456. if '设备云存数据' in delDataOptions:
  457. UID_Bucket.objects.filter(uid__in=uidList).delete()
  458. StsCrdModel.objects.filter(uid__in=uidList).delete()
  459. VodHlsModel.objects.filter(uid__in=uidList).delete()
  460. # 删除vod_hls分表数据
  461. split_vod_hls_obj = SplitVodHlsObject()
  462. split_vod_hls_obj.del_vod_hls_data(uid__in=uidList)
  463. Unused_Uid_Meal.objects.filter(uid__in=uidList).delete()
  464. ExperienceContextModel.objects.filter(uid__in=uidList).delete()
  465. Order_Model.objects.filter(UID__in=uidList, order_type=0).delete()
  466. Device_Info.objects.filter(UID__in=uidList).update(vodPrimaryUserID='', vodPrimaryMaster='')
  467. # 序列号加入重置状态redis列表
  468. if serialNumberList is not None:
  469. redis_obj = RedisObject()
  470. for serial in serial_number_list:
  471. redis_obj.rpush(UNUSED_SERIAL_REDIS_LIST, serial)
  472. return response.json(0)
  473. except Exception as e:
  474. print(e)
  475. return response.json(500, repr(e))
  476. def get_device_icon(self, request_dict, response):
  477. lang = request_dict.get('lang', 'en')
  478. app_bundle_id = request_dict.get('appBundleId', None)
  479. version_number = request_dict.get('versionNumber', None)
  480. if not all([lang, app_bundle_id, version_number]):
  481. return response.json(444)
  482. if lang != 'cn' and lang != 'cn_tw':
  483. lang = 'en'
  484. if version_number >= '2.6.2.1': # 判断是否低于2.6.2.1版本
  485. return self.newAppVersion(response, app_bundle_id, lang, version_number) # 获取2.6.2.1及以上版本设备信息图标
  486. else:
  487. version_number_qs = AppVersionNumber.objects.filter(app_bundle__app_bundle_id=app_bundle_id,
  488. version_number=version_number)
  489. if not version_number_qs.exists():
  490. version_number_qs = AppVersionNumber.objects.filter(app_bundle__app_bundle_id=app_bundle_id)
  491. if not version_number_qs.exists():
  492. return response.json(173)
  493. version_qs = version_number_qs.values('version_number')
  494. test_list = [item[key] for item in version_qs for key in item] # 判断该版本最靠进已有版本号
  495. if version_number > test_list[-1] or version_number < test_list[0]:
  496. version_number_qs = version_number_qs.filter().values('id').order_by('id')
  497. total_list = [item[key] for item in version_number_qs for key in item]
  498. version_number_id = total_list[-1]
  499. else:
  500. pos = bisect_left(test_list, version_number)
  501. if pos == 0:
  502. return test_list[0]
  503. if pos == len(test_list):
  504. return test_list[-1]
  505. before = test_list[pos - 1]
  506. version_number_qs = AppVersionNumber.objects.filter(version_number=before).values('id')
  507. version_number_id = version_number_qs[0]['id']
  508. else:
  509. version_number_qs = AppVersionNumber.objects.filter(version_number=version_number).values('id')
  510. version_number_id = version_number_qs[0]['id']
  511. try:
  512. app_bundle_qs = AppBundle.objects.filter(app_bundle_id=app_bundle_id,
  513. app_device_type__devicenamelanguage__lang=lang,
  514. app_device_type__app_version_number_id=version_number_id). \
  515. annotate(
  516. model=F('app_device_type__model'), type=F('app_device_type__type'), icon=F('app_device_type__icon'),
  517. name=F('app_device_type__devicenamelanguage__name'),
  518. sort=F('app_device_type__devicenamelanguage__sort'),
  519. app_version_number_id=F('app_device_type__app_version_number_id')).values('model', 'type', 'icon',
  520. 'name', 'sort',
  521. 'app_device_type__app_version_number_id')
  522. dvr_list = [app_bundle for app_bundle in app_bundle_qs if app_bundle['model'] == 1]
  523. ipc_list = [app_bundle for app_bundle in app_bundle_qs if app_bundle['model'] == 2]
  524. print(dvr_list, ipc_list)
  525. res = {
  526. 'deviceDvr': sorted(dvr_list, key=operator.itemgetter('sort')),
  527. 'deviceIpc': sorted(ipc_list, key=operator.itemgetter('sort')),
  528. }
  529. return response.json(0, res)
  530. except Exception as e:
  531. print(e)
  532. return response.json(500, repr(e))
  533. def newAppVersion(self, response, app_bundle_id, lang, version_number):
  534. version_number_qs = AppVersionNumber.objects.filter(app_bundle__app_bundle_id=app_bundle_id).values(
  535. 'version_number') # 获取包
  536. if not version_number_qs.exists():
  537. return response.json(173)
  538. # 获取版本号
  539. try:
  540. app_bundle_list = []
  541. version_qs = version_number_qs.filter(version_number=version_number).values('version_number') # 判断版本是否存在
  542. if version_qs.exists():
  543. version_number = version_qs[0]['version_number']
  544. else:
  545. all_version_number_qs = version_number_qs.values('version_number') # 输入版本号不存在,则获取全部版本号
  546. test_list = [item[key] for item in all_version_number_qs for key in item]
  547. if version_number > test_list[-1] or version_number < test_list[0]: # 判断该版本最靠进已有版本号
  548. version_qs = version_number_qs.filter().values('version_number').order_by('version_number')
  549. total_list = [item[key] for item in version_qs for key in item]
  550. version_number = total_list[-1]
  551. else:
  552. pos = bisect_left(test_list, version_number)
  553. if pos == 0:
  554. return test_list[0]
  555. if pos == len(test_list):
  556. return test_list[-1]
  557. before = test_list[pos - 1]
  558. version_qs = AppVersionNumber.objects.filter(version_number=before).values('version_number')
  559. version_number = version_qs[0]['version_number']
  560. all_version_list = [item[key] for item in version_number_qs for key in item]
  561. index = all_version_list.index(version_number) # 获取版本号的索引
  562. if app_bundle_id == 'com.ansjer.zccloud' or app_bundle_id == 'com.ansjer.zccloud_a': # 判断App包
  563. version_number_qs = version_number_qs.values('version_number')[0:index + 1]
  564. else:
  565. version_number_qs = version_number_qs.values('version_number')[1:index + 1]
  566. for version_number in version_number_qs: # 获取版本号对应的设备信息图标
  567. version_number = version_number['version_number']
  568. version_number_qs = AppVersionNumber.objects.filter(version_number=version_number,
  569. app_bundle__app_bundle_id=app_bundle_id).values(
  570. 'id')
  571. version_number_id = version_number_qs[0]['id']
  572. app_bundle_qs = AppBundle.objects.filter(app_bundle_id=app_bundle_id,
  573. app_device_type__devicenamelanguage__lang=lang,
  574. app_device_type__app_version_number_id=version_number_id). \
  575. annotate(
  576. model=F('app_device_type__model'), type=F('app_device_type__type'), icon=F('app_device_type__icon'),
  577. name=F('app_device_type__devicenamelanguage__name'),
  578. sort=F('app_device_type__devicenamelanguage__sort'),
  579. app_version_number_id=F('app_device_type__app_version_number_id')).values('model', 'type', 'icon',
  580. 'name', 'sort',
  581. 'app_device_type__app_version_number_id')
  582. for app_bundle in app_bundle_qs:
  583. app_bundle_list.append({
  584. 'model': app_bundle['model'],
  585. 'type': app_bundle['type'],
  586. 'icon': app_bundle['icon'],
  587. 'name': app_bundle['name'],
  588. 'sort': app_bundle['sort'],
  589. 'app_device_type__app_version_number_id': app_bundle['app_device_type__app_version_number_id'],
  590. })
  591. dvr_list = [app_bundle for app_bundle in app_bundle_list if app_bundle['model'] == 1]
  592. ipc_list = [app_bundle for app_bundle in app_bundle_list if app_bundle['model'] == 2]
  593. print(dvr_list, ipc_list)
  594. res = {
  595. 'deviceDvr': sorted(dvr_list, key=operator.itemgetter('sort')),
  596. 'deviceIpc': sorted(ipc_list, key=operator.itemgetter('sort')),
  597. }
  598. return response.json(0, res)
  599. except Exception as e:
  600. print(e)
  601. return response.json(500, repr(e))
  602. @staticmethod
  603. def get_app_device_type_list(request_dict, response):
  604. app_bundle_id = request_dict.get('app_bundle_id', None)
  605. lang = request_dict.get('lang', 'cn')
  606. model = request_dict.get('model', None)
  607. type = request_dict.get('type', None)
  608. name = request_dict.get('name', None)
  609. pageNo = request_dict.get('pageNo', None)
  610. pageSize = request_dict.get('pageSize', None)
  611. if not all([pageNo, pageSize]):
  612. return response.json(444)
  613. page = int(pageNo)
  614. line = int(pageSize)
  615. try:
  616. if not app_bundle_id:
  617. app_bundle_id = 'com.ansjer.zccloud'
  618. app_bundle_qs = AppBundle.objects.filter(app_bundle_id=app_bundle_id)
  619. if lang:
  620. app_bundle_qs = app_bundle_qs.filter(app_device_type__devicenamelanguage__lang=lang)
  621. app_bundle_qs = app_bundle_qs.annotate(
  622. model=F('app_device_type__model'), type=F('app_device_type__type'), icon=F('app_device_type__icon'),
  623. lang=F('app_device_type__devicenamelanguage__lang'),
  624. name=F('app_device_type__devicenamelanguage__name'),
  625. sort=F('app_device_type__devicenamelanguage__sort')).values('id', 'app_device_type__id', 'model',
  626. 'type', 'icon',
  627. 'app_device_type__devicenamelanguage__id',
  628. 'lang', 'name', 'sort').order_by(
  629. 'app_device_type__devicenamelanguage__sort')
  630. if not app_bundle_qs.exists():
  631. return response.json(0)
  632. app_bundle_qs = app_bundle_qs.all()
  633. if name:
  634. app_bundle_qs = app_bundle_qs.filter(name=name)
  635. if model:
  636. app_bundle_qs = app_bundle_qs.filter(model=model)
  637. if type:
  638. app_bundle_qs = app_bundle_qs.filter(type=type)
  639. total = app_bundle_qs.count()
  640. app_bundle_qs = app_bundle_qs[(page - 1) * line:page * line]
  641. app_device_type_list = [app_bundle for app_bundle in app_bundle_qs]
  642. return response.json(0, {'list': app_device_type_list, 'total': total})
  643. except Exception as e:
  644. print(e)
  645. return response.json(500, repr(e))
  646. @staticmethod
  647. def get_app_bundle_id_list(response):
  648. try:
  649. app_info_qs = App_Info.objects.filter().values('id', 'appBundleId', 'appName')
  650. appBundleIdList = list(app_info_qs)
  651. return response.json(0, {'list': appBundleIdList})
  652. except Exception as e:
  653. print(e)
  654. return response.json(500, repr(e))
  655. @staticmethod
  656. def edit_app_device_type(request_dict, response):
  657. # app_device_type表数据
  658. app_device_type_id = request_dict.get('app_device_type__id', None)
  659. model = request_dict.get('model', None)
  660. type = request_dict.get('type', None)
  661. icon = request_dict.get('icon', None)
  662. # device_name_language表数据
  663. device_name_language_id = request_dict.get('app_device_type__devicenamelanguage__id', None)
  664. lang = request_dict.get('lang', None)
  665. name = request_dict.get('name', None)
  666. sort = request_dict.get('sort', None)
  667. if not all([app_device_type_id, model, type, icon, device_name_language_id, lang, name, sort]):
  668. return response.json(444)
  669. try:
  670. with transaction.atomic():
  671. AppDeviceType.objects.filter(id=app_device_type_id).update(model=model, type=type, icon=icon)
  672. DeviceNameLanguage.objects.filter(id=device_name_language_id).update(lang=lang, name=name, sort=sort)
  673. return response.json(0)
  674. except Exception as e:
  675. print(e)
  676. return response.json(500, repr(e))
  677. @staticmethod
  678. def delete_app_device_type(request_dict, response):
  679. app_bundle_id = request_dict.get('appBundleId', None)
  680. app_device_type_id = request_dict.get('appDeviceTypeId', None)
  681. if not all([app_bundle_id, app_device_type_id]):
  682. return response.json(444)
  683. try:
  684. app_bundle_qs = AppBundle.objects.get(id=app_bundle_id)
  685. app_device_type_qs = AppDeviceType.objects.filter(id=app_device_type_id)
  686. app_bundle_qs.app_device_type.remove(*app_device_type_qs)
  687. return response.json(0)
  688. except Exception as e:
  689. print(e)
  690. return response.json(500, repr(e))
  691. @staticmethod
  692. def reset_all(request, request_dict, response):
  693. uid = request_dict.get('uid', None)
  694. if not uid:
  695. return response.json(444)
  696. try:
  697. # 记录操作日志
  698. ip = CommonService.get_ip_address(request)
  699. content = json.loads(json.dumps(request_dict))
  700. log = {
  701. 'ip': ip,
  702. 'user_id': 2,
  703. 'status': 200,
  704. 'time': int(time.time()),
  705. 'url': 'deviceManagement/resetAll',
  706. 'content': json.dumps(content),
  707. 'operation': '{}重置所有'.format(uid),
  708. }
  709. with transaction.atomic():
  710. LogModel.objects.create(**log)
  711. # 删除主用户
  712. Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
  713. # 删除云存
  714. UID_Bucket.objects.filter(uid=uid).delete()
  715. Unused_Uid_Meal.objects.filter(uid=uid).delete()
  716. Order_Model.objects.filter(UID=uid, order_type=0).delete()
  717. StsCrdModel.objects.filter(uid=uid).delete()
  718. VodHlsModel.objects.filter(uid=uid).delete()
  719. # 删除vod_hls分表数据
  720. split_vod_hls_obj = SplitVodHlsObject()
  721. split_vod_hls_obj.del_vod_hls_data(uid=uid)
  722. ExperienceContextModel.objects.filter(uid=uid).delete()
  723. # 删除AI
  724. ExperienceAiModel.objects.filter(uid=uid).delete()
  725. AiService.objects.filter(uid=uid).delete()
  726. return response.json(0)
  727. except Exception as e:
  728. print(e)
  729. return response.json(500, repr(e))