EquipmentManagerV3.py 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117
  1. import base64
  2. import json
  3. import re
  4. import threading
  5. import time
  6. import oss2
  7. import requests
  8. from django.db import transaction
  9. from django.db.models import Q
  10. from django.views.generic.base import View
  11. from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
  12. from Controller.CheckUserData import RandomStr
  13. from Controller.DeviceConfirmRegion import Device_Region
  14. from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyView
  15. from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, \
  16. Device_User, iotdeviceInfoModel, UIDCompanySerialModel, UIDModel, UnicomDeviceInfo, CountryModel
  17. from Object.ResponseObject import ResponseObject
  18. from Object.TokenObject import TokenObject
  19. from Service.CommonService import CommonService
  20. from Service.EquipmentInfoService import EquipmentInfoService
  21. from Service.ModelService import ModelService
  22. class EquipmentManagerV3(View):
  23. def get(self, request, *args, **kwargs):
  24. request.encoding = 'utf-8'
  25. operation = kwargs.get('operation')
  26. return self.validation(request.GET, request, operation)
  27. def post(self, request, *args, **kwargs):
  28. request.encoding = 'utf-8'
  29. operation = kwargs.get('operation')
  30. return self.validation(request.POST, request, operation)
  31. def validation(self, request_dict, request, operation):
  32. response = ResponseObject()
  33. if operation == 'notLoginMainUserDevice':
  34. return self.not_login_do_mainUserDevice(request_dict, response)
  35. elif operation == 'notLoginMainDelDevice':
  36. return self.test_tool_del_device(request_dict, response)
  37. token = request_dict.get('token', None)
  38. tko = TokenObject(token)
  39. if tko.code != 0:
  40. return response.json(tko.code)
  41. response.lang = tko.lang
  42. userID = tko.userID
  43. # 手机端添加设备,查询,修改
  44. if operation == 'add':
  45. return self.do_add(userID, request_dict, response, request)
  46. if operation == 'batchAdd':
  47. return self.do_batch_add(userID, request_dict, response, request)
  48. elif operation == 'query':
  49. return self.do_query(userID, request_dict, response)
  50. elif operation == 'modify':
  51. return self.do_modify(userID, request_dict, response, request)
  52. elif operation == 'modifyChannelName':
  53. return self.do_modify_channel_name(userID, request_dict, response, request)
  54. elif operation == 'fuzzyQuery':
  55. return self.do_fuzzy_query(userID, request_dict, response)
  56. elif operation == 'mainUserDevice':
  57. return self.do_mainUserDevice(request_dict, response)
  58. elif operation == 'getDeviceFeatures':
  59. return self.do_get_device_features(request_dict, response)
  60. else:
  61. return response.json(414)
  62. def do_add(self, userID, request_dict, response, request):
  63. UID = request_dict.get('UID', None)
  64. NickName = request_dict.get('NickName', None)
  65. View_Account = request_dict.get('View_Account', None)
  66. View_Password = request_dict.get('View_Password', '')
  67. encrypt_pass = View_Password
  68. print("准备解密")
  69. Type = request_dict.get('Type', None)
  70. ChannelIndex = request_dict.get('ChannelIndex', None)
  71. version = request_dict.get('version', '')
  72. isCheckMainUser = request_dict.get('isCheckMainUser', None)
  73. family_id = request_dict.get('familyId', None)
  74. room_id = request_dict.get('roomId', None)
  75. if not all([UID, NickName, View_Account, Type, ChannelIndex]): # Type和ChannelIndex可能为0
  76. return response.json(444, {'param': 'UID, NickName, View_Account, Type, ChannelIndex'})
  77. Type = int(Type)
  78. ChannelIndex = int(ChannelIndex)
  79. re_uid = re.compile(r'^[A-Za-z0-9]{14,20}$')
  80. if not re_uid.match(UID):
  81. return response.json(444, {'param': 'UID'})
  82. device_info_qs = Device_Info.objects.filter(UID=UID, userID_id=userID)
  83. if device_info_qs:
  84. # 判断设备是否已存在
  85. if device_info_qs[0].isExist == 1:
  86. return response.json(174)
  87. else:
  88. device_info_qs.delete()
  89. dvr_type_list = [1, 2, 3, 4, 10001]
  90. View_Password = '' if Type in dvr_type_list else 'admin'
  91. id = CommonService.getUserID(getUser=False)
  92. userName = Device_User.objects.get(userID=userID).username
  93. main_exist = Device_Info.objects.filter(UID=UID)
  94. main_exist = main_exist.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID', 'vodPrimaryMaster')
  95. vodPrimaryUserID = userID
  96. vodPrimaryMaster = userName
  97. primaryUserID = ''
  98. primaryMaster = ''
  99. isShare = False
  100. is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID', 'primaryUserID',
  101. 'primaryMaster')
  102. if main_exist.exists():
  103. vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
  104. vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
  105. if is_bind.exists():
  106. primaryUserID = is_bind[0]['primaryUserID']
  107. primaryMaster = is_bind[0]['primaryMaster']
  108. isShare = True
  109. isusermain = False
  110. if (vodPrimaryUserID != userID and vodPrimaryUserID != '') or (primaryUserID != userID and primaryUserID != ''):
  111. isusermain = True
  112. # 判断是否有已绑定用户
  113. if isCheckMainUser == '1' and isusermain:
  114. res = {
  115. 'id': id,
  116. 'userID': userID,
  117. 'NickName': NickName,
  118. 'UID': UID,
  119. 'View_Account': View_Account,
  120. 'View_Password': View_Password,
  121. 'ChannelIndex': ChannelIndex,
  122. 'Type': Type,
  123. 'isShare': isShare,
  124. 'primaryUserID': primaryUserID,
  125. 'primaryMaster': primaryMaster,
  126. 'vodPrimaryUserID': vodPrimaryUserID,
  127. 'vodPrimaryMaster': vodPrimaryMaster,
  128. 'data_joined': '',
  129. 'version': version,
  130. 'isVod': 0,
  131. 'isExist': 1,
  132. 'userID__userEmail': ''
  133. }
  134. res['vod'] = [
  135. {
  136. "status": 1,
  137. "channel": ChannelIndex,
  138. "endTime": '',
  139. "bucket__content": '',
  140. "uid": UID
  141. }
  142. ]
  143. res['isMainUserExists'] = 1
  144. return response.json(0, res)
  145. try:
  146. # 判断是否有用户绑定
  147. nowTime = int(time.time())
  148. us_qs = UidSetModel.objects.filter(uid=UID)
  149. if us_qs.exists():
  150. us_qs.update(nickname=NickName, device_type=Type)
  151. UidSet_id = us_qs.first().id
  152. else:
  153. ip = CommonService.get_ip_address(request)
  154. ipInfo = CommonService.getIpIpInfo(ip, 'CN')
  155. country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
  156. country = country_qs.exists() if country_qs[0]['id'] else 0
  157. region_id = Device_Region().get_device_region(ip)
  158. region_alexa = 'CN' if region_id == 1 else 'ALL'
  159. uid_set_create_dict = {
  160. 'uid': UID,
  161. 'addTime': nowTime,
  162. 'updTime': nowTime,
  163. 'ip': CommonService.get_ip_address(request_dict),
  164. 'channel': ChannelIndex,
  165. 'nickname': NickName,
  166. 'version': version,
  167. 'region_alexa': region_alexa,
  168. 'device_type': Type,
  169. 'tb_country': country
  170. }
  171. UidSet = UidSetModel.objects.create(**uid_set_create_dict)
  172. UidSet_id = UidSet.id
  173. # 查询uid_channel表有无该uid的数据
  174. uid_channel_set = UidChannelSetModel.objects.filter(uid_id=UidSet_id)
  175. if not uid_channel_set.exists():
  176. # 多通道设备设置通道名
  177. if Type in dvr_type_list:
  178. UidChannelSet_bulk = []
  179. for i in range(1, ChannelIndex + 1):
  180. channel_name = 'channel' + str(i) # channel1,channel2...
  181. UidChannelSet = UidChannelSetModel(uid_id=UidSet_id, channel=i, channel_name=channel_name)
  182. UidChannelSet_bulk.append(UidChannelSet)
  183. UidChannelSetModel.objects.bulk_create(UidChannelSet_bulk)
  184. userDevice = Device_Info(id=id, userID_id=userID, UID=UID, NickName=NickName, View_Account=View_Account,
  185. View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex, version=version,
  186. vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
  187. userDevice.save()
  188. # 添加到家庭房间
  189. if family_id:
  190. EquipmentFamilyView.family_room_device_save(family_id, room_id, userDevice.id, Type)
  191. uid_serial_qs = UIDCompanySerialModel.objects.filter(uid__uid=UID)
  192. if uid_serial_qs.exists():
  193. uid_serial = uid_serial_qs[0]
  194. serial_number = uid_serial.company_serial.serial_number + uid_serial.company_serial.company.mark
  195. Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
  196. vodPrimaryMaster=vodPrimaryMaster,
  197. serial_number=serial_number)
  198. self.unicom_user_info_save(userID, serial_number)
  199. else:
  200. Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
  201. vodPrimaryMaster=vodPrimaryMaster)
  202. if not us_qs.exists():
  203. us_qs = UidSetModel.objects.filter(uid=UID)
  204. if us_qs.exists() and us_qs[0].is_alexa == 1:
  205. if us_qs[0].channel > 1:
  206. data_list = []
  207. uid_channel_set_qs = UidChannelSetModel.objects.filter(uid_id=us_qs[0].id). \
  208. values('channel', 'channel_name')
  209. if uid_channel_set_qs.exists():
  210. # 多通道设备名为 UidChannelSetModel 的 channel_name
  211. for uid_channel_set in uid_channel_set_qs:
  212. data_list.append({'userID': userID, 'UID': UID, 'uid_nick': uid_channel_set['channel_name'],
  213. 'channel': uid_channel_set['channel'], 'password': encrypt_pass})
  214. else:
  215. data_list = [{'userID': userID, 'UID': UID, 'uid_nick': NickName, 'password': encrypt_pass}]
  216. # 请求Alexa服务器更新事件网关
  217. data_list = json.dumps(data_list)
  218. data = {'data_list': data_list}
  219. url = 'https://www.zositech.xyz/deviceStatus/addOrUpdateV2'
  220. requests.post(url, data=data, timeout=2)
  221. except Exception as e:
  222. return response.json(10, repr(e))
  223. else:
  224. dvqs = Device_Info.objects.filter(id=id).values('id', 'userID', 'NickName', 'UID',
  225. 'View_Account',
  226. 'View_Password', 'ChannelIndex', 'Type',
  227. 'isShare',
  228. 'primaryUserID', 'primaryMaster',
  229. 'vodPrimaryUserID', 'vodPrimaryMaster',
  230. 'userID__userEmail',
  231. 'data_joined', 'version',
  232. 'isVod', 'isExist', 'isCameraOpenCloud', 'serial_number')
  233. dvql = CommonService.qs_to_list(dvqs)
  234. ubqs = UID_Bucket.objects.filter(uid=UID). \
  235. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  236. res = dvql[0]
  237. res['vod'] = list(ubqs)
  238. iotqs = iotdeviceInfoModel.objects.filter(serial_number=dvql[0]['serial_number'])
  239. if iotqs.exists():
  240. res['iot'] = {
  241. 'endpoint': iotqs[0].endpoint,
  242. 'token_iot_number': iotqs[0].endpoint
  243. }
  244. # 存在序列号返回完整序列号
  245. if res['serial_number']:
  246. res['serial_number'] = CommonService.get_full_serial_number(UID, res['serial_number'], Type)
  247. return response.json(0, res)
  248. @classmethod
  249. def unicom_user_info_save(cls, user_id, serial_number):
  250. """
  251. 保存联通与用户信息绑定
  252. @param user_id: 用户id
  253. @param serial_number: 序列号
  254. @return: True | False
  255. """
  256. unicom_device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=serial_number)
  257. if not unicom_device_info_qs.exists():
  258. return False
  259. if not unicom_device_info_qs[0].user_id:
  260. unicom_device_info_qs.update(user_id=user_id)
  261. return True
  262. def do_batch_add(self, userID, request_dict, response, request):
  263. # 批量添加设备
  264. uidContent = request_dict.get('uidContent', None)
  265. if not uidContent:
  266. return response.json(444, {'param': 'uidContent'})
  267. try:
  268. deviceNumber = 0 # 添加成功数量
  269. add_success_flag = False # 添加成功标识
  270. exception_flag = False # 异常标识
  271. exists_flag = False # 已存在标识
  272. uid_content_list = eval(uidContent)
  273. print('uidContent: ', uid_content_list)
  274. re_uid = re.compile(r'^[A-Za-z0-9]{14,20}$')
  275. for uid_content in uid_content_list:
  276. exception_flag = False # 重置异常标识
  277. exists_flag = False # 已存在标识
  278. UID = uid_content['uid']
  279. NickName = uid_content['nickName']
  280. Type = uid_content['type']
  281. ChannelIndex = uid_content['channelIndex']
  282. version = uid_content['version']
  283. isCheckMainUser = uid_content['isCheckMainUser']
  284. View_Account = uid_content['viewAccount']
  285. encryptPassword = uid_content['encryptPassword']
  286. View_Password = self.decode_pwd(encryptPassword)
  287. if not all([UID, NickName, View_Account]): # Type和ChannelIndex可能为0
  288. return response.json(444, {'param': 'UID, NickName, View_Account'})
  289. if not re_uid.match(UID): # 检查uid长度
  290. return response.json(444, {'error uid length': UID})
  291. device_info_qs = Device_Info.objects.filter(UID=UID, userID_id=userID)
  292. if device_info_qs:
  293. # 判断设备是否已存在
  294. if device_info_qs[0].isExist == 1:
  295. exists_res = {UID: 'device already exists!'}
  296. exists_flag = True
  297. continue
  298. else:
  299. device_info_qs.delete()
  300. id = CommonService.getUserID(getUser=False)
  301. userName = Device_User.objects.get(userID=userID).username
  302. main_exist = Device_Info.objects.filter(UID=UID)
  303. main_exist = main_exist.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID', 'vodPrimaryMaster')
  304. vodPrimaryUserID = userID
  305. vodPrimaryMaster = userName
  306. primaryUserID = ''
  307. primaryMaster = ''
  308. isShare = False
  309. is_bind = Device_Info.objects.filter(UID=UID, isShare=False).values('userID__userID', 'primaryUserID',
  310. 'primaryMaster', 'Type')
  311. if main_exist.exists():
  312. vodPrimaryUserID = main_exist[0]['vodPrimaryUserID']
  313. vodPrimaryMaster = main_exist[0]['vodPrimaryMaster']
  314. if is_bind.exists():
  315. primaryUserID = is_bind[0]['primaryUserID']
  316. primaryMaster = is_bind[0]['primaryMaster']
  317. isShare = True
  318. isusermain = False
  319. if (vodPrimaryUserID != userID and vodPrimaryUserID != '') or (
  320. primaryUserID != userID and primaryUserID != ''):
  321. isusermain = True
  322. # 判断是否有已绑定用户
  323. if isCheckMainUser == 1 and isusermain:
  324. res = {
  325. 'id': id,
  326. 'userID': userID,
  327. 'NickName': NickName,
  328. 'UID': UID,
  329. 'View_Account': View_Account,
  330. 'View_Password': View_Password,
  331. 'ChannelIndex': ChannelIndex,
  332. 'Type': Type,
  333. 'isShare': isShare,
  334. 'primaryUserID': primaryUserID,
  335. 'primaryMaster': primaryMaster,
  336. 'vodPrimaryUserID': vodPrimaryUserID,
  337. 'vodPrimaryMaster': vodPrimaryMaster,
  338. 'data_joined': '',
  339. 'version': version,
  340. 'isVod': 0,
  341. 'isExist': 1,
  342. 'userID__userEmail': ''
  343. }
  344. res['vod'] = [
  345. {
  346. "status": 1,
  347. "channel": ChannelIndex,
  348. "endTime": '',
  349. "bucket__content": '',
  350. "uid": UID
  351. }
  352. ]
  353. res['isMainUserExists'] = 1
  354. continue
  355. # 判断是否有用户绑定
  356. nowTime = int(time.time())
  357. us_qs = UidSetModel.objects.filter(uid=UID)
  358. if us_qs.exists():
  359. us_qs.update(nickname=NickName)
  360. UidSet_id = us_qs.first().id
  361. else:
  362. ip = CommonService.get_ip_address(request)
  363. ipInfo = CommonService.getIpIpInfo(ip, 'CN')
  364. country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
  365. country = country_qs.exists() if country_qs[0]['id'] else 0
  366. region_id = Device_Region().get_device_region(ip)
  367. region_alexa = 'CN' if region_id == 1 else 'ALL'
  368. uid_set_create_dict = {
  369. 'uid': UID,
  370. 'addTime': nowTime,
  371. 'updTime': nowTime,
  372. 'ip': CommonService.get_ip_address(request_dict),
  373. 'channel': ChannelIndex,
  374. 'nickname': NickName,
  375. 'version': version,
  376. 'region_alexa': region_alexa,
  377. 'device_type': is_bind[0]['Type'],
  378. 'tb_country': country
  379. }
  380. UidSet = UidSetModel.objects.create(**uid_set_create_dict)
  381. UidSet_id = UidSet.id
  382. # 查询uid_channel表有无该uid的数据
  383. uid_channel_set = UidChannelSetModel.objects.filter(uid_id=UidSet_id)
  384. if not uid_channel_set.exists():
  385. # 多通道设备设置通道名
  386. multi_channel_list = [1, 2, 3, 4, 10001]
  387. if Type in multi_channel_list:
  388. UidChannelSet_bulk = []
  389. for i in range(1, ChannelIndex + 1):
  390. channel_name = 'channel' + str(i) # channel1,channel2...
  391. UidChannelSet = UidChannelSetModel(uid_id=UidSet_id, channel=i, channel_name=channel_name)
  392. UidChannelSet_bulk.append(UidChannelSet)
  393. UidChannelSetModel.objects.bulk_create(UidChannelSet_bulk)
  394. userDevice = Device_Info(id=id, userID_id=userID, UID=UID, NickName=NickName, View_Account=View_Account,
  395. View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex,
  396. version=version,
  397. vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
  398. userDevice.save()
  399. uid_serial_qs = UIDCompanySerialModel.objects.filter(uid__uid=UID)
  400. if uid_serial_qs.exists():
  401. uid_serial = uid_serial_qs[0]
  402. Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
  403. vodPrimaryMaster=vodPrimaryMaster,
  404. serial_number=uid_serial.company_serial.serial_number + uid_serial.company_serial.company.mark)
  405. else:
  406. Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
  407. vodPrimaryMaster=vodPrimaryMaster)
  408. if not us_qs.exists():
  409. us_qs = UidSetModel.objects.filter(uid=UID)
  410. if us_qs.exists() and us_qs[0].is_alexa == 1:
  411. if us_qs[0].channel > 1:
  412. data_list = []
  413. uid_channel_set_qs = UidChannelSetModel.objects.filter(uid_id=us_qs[0].id). \
  414. values('channel', 'channel_name')
  415. if uid_channel_set_qs.exists():
  416. # 多通道设备名为 UidChannelSetModel 的 channel_name
  417. for uid_channel_set in uid_channel_set_qs:
  418. data_list.append(
  419. {'userID': userID, 'UID': UID, 'uid_nick': uid_channel_set['channel_name'],
  420. 'channel': uid_channel_set['channel'], 'password': encryptPassword})
  421. else:
  422. data_list = [{'userID': userID, 'UID': UID, 'uid_nick': NickName, 'password': encryptPassword}]
  423. # 请求Alexa服务器更新事件网关
  424. data_list = json.dumps(data_list)
  425. data = {'data_list': data_list}
  426. url = 'https://www.zositech.xyz/deviceStatus/addOrUpdateV2'
  427. requests.post(url, data=data, timeout=2)
  428. dvqs = Device_Info.objects.filter(id=id).values('id', 'userID', 'NickName', 'UID',
  429. 'View_Account',
  430. 'View_Password', 'ChannelIndex', 'Type',
  431. 'isShare',
  432. 'primaryUserID', 'primaryMaster',
  433. 'vodPrimaryUserID', 'vodPrimaryMaster',
  434. 'userID__userEmail',
  435. 'data_joined', 'version',
  436. 'isVod', 'isExist', 'isCameraOpenCloud',
  437. 'serial_number')
  438. dvql = CommonService.qs_to_list(dvqs)
  439. ubqs = UID_Bucket.objects.filter(uid=UID). \
  440. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  441. success_res = dvql[0]
  442. success_res['vod'] = list(ubqs)
  443. iotqs = iotdeviceInfoModel.objects.filter(serial_number=dvql[0]['serial_number'])
  444. if iotqs.exists():
  445. success_res['iot'] = {'endpoint': iotqs[0].endpoint, 'token_iot_number': iotqs[0].endpoint}
  446. deviceNumber += 1
  447. success_res['deviceNumber'] = deviceNumber
  448. add_success_flag = True
  449. except Exception as e:
  450. print(e)
  451. error_res = repr(e)
  452. exception_flag = True
  453. pass
  454. finally:
  455. if add_success_flag: # 有一台添加成功则返回成功
  456. return response.json(0, success_res)
  457. if exists_flag: # 全部设备已存在
  458. return response.json(174, exists_res)
  459. if exception_flag:
  460. return response.json(500, error_res)
  461. return response.json(0, res)
  462. def do_modify(self, userID, request_dict, response, request):
  463. token = request_dict.get('token', None)
  464. deviceContent = request_dict.get('content', None)
  465. id = request_dict.get('id', None)
  466. if not deviceContent or not id:
  467. return response.json(444, 'content,id')
  468. tko = TokenObject(token)
  469. response.lang = tko.lang
  470. if tko.code != 0:
  471. return response.json(tko.code)
  472. userID = tko.userID
  473. if userID is None:
  474. return response.json(309)
  475. try:
  476. deviceData = eval(deviceContent)
  477. if deviceData.__contains__('userID_id'):
  478. asy = threading.Thread(target=ModelService.update_log,
  479. args=(CommonService.get_ip_address(request), userID, 'modifyV3', deviceData, id))
  480. asy.start()
  481. return response.json(10, '110')
  482. if deviceData.__contains__('UID'):
  483. del deviceData['UID']
  484. # print(deviceData['View_Password'])
  485. if deviceData.__contains__('View_Password'):
  486. encrypt_pwd = deviceData['View_Password']
  487. deviceData['View_Password'] = self.decode_pwd(deviceData['View_Password'])
  488. dev_info_qs = Device_Info.objects.filter(userID_id=userID, id=id)
  489. dev_info_qs.update(**deviceData)
  490. except Exception as e:
  491. print(e)
  492. return response.json(177, repr(e))
  493. else:
  494. qs = Device_Info.objects.filter(userID_id=userID, id=id)
  495. res = CommonService.qs_to_dict(qs)
  496. if qs.exists():
  497. uid = qs[0].UID
  498. nickname = qs[0].NickName
  499. # 增加设备影子信息修改昵称 start
  500. us_qs = UidSetModel.objects.filter(uid=uid)
  501. if us_qs.exists():
  502. if deviceData.__contains__('NickName'):
  503. us_qs.update(nickname=nickname)
  504. else:
  505. ip = CommonService.get_ip_address(request)
  506. ipInfo = CommonService.getIpIpInfo(ip, 'CN')
  507. country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
  508. country = country_qs.exists() if country_qs[0]['id'] else 0
  509. ChannelIndex = qs[0].ChannelIndex
  510. nowTime = int(time.time())
  511. uid_set_create_dict = {
  512. 'uid': uid,
  513. 'addTime': nowTime,
  514. 'updTime': nowTime,
  515. 'ip': CommonService.get_ip_address(request),
  516. 'channel': ChannelIndex,
  517. 'nickname': nickname,
  518. 'device_type': qs[0].Type,
  519. 'tb_country': country
  520. }
  521. UidSetModel.objects.create(**uid_set_create_dict)
  522. di_qs = Device_Info.objects.filter(UID=uid)
  523. di_qs.update(NickName=nickname)
  524. if deviceData is not None and deviceData.__contains__('NickName') and us_qs[0].is_alexa == 1:
  525. # 请求Alexa服务器更新事件网关
  526. url = 'https://www.zositech.xyz/deviceStatus/addOrUpdateV2'
  527. password = encrypt_pwd if deviceData.__contains__('View_Password') else ''
  528. data_list = [{'userID': userID, 'UID': uid, 'uid_nick': nickname, 'password': password}]
  529. data_list = json.dumps(data_list)
  530. data = {'data_list': data_list}
  531. requests.post(url, data=data, timeout=2)
  532. return response.json(0, res)
  533. # 编辑通道名
  534. def do_modify_channel_name(self, userID, request_dict, response):
  535. uid = request_dict.get('uid', None)
  536. channel = request_dict.get('channel', None)
  537. channel_name = request_dict.get('channel_name', None)
  538. if not all([uid, channel, channel_name]):
  539. return response.json(444)
  540. # 更新通道名
  541. UidChannelSetModel.objects.filter(uid__uid=uid).update(channel_name=channel_name)
  542. return response.json(0)
  543. # 新查询设备字段
  544. def do_query(self, userID, request_dict, response):
  545. token = request_dict.get('token', None)
  546. page = request_dict.get('page', None)
  547. line = request_dict.get('line', None)
  548. NickName = request_dict.get('NickName', None)
  549. if not token or not page or not line:
  550. return response.json(444)
  551. page = int(page)
  552. line = int(line)
  553. uid = request_dict.get('uid', None)
  554. tko = TokenObject(token)
  555. response.lang = tko.lang
  556. if page <= 0:
  557. return response.json(0)
  558. if tko.code != 0:
  559. return response.json(tko.code)
  560. userID = tko.userID
  561. dvqs = Device_Info.objects.filter(userID_id=userID)
  562. # # 过滤已重置的设备
  563. dvqs = dvqs.filter(~Q(isExist=2))
  564. if NickName:
  565. dvqs = dvqs.filter(NickName=NickName)
  566. if uid:
  567. dvqs = dvqs.filter(UID=uid)
  568. dvql = dvqs.values('id', 'userID', 'NickName', 'UID', 'View_Account', 'View_Password', 'ChannelIndex',
  569. 'Type', 'isShare', 'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID',
  570. 'vodPrimaryMaster', 'userID__userEmail', 'version', 'isVod', 'isExist', 'NotificationMode',
  571. 'isCameraOpenCloud', 'serial_number')[(page - 1) * line:page * line]
  572. dvls = CommonService.qs_to_list(dvql)
  573. uid_list = []
  574. for dvl in dvls:
  575. if dvl['primaryUserID'] and dvl['id'] == dvl['primaryUserID']:
  576. dvl['isPrimaryUser'] = 1
  577. else:
  578. dvl['isPrimaryUser'] = 0
  579. uid_list.append(dvl['UID'])
  580. ubqs = UID_Bucket.objects.filter(uid__in=uid_list). \
  581. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  582. upqs = UID_Preview.objects.filter(uid__in=uid_list).order_by('channel').values('id', 'uid', 'channel')
  583. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  584. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  585. nowTime = int(time.time())
  586. data = []
  587. # 设备拓展信息表
  588. us_qs = UidSetModel.objects.filter(uid__in=uid_list).values('id', 'uid', 'version', 'nickname', 'ucode',
  589. 'detect_status', 'detect_group',
  590. 'detect_interval', 'isSupportFourPoint',
  591. 'region_alexa', 'is_alexa', 'deviceModel',
  592. 'TimeZone', 'TimeStatus', 'SpaceUsable',
  593. 'SpaceSum', 'MirrorType', 'RecordType',
  594. 'OutdoorModel', 'WIFIName', 'isDetector',
  595. 'DetectorRank', 'is_human', 'is_custom_voice',
  596. 'is_ptz', 'double_wifi', 'is_ai', 'mobile_4g',
  597. 'ai_type')
  598. uv_dict = {}
  599. for us in us_qs:
  600. uv_dict[us['uid']] = {
  601. 'version': us['version'],
  602. 'nickname': us['nickname'],
  603. 'ucode': us['ucode'],
  604. 'detect_interval': us['detect_interval'],
  605. 'detect_group': us['detect_group'],
  606. 'detect_status': us['detect_status'],
  607. 'region_alexa': us['region_alexa'],
  608. 'is_alexa': us['is_alexa'],
  609. 'deviceModel': us['deviceModel'],
  610. 'TimeZone': us['TimeZone'],
  611. 'TimeStatus': us['TimeStatus'],
  612. 'SpaceUsable': us['SpaceUsable'],
  613. 'SpaceSum': us['SpaceSum'],
  614. 'MirrorType': us['MirrorType'],
  615. 'RecordType': us['RecordType'],
  616. 'OutdoorModel': us['OutdoorModel'],
  617. 'WIFIName': us['WIFIName'],
  618. 'isDetector': us['isDetector'],
  619. 'DetectorRank': us['DetectorRank'],
  620. 'is_human': us['is_human'],
  621. 'is_custom_voice': us['is_custom_voice'],
  622. 'is_ptz': us['is_ptz'],
  623. 'double_wifi': us['double_wifi'],
  624. 'mobile4G': us['mobile_4g'],
  625. 'is_ai': us['is_ai'],
  626. 'ai_type': us['ai_type'],
  627. 'isSupportFourPoint': us['isSupportFourPoint'],
  628. }
  629. # 从uid_channel里面取出通道配置信息
  630. ucs_qs = UidChannelSetModel.objects.filter(uid__id=us['id']).values('channel', 'channel_name',
  631. 'pir_audio', 'mic_audio',
  632. 'battery_status', 'battery_level',
  633. 'sleep_status', 'sleep_time',
  634. 'light_night_model',
  635. 'light_alarm_type',
  636. 'light_alarm_level',
  637. 'light_alarm_man_en',
  638. 'light_alarm_vol',
  639. 'light_long_light'
  640. )
  641. channels = []
  642. for ucs in ucs_qs:
  643. channels_dict = {
  644. 'channel': ucs['channel'],
  645. 'channel_name': ucs['channel_name'],
  646. 'pir_audio': ucs['pir_audio'],
  647. 'mic_audio': ucs['mic_audio'],
  648. 'battery_status': ucs['battery_status'],
  649. 'battery_level': ucs['battery_level'],
  650. 'sleep_status': ucs['sleep_status'],
  651. 'sleep_time': ucs['sleep_time'],
  652. 'light_night_model': ucs['light_night_model'],
  653. 'light_alarm_type': ucs['light_alarm_type'],
  654. 'light_alarm_level': ucs['light_alarm_level'],
  655. 'light_alarm_man_en': ucs['light_alarm_man_en'],
  656. 'light_alarm_vol': ucs['light_alarm_vol'],
  657. 'light_long_light': ucs['light_long_light']
  658. }
  659. channels.append(channels_dict)
  660. uv_dict[us['uid']]['channels'] = channels
  661. for p in dvls:
  662. p['UID'] = p['UID'].replace('\n', '').replace('\r', '')
  663. p_uid = p['UID'].upper()
  664. if p['serial_number']:
  665. u_device_info_qs = UnicomDeviceInfo.objects.filter(serial_no=p['serial_number'])
  666. if u_device_info_qs.exists():
  667. p['iccid'] = u_device_info_qs.first().iccid
  668. # 获取iot_deviceInfo表的endpoint和token_iot_number
  669. p['iot'] = []
  670. if p['serial_number']: # 存在序列号根据序列号查询
  671. iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(serial_number=p['serial_number'][0:6])
  672. else: # 根据uid查询
  673. iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(uid=p_uid)
  674. if iotdeviceInfo_qs.exists():
  675. iotdeviceInfo = iotdeviceInfo_qs.values('endpoint', 'token_iot_number')
  676. p['iot'].append({
  677. 'endpoint': iotdeviceInfo[0]['endpoint'],
  678. 'token_iot_number': iotdeviceInfo[0]['token_iot_number']
  679. })
  680. p['vod'] = []
  681. for dm in ubqs:
  682. if p_uid == dm['uid']:
  683. if dm['endTime'] > nowTime:
  684. p['vod'].append(dm)
  685. p['preview'] = []
  686. for up in upqs:
  687. if p_uid == up['uid']:
  688. obj = 'uid_preview/{uid}/channel_{channel}.png'.format(uid=up['uid'], channel=up['channel'])
  689. img_sign = bucket.sign_url('GET', obj, 300)
  690. p['preview'].append(img_sign)
  691. # 返回设备初始化字符
  692. uid_qs = UIDModel.objects.filter(uid=p_uid).values('platform', 'init_string', 'init_string_app')
  693. if uid_qs.exists():
  694. p['platform'] = uid_qs[0]['platform']
  695. p['initString'] = uid_qs[0]['init_string']
  696. p['initStringApp'] = uid_qs[0]['init_string_app']
  697. if p_uid in uv_dict:
  698. # 设备版本号
  699. uidversion = uv_dict[p_uid]['version']
  700. if len(uidversion) > 6:
  701. uidversion = uidversion[0: uidversion.rfind('.')]
  702. p['uid_version'] = uidversion
  703. p['ucode'] = '72V201233AA' if uv_dict[p_uid]['mobile4G'] == 1 else uv_dict[p_uid]['ucode']
  704. p['detect_interval'] = uv_dict[p_uid]['detect_interval']
  705. p['detect_status'] = uv_dict[p_uid]['detect_status']
  706. p['detect_group'] = uv_dict[p_uid]['detect_group']
  707. p['region_alexa'] = uv_dict[p_uid]['region_alexa']
  708. p['is_alexa'] = uv_dict[p_uid]['is_alexa']
  709. p['deviceModel'] = uv_dict[p_uid]['deviceModel']
  710. p['TimeZone'] = uv_dict[p_uid]['TimeZone']
  711. p['TimeStatus'] = uv_dict[p_uid]['TimeStatus']
  712. p['SpaceUsable'] = uv_dict[p_uid]['SpaceUsable']
  713. p['SpaceSum'] = uv_dict[p_uid]['SpaceSum']
  714. p['MirrorType'] = uv_dict[p_uid]['MirrorType']
  715. p['RecordType'] = uv_dict[p_uid]['RecordType']
  716. p['OutdoorModel'] = uv_dict[p_uid]['OutdoorModel']
  717. p['WIFIName'] = uv_dict[p_uid]['WIFIName']
  718. p['isDetector'] = uv_dict[p_uid]['isDetector']
  719. p['DetectorRank'] = uv_dict[p_uid]['DetectorRank']
  720. p['is_human'] = uv_dict[p_uid]['is_human']
  721. p['is_custom_voice'] = uv_dict[p_uid]['is_custom_voice']
  722. p['is_ptz'] = uv_dict[p_uid]['is_ptz']
  723. p['channels'] = uv_dict[p_uid]['channels']
  724. p['double_wifi'] = uv_dict[p_uid]['double_wifi']
  725. p['mobile4G'] = uv_dict[p_uid]['mobile4G']
  726. p['isCameraOpenCloud'] = 0 if uv_dict[p_uid]['mobile4G'] == 1 else p['isCameraOpenCloud']
  727. p['is_ai'] = uv_dict[p_uid]['is_ai']
  728. p['ai_type'] = uv_dict[p_uid]['ai_type']
  729. p['isSupportFourPoint'] = uv_dict[p_uid]['isSupportFourPoint']
  730. # 设备昵称 调用影子信息昵称,先阶段不可
  731. if uv_dict[p_uid]['nickname']:
  732. p['NickName'] = uv_dict[p_uid]['nickname']
  733. else:
  734. # 设备版本号
  735. p['uid_version'] = ''
  736. p['ucode'] = ''
  737. p['View_Password'] = self.encrypt_pwd(p['View_Password'])
  738. data.append(p)
  739. result = data
  740. return response.json(0, result)
  741. def do_fuzzy_query(self, userID, request_dict, response):
  742. fuzzy = request_dict.get('fuzzy', None)
  743. page = request_dict.get('page', None)
  744. line = request_dict.get('line', None)
  745. if page and line:
  746. page = int(page)
  747. line = int(line)
  748. device_qs = Device_Info.objects.filter(userID=userID)
  749. device_qs = device_qs.filter(~Q(isExist=2))
  750. if device_qs.exists():
  751. if fuzzy:
  752. device_qs = device_qs.filter(Q(UID__icontains=fuzzy) | Q(NickName__icontains=fuzzy))
  753. device_qs = device_qs.values('id', 'userID', 'NickName', 'UID', 'View_Account',
  754. 'View_Password', 'ChannelIndex', 'Type', 'isShare',
  755. 'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID',
  756. 'vodPrimaryMaster', 'userID__userEmail',
  757. 'version', 'isVod', 'isExist', 'NotificationMode', 'isCameraOpenCloud',
  758. 'serial_number')
  759. dvls = CommonService.qs_to_list(device_qs)
  760. uid_list = []
  761. for dvl in dvls:
  762. uid_list.append(dvl['UID'])
  763. ubqs = UID_Bucket.objects.filter(uid__in=uid_list). \
  764. values('bucket__content', 'status', 'channel', 'endTime', 'uid')
  765. upqs = UID_Preview.objects.filter(uid__in=uid_list).order_by('channel').values('id', 'uid', 'channel')
  766. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  767. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  768. nowTime = int(time.time())
  769. data = []
  770. # 设备拓展信息表
  771. us_qs = UidSetModel.objects.filter(uid__in=uid_list).values('id', 'uid', 'version', 'nickname', 'ucode',
  772. 'detect_status', 'detect_group',
  773. 'detect_interval',
  774. 'region_alexa', 'is_alexa', 'deviceModel',
  775. 'TimeZone', 'TimeStatus', 'SpaceUsable',
  776. 'SpaceSum', 'MirrorType', 'RecordType',
  777. 'OutdoorModel', 'WIFIName', 'isDetector',
  778. 'DetectorRank')
  779. uv_dict = {}
  780. for us in us_qs:
  781. uv_dict[us['uid']] = {
  782. 'version': us['version'],
  783. 'nickname': us['nickname'],
  784. 'ucode': us['ucode'],
  785. 'detect_interval': us['detect_interval'],
  786. 'detect_group': us['detect_group'],
  787. 'detect_status': us['detect_status'],
  788. 'region_alexa': us['region_alexa'],
  789. 'is_alexa': us['is_alexa'],
  790. 'deviceModel': us['deviceModel'],
  791. 'TimeZone': us['TimeZone'],
  792. 'TimeStatus': us['TimeStatus'],
  793. 'SpaceUsable': us['SpaceUsable'],
  794. 'SpaceSum': us['SpaceSum'],
  795. 'MirrorType': us['MirrorType'],
  796. 'RecordType': us['RecordType'],
  797. 'OutdoorModel': us['OutdoorModel'],
  798. 'WIFIName': us['WIFIName'],
  799. 'isDetector': us['isDetector'],
  800. 'DetectorRank': us['DetectorRank']
  801. }
  802. # 从uid_channel里面取出通道配置信息
  803. ucs_qs = UidChannelSetModel.objects.filter(uid__id=us['id']).values()
  804. channels = []
  805. for ucs in ucs_qs:
  806. channel = {
  807. 'channel': ucs['channel'],
  808. 'channel_name': ucs['channel_name'],
  809. 'pir_audio': ucs['pir_audio'],
  810. 'mic_audio': ucs['mic_audio'],
  811. 'battery_status': ucs['battery_status'],
  812. 'battery_level': ucs['battery_level'],
  813. 'sleep_status': ucs['sleep_status'],
  814. 'sleep_time': ucs['sleep_time'],
  815. 'light_night_model': ucs['light_night_model'],
  816. 'light_alarm_type': ucs['light_alarm_type'],
  817. 'light_alarm_level': ucs['light_alarm_level'],
  818. 'light_alarm_man_en': ucs['light_alarm_man_en'],
  819. 'light_alarm_vol': ucs['light_alarm_vol'],
  820. 'light_long_light': ucs['light_long_light']
  821. }
  822. channels.append(channel)
  823. uv_dict[us['uid']]['channels'] = channels
  824. for p in dvls:
  825. # 获取iot_deviceInfo表的endpoint和token_iot_number
  826. p['iot'] = []
  827. if p['serial_number']: # 存在序列号根据序列号查询
  828. iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(serial_number=p['serial_number'][0:6])
  829. else: # 根据uid查询
  830. iotdeviceInfo_qs = iotdeviceInfoModel.objects.filter(uid=p['UID'])
  831. if iotdeviceInfo_qs.exists():
  832. iotdeviceInfo = iotdeviceInfo_qs.values('endpoint', 'token_iot_number')
  833. p['iot'].append({
  834. 'endpoint': iotdeviceInfo[0]['endpoint'],
  835. 'token_iot_number': iotdeviceInfo[0]['token_iot_number']
  836. })
  837. p['vod'] = []
  838. for dm in ubqs:
  839. if p['UID'] == dm['uid']:
  840. if dm['endTime'] > nowTime:
  841. p['vod'].append(dm)
  842. p['preview'] = []
  843. for up in upqs:
  844. if p['UID'] == up['uid']:
  845. obj = 'uid_preview/{uid}/channel_{channel}.png'.format(uid=up['uid'], channel=up['channel'])
  846. img_sign = bucket.sign_url('GET', obj, 300)
  847. p['preview'].append(img_sign)
  848. p_uid = p['UID']
  849. if p_uid in uv_dict:
  850. # 设备版本号
  851. p['uid_version'] = uv_dict[p_uid]['version']
  852. p['ucode'] = uv_dict[p_uid]['ucode']
  853. p['detect_interval'] = uv_dict[p_uid]['detect_interval']
  854. p['detect_status'] = uv_dict[p_uid]['detect_status']
  855. p['detect_group'] = uv_dict[p_uid]['detect_group']
  856. p['region_alexa'] = uv_dict[p_uid]['region_alexa']
  857. p['is_alexa'] = uv_dict[p_uid]['is_alexa']
  858. p['deviceModel'] = uv_dict[p_uid]['deviceModel']
  859. p['TimeZone'] = uv_dict[p_uid]['TimeZone']
  860. p['TimeStatus'] = uv_dict[p_uid]['TimeStatus']
  861. p['SpaceUsable'] = uv_dict[p_uid]['SpaceUsable']
  862. p['SpaceSum'] = uv_dict[p_uid]['SpaceSum']
  863. p['MirrorType'] = uv_dict[p_uid]['MirrorType']
  864. p['RecordType'] = uv_dict[p_uid]['RecordType']
  865. p['OutdoorModel'] = uv_dict[p_uid]['OutdoorModel']
  866. p['WIFIName'] = uv_dict[p_uid]['WIFIName']
  867. p['isDetector'] = uv_dict[p_uid]['isDetector']
  868. p['DetectorRank'] = uv_dict[p_uid]['DetectorRank']
  869. p['channels'] = uv_dict[p_uid]['channels']
  870. # 设备昵称 调用影子信息昵称,先阶段不可
  871. if uv_dict[p_uid]['nickname']:
  872. p['NickName'] = uv_dict[p_uid]['nickname']
  873. else:
  874. # 设备版本号
  875. p['uid_version'] = ''
  876. p['ucode'] = ''
  877. data.append(p)
  878. result = data
  879. items = []
  880. # print('缓存分页')
  881. for index, item in enumerate(result):
  882. if (page - 1) * line <= index:
  883. if index < page * line:
  884. # 加密
  885. item['View_Password'] = self.encrypt_pwd(item['View_Password'])
  886. print(item)
  887. items.append(item)
  888. print(items)
  889. return response.json(0, items)
  890. else:
  891. return response.json(0, [])
  892. else:
  893. return response.json(444)
  894. # 加密
  895. def encrypt_pwd(self, userPwd):
  896. for i in range(1, 4):
  897. if i == 1:
  898. userPwd = RandomStr(3, False) + userPwd + RandomStr(3, False)
  899. userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
  900. if i == 2:
  901. userPwd = RandomStr(2, False) + str(userPwd) + RandomStr(2, False)
  902. userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
  903. if i == 3:
  904. userPwd = RandomStr(1, False) + str(userPwd) + RandomStr(1, False)
  905. userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
  906. return userPwd
  907. # 解密
  908. def decode_pwd(self, password):
  909. for i in range(1, 4):
  910. if i == 1:
  911. # 第一次先解密
  912. password = base64.b64decode(password)
  913. password = password.decode('utf-8')
  914. # 截去第一位,最后一位
  915. password = password[1:-1]
  916. if i == 2:
  917. # 第2次先解密
  918. password = base64.b64decode(password)
  919. password = password.decode('utf-8')
  920. # 去前2位,后2位
  921. password = password[2:-2]
  922. if i == 3:
  923. # 第3次先解密
  924. password = base64.b64decode(password)
  925. password = password.decode('utf-8')
  926. # 去前3位,后3位
  927. password = password[3:-3]
  928. return password
  929. def do_mainUserDevice(self, request_dict, response):
  930. UID = request_dict.get('UID')
  931. dvq = Device_Info.objects.filter(UID=UID)
  932. dvq = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
  933. qs = {}
  934. if dvq.exists():
  935. qs = Device_User.objects.filter(userID=dvq[0]['vodPrimaryUserID']).values('userID', 'NickName', 'username',
  936. 'userEmail', 'phone')
  937. NickName = qs[0]['username']
  938. userEmail = qs[0]['userEmail']
  939. phone = qs[0]['phone']
  940. username = qs[0]['username']
  941. qs = CommonService.qs_to_list(qs)
  942. if NickName == '':
  943. qs[0]['NickName'] = username
  944. # if userEmail =='':
  945. # qs[0]['userEmail'] = NickName
  946. if phone == '':
  947. qs[0]['phone'] = NickName
  948. # if not qs:
  949. # uidq = UIDMainUser.objects.filter(UID=UID).values('user_id')
  950. # if uidq.exists():
  951. # qs = Device_User.objects.filter(userID=uidq[0]['user_id']).values('userID', 'NickName', 'username', 'userEmail', 'phone')
  952. # qs = CommonService.qs_to_list(qs)
  953. return response.json(0, qs)
  954. def not_login_do_mainUserDevice(self, request_dict, response):
  955. UID = request_dict.get('UID')
  956. token = request_dict.get('token', None)
  957. time_stamp = request_dict.get('time_stamp', None)
  958. if not all([token, time_stamp]):
  959. return response.json(444)
  960. # 时间戳token校验
  961. if not CommonService.check_time_stamp_token(token, time_stamp):
  962. return response.json(13)
  963. dvq = Device_Info.objects.filter(UID=UID)
  964. dvq = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
  965. qs = {}
  966. if dvq.exists():
  967. qs = Device_User.objects.filter(userID=dvq[0]['vodPrimaryUserID']).values('userID', 'NickName', 'username',
  968. 'userEmail', 'phone')
  969. NickName = qs[0]['username']
  970. phone = qs[0]['phone']
  971. username = qs[0]['username']
  972. qs = CommonService.qs_to_list(qs)
  973. if NickName == '':
  974. qs[0]['NickName'] = username
  975. if phone == '':
  976. qs[0]['phone'] = NickName
  977. return response.json(0, qs)
  978. @staticmethod
  979. def test_tool_del_device(request_dict, response):
  980. """
  981. 测试工具删除设备
  982. @param request_dict: 请求数据
  983. @request_dict user_id: 用户id
  984. @request_dict uid: uid
  985. @request_dict time_stamp: 时间戳
  986. @request_dict time_stamp_token: 时间戳token
  987. @param response: 响应
  988. @return: response
  989. """
  990. user_id = request_dict.get('user_id')
  991. uid = request_dict.get('uid')
  992. time_stamp = request_dict.get('time_stamp', None)
  993. time_stamp_token = request_dict.get('time_stamp_token', None)
  994. if not all([user_id, uid, time_stamp, time_stamp_token]):
  995. return response.json(444)
  996. try:
  997. # 时间戳token校验
  998. if not CommonService.check_time_stamp_token(time_stamp_token, time_stamp):
  999. return response.json(13)
  1000. with transaction.atomic():
  1001. Device_Info.objects.filter(userID_id=user_id, UID=uid).delete()
  1002. # 删除推送消息
  1003. for val in range(1, 8):
  1004. EquipmentInfoService.get_equipment_info_model('', val). \
  1005. filter(device_user_id=user_id, device_uid=uid).delete()
  1006. return response.json(0)
  1007. except Exception as e:
  1008. return response.json(500, repr(e))
  1009. def do_get_device_features(self, request_dict, response):
  1010. uid = request_dict.get('uid', None)
  1011. if uid:
  1012. uid = CommonService.decode_data(uid)
  1013. if uid:
  1014. uid_qs = UidSetModel.objects.filter(uid=uid)
  1015. if uid_qs.exists():
  1016. uid_qs = uid_qs.values('is_alexa', 'is_human', 'is_custom_voice', 'double_wifi', 'mobile_4g')
  1017. return response.json(0, uid_qs[0])
  1018. else:
  1019. return response.json(173)
  1020. else:
  1021. return response.json(444)
  1022. else:
  1023. return response.json(444)