DeviceManagementController.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import json
  4. import time
  5. import oss2
  6. from django.db import transaction
  7. from django.db.models import Q, F
  8. from django.views.generic.base import View
  9. from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
  10. from Model.models import Device_Info, UidSetModel, LogModel, UID_Bucket, Unused_Uid_Meal, Order_Model, StsCrdModel, \
  11. VodHlsModel, ExperienceContextModel, DeviceTypeModel, Equipment_Info, UidUserModel, ExperienceAiModel, AiService, \
  12. AppBundle
  13. from Object.ResponseObject import ResponseObject
  14. from Object.TokenObject import TokenObject
  15. from Service.CommonService import CommonService
  16. from Service.EquipmentInfoService import EquipmentInfoService
  17. from Service.ModelService import ModelService
  18. class DeviceManagement(View):
  19. def get(self, request, *args, **kwargs):
  20. request.encoding = 'utf-8'
  21. operation = kwargs.get('operation')
  22. return self.validation(request.GET, request, operation)
  23. def post(self, request, *args, **kwargs):
  24. request.encoding = 'utf-8'
  25. operation = kwargs.get('operation')
  26. return self.validation(request.POST, request, operation)
  27. def validation(self, request_dict, request, operation):
  28. language = request_dict.get('language', 'en')
  29. response = ResponseObject(language, 'pc')
  30. if operation == 'addDeviceType':
  31. return self.addDeviceType(request, request_dict, response)
  32. elif operation == 'delDeviceData': # 删除设备数据
  33. return self.del_device_data(request_dict, response)
  34. elif operation == 'getDeviceIcon': # app获取设备图标
  35. return self.get_device_icon(request_dict, response)
  36. else:
  37. tko = TokenObject(
  38. request.META.get('HTTP_AUTHORIZATION'),
  39. returntpye='pc')
  40. if tko.code != 0:
  41. return response.json(tko.code)
  42. response.lang = tko.lang
  43. userID = tko.userID
  44. if not userID:
  45. return response.json(444, 'userID')
  46. if operation == 'getDeviceInfoList': # 获取设备信息数据
  47. return self.get_device_info_list(request_dict, response)
  48. elif operation == 'deleteDevice':
  49. return self.deleteDevice(request_dict, response)
  50. elif operation == 'resetVod': # 重置云存
  51. return self.resetVod(request, request_dict, response)
  52. elif operation == 'resetAi': # 重置AI
  53. return self.reset_ai(request, request_dict, response)
  54. elif operation == 'resetPrimaryUser':
  55. return self.resetPrimaryUser(request, request_dict, response)
  56. elif operation == 'getDeviceTypeList':
  57. return self.getDeviceTypeList(request_dict, response)
  58. elif operation == 'deleteDeviceType':
  59. return self.deleteDeviceType(request_dict, response)
  60. else:
  61. return response.json(444, 'operation')
  62. @staticmethod
  63. def get_device_info_list(request_dict, response):
  64. pageNo = request_dict.get('pageNo', None)
  65. pageSize = request_dict.get('pageSize', None)
  66. UID = request_dict.get('UID', None)
  67. serialNumber = request_dict.get('serialNumber', None)
  68. NickName = request_dict.get('NickName', None)
  69. username = request_dict.get('username', None)
  70. if not all([pageNo, pageSize]):
  71. return response.json(444)
  72. page = int(pageNo)
  73. line = int(pageSize)
  74. try:
  75. if UID or serialNumber or NickName or username: # 条件查询
  76. if UID:
  77. device_info_qs = Device_Info.objects.filter(UID__contains=UID)
  78. if serialNumber:
  79. device_info_qs = Device_Info.objects.filter(serial_number__contains=serialNumber)
  80. if NickName:
  81. device_info_qs = Device_Info.objects.filter(NickName__contains=NickName)
  82. if username:
  83. device_info_qs = Device_Info.objects.filter(Q(userID__username__contains=username) |
  84. Q(userID__userEmail__contains=username) |
  85. Q(userID__phone__contains=username))
  86. total = device_info_qs.count()
  87. if not total:
  88. return response.json(0, {'list': {}, 'total': 0})
  89. device_info_qs = device_info_qs[(page - 1) * line:page * line]
  90. else: # 查询全部
  91. total = Device_Info.objects.filter().count()
  92. device_info_qs = Device_Info.objects.filter()[(page - 1) * line:page * line]
  93. if not device_info_qs.exists():
  94. return response.json(0, {'list': {}, 'total': 0})
  95. device_info_list = CommonService.qs_to_dict(device_info_qs)
  96. for k, v in enumerate(device_info_list["datas"]):
  97. for device_info in device_info_qs:
  98. if v['pk'] == device_info.id:
  99. # 设备的用户名和主用户
  100. username = ModelService.get_user_name(device_info_list["datas"][k]['fields']['userID'])
  101. device_info_list["datas"][k]['fields']['username'] = username
  102. device_info_list["datas"][k]['fields']['vodPrimaryMaster'] = \
  103. device_info_list["datas"][k]['fields']['vodPrimaryMaster']
  104. # 设备类型,是否支持Alexa和ip
  105. type = device_info_list["datas"][k]['fields']['Type']
  106. device_type_qs = DeviceTypeModel.objects.filter(type=type).values('name')
  107. if device_type_qs.exists():
  108. device_info_list["datas"][k]['fields']['Type'] = device_type_qs[0]['name']
  109. uid_set_qs = UidSetModel.objects.filter(
  110. uid=device_info_list["datas"][k]['fields']['UID']).values('is_alexa', 'ip', 'version')
  111. if uid_set_qs.exists():
  112. isAlexa = '是' if uid_set_qs[0]['is_alexa'] else '否'
  113. device_info_list["datas"][k]['fields']['isAlexa'] = isAlexa
  114. device_info_list["datas"][k]['fields']['ip'] = uid_set_qs[0]['ip']
  115. device_info_list["datas"][k]['fields']['version'] = uid_set_qs[0]['version']
  116. return response.json(0, {'list': device_info_list, 'total': total})
  117. except Exception as e:
  118. print(e)
  119. return response.json(500, repr(e))
  120. # 根据id删除设备
  121. def deleteDevice(self, request_dict, response):
  122. deviceID = request_dict.get('deviceID', None)
  123. userID = request_dict.get('userID', None)
  124. uid = request_dict.get('uid', None)
  125. if not all([deviceID, userID, uid]):
  126. return response.json(444)
  127. try:
  128. with transaction.atomic():
  129. Device_Info.objects.filter(id=deviceID).delete()
  130. # 删除推送消息
  131. for val in range(1, 8):
  132. EquipmentInfoService.get_equipment_info_model('', val). \
  133. filter(device_user_id=userID, device_uid=uid).delete()
  134. return response.json(0)
  135. except Exception as e:
  136. print(e)
  137. return response.json(500, repr(e))
  138. # 重置设备主用户
  139. def resetPrimaryUser(self, request, request_dict, response):
  140. uid = request_dict.get('uid', None)
  141. if not uid:
  142. return response.json(404)
  143. try:
  144. # 记录操作日志
  145. ip = CommonService.get_ip_address(request)
  146. content = json.loads(json.dumps(request_dict))
  147. log = {
  148. 'ip': ip,
  149. 'user_id': 2,
  150. 'status': 200,
  151. 'time': int(time.time()),
  152. 'url': 'deviceManagement/resetPrimaryUser',
  153. 'content': json.dumps(content),
  154. 'operation': '{}重置设备主用户'.format(uid),
  155. }
  156. LogModel.objects.create(**log)
  157. Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
  158. return response.json(0)
  159. except Exception as e:
  160. return response.json(500, repr(e))
  161. # 重置设备云存
  162. def resetVod(self, request, request_dict, response):
  163. uid = request_dict.get('uid', None)
  164. if not uid:
  165. return response.json(444)
  166. try:
  167. # 记录操作日志
  168. ip = CommonService.get_ip_address(request)
  169. content = json.loads(json.dumps(request_dict))
  170. log = {
  171. 'ip': ip,
  172. 'user_id': 2,
  173. 'status': 200,
  174. 'time': int(time.time()),
  175. 'url': 'deviceManagement/resetVod',
  176. 'content': json.dumps(content),
  177. 'operation': '{}重置云存'.format(uid),
  178. }
  179. with transaction.atomic():
  180. LogModel.objects.create(**log)
  181. # 删除和更新设备云存相关数据
  182. UID_Bucket.objects.filter(uid=uid).delete()
  183. Unused_Uid_Meal.objects.filter(uid=uid).delete()
  184. Order_Model.objects.filter(UID=uid, order_type=0).delete()
  185. StsCrdModel.objects.filter(uid=uid).delete()
  186. VodHlsModel.objects.filter(uid=uid).delete()
  187. ExperienceContextModel.objects.filter(uid=uid).delete()
  188. Device_Info.objects.filter(UID=uid).update(vodPrimaryUserID='', vodPrimaryMaster='')
  189. return response.json(0)
  190. except Exception as e:
  191. print(e)
  192. return response.json(500, repr(e))
  193. @staticmethod
  194. def reset_ai(request, request_dict, response):
  195. uid = request_dict.get('uid', None)
  196. if not uid:
  197. return response.json(444)
  198. try:
  199. # 记录操作日志
  200. ip = CommonService.get_ip_address(request)
  201. content = json.loads(json.dumps(request_dict))
  202. log = {
  203. 'ip': ip,
  204. 'user_id': 2,
  205. 'status': 200,
  206. 'time': int(time.time()),
  207. 'url': 'deviceManagement/resetAi',
  208. 'content': json.dumps(content),
  209. 'operation': '{}重置AI'.format(uid),
  210. }
  211. with transaction.atomic():
  212. LogModel.objects.create(**log)
  213. # 删除和更新设备AI相关数据
  214. ExperienceAiModel.objects.filter(uid=uid).delete()
  215. AiService.objects.filter(uid=uid).delete()
  216. return response.json(0)
  217. except Exception as e:
  218. print(e)
  219. return response.json(500, repr(e))
  220. # 获取设备类型数据
  221. def getDeviceTypeList(self, request_dict, response):
  222. name = request_dict.get('name', None)
  223. pageNo = request_dict.get('pageNo', None)
  224. pageSize = request_dict.get('pageSize', None)
  225. if not all([pageNo, pageSize]):
  226. return response.json(444)
  227. page = int(pageNo)
  228. line = int(pageSize)
  229. try:
  230. if name:
  231. device_type_qs = DeviceTypeModel.objects.filter(name__contains=name).values()
  232. total = len(device_type_qs)
  233. else:
  234. device_type_qs = DeviceTypeModel.objects.filter().values()[(page - 1) * line:page * line]
  235. total = DeviceTypeModel.objects.filter().count()
  236. if not device_type_qs.exists():
  237. return response.json(173)
  238. device_type_list = []
  239. for device_type in device_type_qs:
  240. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  241. bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
  242. icon = device_type['icon']
  243. url = 'device_type/' + icon
  244. device_type['icon'] = bucket.sign_url('GET', url, 3600)
  245. device_type_list.append(device_type)
  246. return response.json(0, {'list': device_type_list, 'total': total})
  247. except Exception as e:
  248. print(e)
  249. return response.json(500, repr(e))
  250. # 删除设备类型
  251. def deleteDeviceType(self, request_dict, response):
  252. deviceTypeID = request_dict.get('deviceTypeID', None)
  253. if not deviceTypeID:
  254. return response.json(444)
  255. try:
  256. DeviceTypeModel.objects.filter(id=deviceTypeID).delete()
  257. return response.json(0)
  258. except Exception as e:
  259. print(e)
  260. return response.json(500, repr(e))
  261. # 添加设备类型
  262. def addDeviceType(self, request, request_dict, response):
  263. iconFile = request.FILES.get('iconFile', None)
  264. name = request_dict.get('name', None)
  265. model = request_dict.get('model', None)
  266. type = request_dict.get('type', None)
  267. ptz_type = request_dict.get('ptz_type', None)
  268. if not all([iconFile, name, model, type, ptz_type]):
  269. return response.json(444)
  270. try:
  271. model = int(model)
  272. ptz_type = int(ptz_type)
  273. icon = iconFile.name
  274. now_time = int(time.time())
  275. # 上传文件到阿里云OSS
  276. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  277. bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
  278. key = 'device_type/' + icon # 图片文件存放于 device_type 目录下
  279. # https://oss.console.aliyun.com/bucket/oss-cn-shenzhen/ansjer-static-resources/object?path=device_type%2F
  280. bucket.put_object(key=key, data=iconFile)
  281. DeviceTypeModel.objects.create(name=name, model=model, type=type, ptz_type=ptz_type, icon=icon,
  282. add_time=now_time, update_time=now_time)
  283. return response.json(0)
  284. except Exception as e:
  285. print(e)
  286. return response.json(500, repr(e))
  287. @staticmethod
  288. def del_device_data(request_dict, response):
  289. uidList = request_dict.get('uidList', None)
  290. delDataOptions = request_dict.get('delDataOptions', None)
  291. if not all([uidList, delDataOptions]):
  292. return response.json(444)
  293. try:
  294. with transaction.atomic():
  295. uidList = uidList.splitlines() # 按行('\r', '\r\n', \n')切割字符串返回列表
  296. # 根据删除项删除相关数据
  297. if '设备信息数据' in delDataOptions:
  298. Device_Info.objects.filter(UID__in=uidList).delete()
  299. if '设备配置数据' in delDataOptions:
  300. UidSetModel.objects.filter(uid__in=uidList).delete()
  301. if '设备推送数据' in delDataOptions:
  302. Equipment_Info.objects.filter(devUid__in=uidList).delete()
  303. if '设备AP信息数据' in delDataOptions:
  304. UidUserModel.objects.filter(UID__in=uidList).delete()
  305. if '设备AI数据' in delDataOptions:
  306. ExperienceAiModel.objects.filter(uid__in=uidList).delete()
  307. Order_Model.objects.filter(UID__in=uidList, order_type=1).delete()
  308. if '设备云存数据' in delDataOptions:
  309. UID_Bucket.objects.filter(uid__in=uidList).delete()
  310. StsCrdModel.objects.filter(uid__in=uidList).delete()
  311. VodHlsModel.objects.filter(uid__in=uidList).delete()
  312. Unused_Uid_Meal.objects.filter(uid__in=uidList).delete()
  313. ExperienceContextModel.objects.filter(uid__in=uidList).delete()
  314. Order_Model.objects.filter(UID__in=uidList, order_type=0).delete()
  315. Device_Info.objects.filter(UID__in=uidList).update(vodPrimaryUserID='', vodPrimaryMaster='')
  316. return response.json(0)
  317. except Exception as e:
  318. print(e)
  319. return response.json(500, repr(e))
  320. @staticmethod
  321. def get_device_icon(request_dict, response):
  322. lang = request_dict.get('lang', None)
  323. app_bundle_id = request_dict.get('app_bundle_id', None)
  324. if not all([lang, app_bundle_id]):
  325. return response.json(444)
  326. try:
  327. app_bundle_qs = AppBundle.objects.filter(app_bundle_id=app_bundle_id,
  328. app_device_type__devicenamelanguage__lang=lang).annotate(
  329. model=F('app_device_type__model'), type=F('app_device_type__type'), icon=F('app_device_type__icon'),
  330. name=F('app_device_type__devicenamelanguage__name'), sort=F('app_device_type__devicenamelanguage__sort')).values('model', 'type', 'icon', 'name', 'sort')
  331. dvr_list = [app_bundle for app_bundle in app_bundle_qs if app_bundle['model'] == 1]
  332. ipc_list = [app_bundle for app_bundle in app_bundle_qs if app_bundle['model'] == 2]
  333. print(dvr_list, ipc_list)
  334. res = {
  335. 'deviceDvr': dvr_list,
  336. 'deviceIpc': ipc_list,
  337. }
  338. return response.json(0, res)
  339. except Exception as e:
  340. print(e)
  341. return response.json(500, repr(e))