EquipmentFamilyController.py 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : EquipmentFamilyController.py
  4. @Time : 2022/5/13 15:50
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import time
  10. import oss2
  11. from django.db import connection
  12. from django.db import transaction
  13. from django.db.models import Q, Count
  14. from django.views.generic.base import View
  15. from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
  16. from Controller.DeviceConfirmRegion import Device_Region
  17. from Controller.SensorGateway.SmartSocketController import SmartSocketView
  18. from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, \
  19. iotdeviceInfoModel, UIDModel, Device_User, UserFamily, FamilyMember, FamilyMemberPermission, \
  20. FamilyRoomDevice, FamilyRoom, FamilyMemberJoin, GatewaySubDevice, CountryModel, SocketInfo
  21. from Object.ResponseObject import ResponseObject
  22. from Object.TokenObject import TokenObject
  23. from Service.CommonService import CommonService
  24. # 家庭设备管理
  25. class EquipmentFamilyView(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. token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))
  36. lang = request_dict.get('lang', None)
  37. if lang:
  38. response = ResponseObject(lang)
  39. else:
  40. response = ResponseObject(token.lang) if token.lang else ResponseObject()
  41. if token.code != 0:
  42. return response.json(token.code)
  43. user_id = token.userID
  44. # 手机端添加设备,查询,修改
  45. if operation == 'add':
  46. return self.do_save(user_id, request_dict, response, request)
  47. # 分页获取未添加房间设备
  48. elif operation == 'family-device-query':
  49. return self.get_device_not_in_room(user_id, request_dict, response)
  50. # 条件查询设备列表
  51. elif operation == 'query':
  52. return self.do_device_query(user_id, request_dict, response)
  53. # 获取家庭列表
  54. elif operation == 'family-list':
  55. return self.get_family_list(user_id, request_dict, response)
  56. # 查询所在家庭列表
  57. elif operation == "where-family-list":
  58. return self.who_family_list(user_id, response)
  59. # 家庭保存
  60. elif operation == 'family-save':
  61. return self.family_save(user_id, request_dict, response)
  62. # 家庭设置
  63. elif operation == 'family-setting':
  64. return self.get_family_setting(request_dict, response)
  65. # 家庭成员删除
  66. elif operation == 'member-del':
  67. return self.family_member_del(user_id, request_dict, response)
  68. # 获取房间列表
  69. elif operation == 'room-list':
  70. return self.get_family_room_list(request_dict, response)
  71. # 房间保存
  72. elif operation == 'room-save':
  73. return self.room_save(request_dict, response)
  74. # 权限列表
  75. elif operation == 'permission-list':
  76. return self.get_member_permission_list(user_id, request_dict, response)
  77. # 成员权限修改
  78. elif operation == 'permission-update':
  79. return self.changes_member_permission(user_id, request_dict, response)
  80. elif operation == 'family/del':
  81. return self.family_family_del(user_id, request_dict, response)
  82. # 首页设备列表
  83. elif operation == 'query-device':
  84. return self.get_device(user_id, request_dict, response)
  85. else:
  86. return response.json(414)
  87. @classmethod
  88. def family_family_del(cls, user_id, request_dict, response):
  89. """
  90. 删除家庭
  91. @param user_id:
  92. @param request_dict:
  93. @param response:
  94. @return:
  95. """
  96. family_id = request_dict.get('familyId', None)
  97. if not family_id:
  98. return response.json(444)
  99. family_id = int(family_id)
  100. permission = cls.get_member_permission_details(user_id, family_id)
  101. if not permission or permission == '003':
  102. return response.json(404)
  103. user_family_qs = UserFamily.objects.filter(id=family_id, user_id=user_id)
  104. if not user_family_qs.exists():
  105. return response.json(173)
  106. count = UserFamily.objects.filter(user_id=user_id).count()
  107. if count <= 1:
  108. return response.json(10057)
  109. family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=family_id)
  110. if family_room_device_qs.exists():
  111. family_room_device_qs.delete()
  112. family_join_qs = FamilyMemberJoin.objects.filter(family_id=family_id)
  113. if family_join_qs.exists():
  114. family_join_qs.delete()
  115. family_room_qs = FamilyRoom.objects.filter(family_id=family_id)
  116. if family_room_qs.exists():
  117. family_room_qs.delete()
  118. family_member_qs = FamilyMember.objects.filter(family_id=family_id)
  119. if family_member_qs.exists():
  120. family_member_qs.delete()
  121. family_qs = UserFamily.objects.filter(id=family_id)
  122. if family_qs.exists():
  123. family_qs.delete()
  124. return response.json(0)
  125. @classmethod
  126. def do_save(cls, user_id, request_dict, response, request):
  127. """
  128. 添加网关设备
  129. @param request:
  130. @param user_id:
  131. @param request_dict:
  132. @param response:
  133. @return:
  134. """
  135. nick_name = request_dict.get('nickName', None)
  136. serial_number = request_dict.get('serialNumber', None)
  137. device_type = request_dict.get('deviceType', None)
  138. family_id = request_dict.get('familyId', None)
  139. room_id = request_dict.get('roomId', None)
  140. # type 可能为0
  141. if not all([nick_name, serial_number, device_type]):
  142. return response.json(444, {'param': 'nick_name, serial_number, device_type'})
  143. device_info_qs = Device_Info.objects.filter(serial_number=serial_number, isShare=False)
  144. device_info_qs = device_info_qs.values('NickName', 'userID_id', 'userID__userEmail', 'userID__phone',
  145. 'userID__username', 'userID__NickName')
  146. if device_info_qs.exists():
  147. qs = device_info_qs
  148. nickname = qs[0]['NickName']
  149. device_user_id = qs[0]['userID_id']
  150. if device_user_id == user_id:
  151. return response.json(174)
  152. else:
  153. if qs[0]['userID__userEmail']:
  154. bind_user = qs[0]['userID__userEmail']
  155. elif qs[0]['userID__phone']:
  156. bind_user = qs[0]['userID__phone']
  157. elif qs[0]['userID__username']:
  158. bind_user = qs[0]['userID__username']
  159. elif qs[0]['userID__NickName']:
  160. bind_user = qs[0]['userID__NickName']
  161. else:
  162. bind_user = qs[0]['userID_id']
  163. res = {
  164. 'bindUser': bind_user,
  165. 'bindDeviceName': nickname,
  166. 'isMainUserExists': 1
  167. }
  168. return response.json(0, res=res)
  169. try:
  170. with transaction.atomic():
  171. family_id = int(family_id)
  172. # 格式化后的日期时间
  173. now_time = CommonService.timestamp_to_str(int(time.time()))
  174. device_id = CommonService.getUserID(getUser=False)
  175. Device_Info.objects.create(id=device_id, userID_id=user_id, NickName=nick_name,
  176. Type=device_type,
  177. UID=serial_number,
  178. serial_number=serial_number, data_joined=now_time,
  179. update_time=now_time)
  180. boole = cls.family_room_device_save(family_id, room_id, device_id, device_type)
  181. if not boole:
  182. return response.json(15)
  183. # 判断是否有用户绑定
  184. us_qs = UidSetModel.objects.filter(uid=serial_number)
  185. if not us_qs:
  186. n_time = int(time.time())
  187. ip = CommonService.get_ip_address(request)
  188. ipInfo = CommonService.getIpIpInfo(ip, 'CN')
  189. country_qs = CountryModel.objects.filter(country_code=ipInfo['country_code']).values('id')
  190. if country_qs.exists():
  191. country = country_qs[0]['id']
  192. else:
  193. country = '0'
  194. region_id = Device_Region().get_device_region(ip)
  195. region_alexa = 'CN' if region_id == 1 else 'ALL'
  196. uid_set_create_dict = {
  197. 'uid': serial_number,
  198. 'addTime': n_time,
  199. 'updTime': n_time,
  200. 'ip': CommonService.get_ip_address(request_dict),
  201. 'nickname': nick_name,
  202. 'region_alexa': region_alexa,
  203. 'device_type': device_type,
  204. 'tb_country': country
  205. }
  206. UidSetModel.objects.create(**uid_set_create_dict)
  207. if int(device_type) == 201: # 添加插座信息
  208. SmartSocketView.save_socket_switch(device_id, serial_number, 0)
  209. res = {
  210. 'deviceId': device_id,
  211. 'nickName': nick_name,
  212. 'serialNumber': serial_number
  213. }
  214. return response.json(0, res)
  215. except Exception as e:
  216. print(e)
  217. return response.json(177, repr(e))
  218. @classmethod
  219. def get_device_not_in_room(cls, user_id, request_dict, response):
  220. """
  221. 获取不在房间的设备
  222. @param user_id: 用户id
  223. @param request_dict:
  224. @param response:
  225. @return:
  226. """
  227. page_no = request_dict.get('pageNo', None)
  228. page_size = request_dict.get('pageSize', None)
  229. family_id = request_dict.get('familyId', None)
  230. if not all([page_no, page_size, family_id]):
  231. return response.json(444)
  232. page_no = int(page_no)
  233. page_size = int(page_size)
  234. device_list = cls.get_family_device_list(user_id, page_no, page_size, family_id, 0)
  235. return response.json(0, device_list)
  236. @classmethod
  237. def do_device_query(cls, user_id, request_dict, response):
  238. """
  239. 查询用户设备信息
  240. @param user_id: 用户id
  241. @param request_dict: 请求参数
  242. @param response: 响应对象
  243. @return: response
  244. """
  245. page = request_dict.get('page', None)
  246. line = request_dict.get('line', None)
  247. nick_name = request_dict.get('NickName', None)
  248. family_id = request_dict.get('familyId', None)
  249. room_id = request_dict.get('roomId', None)
  250. page = int(page)
  251. line = int(line)
  252. uid = request_dict.get('uid', None)
  253. if family_id:
  254. permission = cls.get_member_permission_details(user_id, int(family_id))
  255. if not permission or permission == '003':
  256. return response.json(404)
  257. if room_id:
  258. family_room = FamilyRoom.objects.filter(id=room_id)
  259. if not family_room.exists():
  260. return response.json(173)
  261. permission = cls.get_member_permission_details(user_id, family_room.first().family_id)
  262. if not permission or permission == '003':
  263. return response.json(404)
  264. # 获取设备信息列表
  265. device_info_list = cls.get_device_info_list(user_id, nick_name, uid,
  266. page, line, family_id, room_id)
  267. uid_list = []
  268. # 判断是否是主用户 isPrimaryUser=0:否,1:是
  269. for dvl in device_info_list:
  270. if dvl['primaryUserID'] and dvl['id'] == dvl['primaryUserID']:
  271. dvl['isPrimaryUser'] = 1
  272. else:
  273. dvl['isPrimaryUser'] = 0
  274. uid_list.append(dvl['UID'])
  275. # 设备关联套餐,设备预览图
  276. uid_bucket_qs, uid_preview_qs = cls.get_bucket_and_preview_by_uid(uid_list)
  277. # 设备配置信息
  278. uid_set_dict = cls.get_uid_set_dict(uid_list)
  279. # 设备详情信息
  280. result = cls.get_device_details(device_info_list, uid_bucket_qs, uid_preview_qs, uid_set_dict)
  281. items = []
  282. for index, item in enumerate(result):
  283. # 加密
  284. if item['View_Password']:
  285. item['View_Password'] = CommonService.encode_data(item['View_Password'], 1, 4)
  286. items.append(item)
  287. return response.json(0, items)
  288. @classmethod
  289. def get_device_info_list(cls, user_id, nick_name, uid, page, line, family_id, room_id):
  290. """
  291. 根据用户id获取设备信息
  292. @param room_id: 家庭id
  293. @param family_id: 房间id
  294. @param uid: uid
  295. @param nick_name: 设备名称
  296. @param line: 条数
  297. @param page: 页数
  298. @param user_id: 用户id
  299. @return: device_info_list 设备信息列表
  300. """
  301. # 获取用户设备信息
  302. device_info_qs = Device_Info.objects.filter(userID_id=user_id)
  303. # 过滤已重置的设备
  304. device_info_qs = device_info_qs.filter(~Q(isExist=2))
  305. if nick_name:
  306. device_info_qs = device_info_qs.filter(NickName__icontains=nick_name)
  307. if uid:
  308. device_info_qs.filter(UID=uid)
  309. if family_id or room_id:
  310. # 根据家庭id获取房间id关联查询设备
  311. return cls.get_family_device_list(user_id, page, line, family_id, room_id)
  312. device_info_values = device_info_qs.values('id', 'userID', 'NickName', 'UID', 'View_Account', 'View_Password',
  313. 'ChannelIndex',
  314. 'Type', 'isShare', 'primaryUserID', 'primaryMaster', 'data_joined',
  315. 'vodPrimaryUserID',
  316. 'vodPrimaryMaster', 'userID__userEmail', 'version', 'isVod',
  317. 'isExist', 'NotificationMode',
  318. 'isCameraOpenCloud', 'serial_number')
  319. device_info_values = device_info_values[(page - 1) * line:page * line]
  320. device_info_list = CommonService.qs_to_list(device_info_values)
  321. return device_info_list
  322. @classmethod
  323. def get_family_device_list(cls, user_id, page_no, page_size, family_id, room_id, is_room_other=False):
  324. """
  325. 获取关联家庭设备列表
  326. @param is_room_other: 是否显示其他房间设备
  327. @param user_id: 用户id
  328. @param page_no: 页数
  329. @param page_size: 分页大小
  330. @param family_id: 家庭id
  331. @param room_id: 房间id
  332. @return: result_list
  333. """
  334. cursor = connection.cursor()
  335. sql = 'SELECT d.id,d.userID_id as userID,d.NickName,d.UID,d.View_Account,d.View_Password,d.ChannelIndex,' \
  336. 'd.Type,d.isShare,d.primaryUserID,d.primaryMaster,d.data_joined,d.vodPrimaryUserID,d.vodPrimaryMaster, ' \
  337. 'd.version,d.isVod,d.isExist,d.NotificationMode,d.isCameraOpenCloud,d.serial_number '
  338. sql += 'FROM device_info d INNER JOIN family_room_device l ON d.id = l.device_id '
  339. sql += 'WHERE d.userID_id = %s AND d.isExist != %s '
  340. if family_id:
  341. family_id = int(family_id)
  342. user_id = UserFamily.objects.filter(id=family_id).first().user_id
  343. sql += ' AND l.family_id = %s '
  344. if room_id and is_room_other:
  345. sql += ' AND l.room_id != %s '
  346. elif room_id:
  347. sql += ' AND l.room_id = %s '
  348. sql += ' GROUP BY d.id order by d.data_joined DESC,d.id DESC LIMIT %s,%s '
  349. if family_id and room_id:
  350. cursor.execute(sql, [user_id, 2, int(family_id), int(room_id), ((page_no - 1) * page_size),
  351. page_size, ])
  352. data_obj = cursor.fetchall()
  353. else:
  354. cursor.execute(sql, [user_id, 2, int(family_id) if family_id else int(room_id), ((page_no - 1) * page_size),
  355. page_size, ])
  356. data_obj = cursor.fetchall()
  357. cursor.close() # 执行完,关闭
  358. connection.close()
  359. result_list = []
  360. col_names = [desc[0] for desc in cursor.description]
  361. for item in data_obj:
  362. val = dict(zip(col_names, item))
  363. user_id = val['userID']
  364. device_user_qs = Device_User.objects.filter(userID=user_id)
  365. val['userID__userEmail'] = device_user_qs.first().userEmail
  366. val['isShare'] = False if val['isShare'] == 0 else True
  367. if 'data_joined' in val:
  368. if val['data_joined']:
  369. val['data_joined'] = val['data_joined'].strftime("%Y-%m-%d %H:%M:%S")
  370. else:
  371. val['data_joined'] = ''
  372. result_list.append(val)
  373. return result_list
  374. @classmethod
  375. def get_bucket_and_preview_by_uid(cls, uid_list):
  376. """
  377. 根据uid列表查询套餐
  378. @param uid_list: uid列表
  379. @return: uid_bucket_qs
  380. """
  381. uid_bucket_qs = UID_Bucket.objects.filter(uid__in=uid_list).values('bucket__content', 'status', 'channel',
  382. 'endTime', 'uid')
  383. uid_preview_qs = UID_Preview.objects.filter(uid__in=uid_list).order_by('channel').values('id', 'uid', 'channel')
  384. return uid_bucket_qs, uid_preview_qs
  385. @classmethod
  386. def get_uid_set_dict(cls, uid_list):
  387. """
  388. 获取uid配置信息
  389. @param uid_list: uid列表
  390. @return: uid_set_dict uid配置信息
  391. """
  392. uid_set_qs = UidSetModel.objects.filter(uid__in=uid_list) \
  393. .values('id', 'uid', 'version', 'nickname', 'ucode',
  394. 'detect_status', 'detect_group',
  395. 'detect_interval',
  396. 'region_alexa', 'is_alexa', 'deviceModel',
  397. 'TimeZone', 'TimeStatus', 'SpaceUsable',
  398. 'SpaceSum', 'MirrorType', 'RecordType',
  399. 'OutdoorModel', 'WIFIName', 'isDetector',
  400. 'DetectorRank', 'is_human', 'is_custom_voice',
  401. 'is_ptz', 'double_wifi', 'is_ai')
  402. uid_set_dict = {}
  403. for us in uid_set_qs:
  404. uid_set_dict[us['uid']] = {
  405. 'version': us['version'],
  406. 'nickname': us['nickname'],
  407. 'ucode': us['ucode'],
  408. 'detect_interval': us['detect_interval'],
  409. 'detect_group': us['detect_group'],
  410. 'detect_status': us['detect_status'],
  411. 'region_alexa': us['region_alexa'],
  412. 'is_alexa': us['is_alexa'],
  413. 'deviceModel': us['deviceModel'],
  414. 'TimeZone': us['TimeZone'],
  415. 'TimeStatus': us['TimeStatus'],
  416. 'SpaceUsable': us['SpaceUsable'],
  417. 'SpaceSum': us['SpaceSum'],
  418. 'MirrorType': us['MirrorType'],
  419. 'RecordType': us['RecordType'],
  420. 'OutdoorModel': us['OutdoorModel'],
  421. 'WIFIName': us['WIFIName'],
  422. 'isDetector': us['isDetector'],
  423. 'DetectorRank': us['DetectorRank'],
  424. 'is_human': us['is_human'],
  425. 'is_custom_voice': us['is_custom_voice'],
  426. 'is_ptz': us['is_ptz'],
  427. 'double_wifi': us['double_wifi'],
  428. 'is_ai': us['is_ai']
  429. }
  430. # 从uid_channel里面取出通道配置信息
  431. uid_channel_set_qs = UidChannelSetModel.objects.filter(uid__id=us['id']) \
  432. .values('channel', 'channel_name',
  433. 'pir_audio', 'mic_audio',
  434. 'battery_status',
  435. 'battery_level',
  436. 'sleep_status',
  437. 'sleep_time',
  438. 'light_night_model',
  439. 'light_alarm_type',
  440. 'light_alarm_level',
  441. 'light_alarm_man_en',
  442. 'light_alarm_vol',
  443. 'light_long_light'
  444. )
  445. channels_list = []
  446. for ucs in uid_channel_set_qs:
  447. channels_dict = {
  448. 'channel': ucs['channel'],
  449. 'channel_name': ucs['channel_name'],
  450. 'pir_audio': ucs['pir_audio'],
  451. 'mic_audio': ucs['mic_audio'],
  452. 'battery_status': ucs['battery_status'],
  453. 'battery_level': ucs['battery_level'],
  454. 'sleep_status': ucs['sleep_status'],
  455. 'sleep_time': ucs['sleep_time'],
  456. 'light_night_model': ucs['light_night_model'],
  457. 'light_alarm_type': ucs['light_alarm_type'],
  458. 'light_alarm_level': ucs['light_alarm_level'],
  459. 'light_alarm_man_en': ucs['light_alarm_man_en'],
  460. 'light_alarm_vol': ucs['light_alarm_vol'],
  461. 'light_long_light': ucs['light_long_light']
  462. }
  463. channels_list.append(channels_dict)
  464. uid_set_dict[us['uid']]['channels'] = channels_list
  465. return uid_set_dict
  466. @classmethod
  467. def get_device_details(cls, device_info_list, uid_bucket_qs, uid_preview_qs, uid_set_dict):
  468. """
  469. 设备详情
  470. @param device_info_list: 设备信息列表
  471. @param uid_bucket_qs: 套餐对象
  472. @param uid_preview_qs:
  473. @param uid_set_dict:
  474. @return:
  475. """
  476. now_time = int(time.time())
  477. data = []
  478. for p in device_info_list:
  479. # 获取iotDeviceInfo表的endpoint和tokenIotNumber
  480. p['iot'] = []
  481. if p['serial_number']: # 存在序列号根据序列号查询
  482. iot_device_info_qs = iotdeviceInfoModel.objects.filter(serial_number=p['serial_number'][0:6])
  483. else: # 根据uid查询
  484. iot_device_info_qs = iotdeviceInfoModel.objects.filter(uid=p['UID'])
  485. if iot_device_info_qs.exists():
  486. iot_device_Info = iot_device_info_qs.values('endpoint', 'token_iot_number')
  487. p['iot'].append({
  488. 'endpoint': iot_device_Info[0]['endpoint'],
  489. 'token_iot_number': iot_device_Info[0]['token_iot_number']
  490. })
  491. p['vod'] = []
  492. for dm in uid_bucket_qs:
  493. if p['UID'] == dm['uid']:
  494. if dm['endTime'] > now_time:
  495. p['vod'].append(dm)
  496. p['preview'] = []
  497. auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
  498. bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
  499. for up in uid_preview_qs:
  500. if p['UID'] == up['uid']:
  501. obj = 'uid_preview/{uid}/channel_{channel}.png'.format(uid=up['uid'], channel=up['channel'])
  502. img_sign = bucket.sign_url('GET', obj, 300)
  503. p['preview'].append(img_sign)
  504. p_uid = p['UID']
  505. # 返回设备初始化字符
  506. uid_qs = UIDModel.objects.filter(uid=p_uid).values('platform', 'init_string', 'init_string_app')
  507. if uid_qs.exists():
  508. p['platform'] = uid_qs[0]['platform']
  509. p['initString'] = uid_qs[0]['init_string']
  510. p['initStringApp'] = uid_qs[0]['init_string_app']
  511. if p_uid in uid_set_dict:
  512. # 设备版本号
  513. uidversion = uid_set_dict[p_uid]['version']
  514. if len(uidversion) > 6:
  515. uidversion = uidversion[0: uidversion.rfind('.')]
  516. p['uid_version'] = uidversion
  517. p['ucode'] = uid_set_dict[p_uid]['ucode']
  518. p['detect_interval'] = uid_set_dict[p_uid]['detect_interval']
  519. p['detect_status'] = uid_set_dict[p_uid]['detect_status']
  520. p['detect_group'] = uid_set_dict[p_uid]['detect_group']
  521. p['region_alexa'] = uid_set_dict[p_uid]['region_alexa']
  522. p['is_alexa'] = uid_set_dict[p_uid]['is_alexa']
  523. p['deviceModel'] = uid_set_dict[p_uid]['deviceModel']
  524. p['TimeZone'] = uid_set_dict[p_uid]['TimeZone']
  525. p['TimeStatus'] = uid_set_dict[p_uid]['TimeStatus']
  526. p['SpaceUsable'] = uid_set_dict[p_uid]['SpaceUsable']
  527. p['SpaceSum'] = uid_set_dict[p_uid]['SpaceSum']
  528. p['MirrorType'] = uid_set_dict[p_uid]['MirrorType']
  529. p['RecordType'] = uid_set_dict[p_uid]['RecordType']
  530. p['OutdoorModel'] = uid_set_dict[p_uid]['OutdoorModel']
  531. p['WIFIName'] = uid_set_dict[p_uid]['WIFIName']
  532. p['isDetector'] = uid_set_dict[p_uid]['isDetector']
  533. p['DetectorRank'] = uid_set_dict[p_uid]['DetectorRank']
  534. p['is_human'] = uid_set_dict[p_uid]['is_human']
  535. p['is_custom_voice'] = uid_set_dict[p_uid]['is_custom_voice']
  536. p['is_ptz'] = uid_set_dict[p_uid]['is_ptz']
  537. p['channels'] = uid_set_dict[p_uid]['channels']
  538. p['double_wifi'] = uid_set_dict[p_uid]['double_wifi']
  539. p['is_ai'] = uid_set_dict[p_uid]['is_ai']
  540. # 设备昵称 调用影子信息昵称,先阶段不可
  541. if uid_set_dict[p_uid]['nickname']:
  542. p['NickName'] = uid_set_dict[p_uid]['nickname']
  543. else:
  544. # 设备版本号
  545. p['uid_version'] = ''
  546. p['ucode'] = ''
  547. data.append(p)
  548. return data
  549. @classmethod
  550. def get_family_list(cls, user_id, request_dict, response):
  551. """
  552. 查询我的家庭列表
  553. @param user_id: 用户id
  554. @param request_dict: 请求
  555. @param response: 响应
  556. @return: 家庭列表items
  557. """
  558. lang = request_dict.get('lang', 'en')
  559. if user_id:
  560. with transaction.atomic():
  561. user_family_qs = UserFamily.objects.filter(user_id=user_id)
  562. if not user_family_qs.exists():
  563. n_time = int(time.time())
  564. device_user = Device_User.objects.filter(userID=user_id).values('username', 'userEmail')
  565. if not device_user.exists():
  566. return response.json(104)
  567. # 创建默认家庭使用用户名或者邮箱作为名称
  568. username = device_user[0]['username']
  569. family_name = username if username else device_user[0]['userEmail']
  570. family_name = family_name + "的家" if lang == 'cn' else family_name + " home"
  571. user_family = UserFamily.objects.create(user_id=user_id, name=family_name,
  572. updated_time=n_time,
  573. created_time=n_time)
  574. if user_family.id:
  575. member_permission_qs = FamilyMemberPermission.objects.filter(no='001').values('id')
  576. permission_id = member_permission_qs.first()['id']
  577. FamilyMember.objects.create(family_id=user_family.id, user_id=user_id,
  578. user_name=username, identity=1,
  579. permission_id=int(permission_id), sort=1, updated_time=n_time,
  580. created_time=n_time)
  581. cls.family_device_binding(user_id, family_id=user_family.id)
  582. family_member_qs = FamilyMember.objects.filter(user_id=user_id) \
  583. .order_by('sort').values('identity', 'family_id', 'family__name', 'permission_id', 'permission__no',
  584. 'family__location', 'user__username', 'user__userIconUrl')
  585. items = EquipmentFamilyView.family_info_list(family_member_qs)
  586. return response.json(0, items)
  587. return response.json(309)
  588. @staticmethod
  589. def who_family_list(user_id, response):
  590. """
  591. 查询我加入的家庭集合与我创建的家庭集合
  592. @param user_id:
  593. @param response:
  594. @return:
  595. """
  596. join_family_qs = FamilyMember.objects.filter(user_id=user_id, identity=0) \
  597. .order_by('sort').values('identity', 'family_id', 'family__name', 'permission_id', 'permission__no',
  598. 'family__location', 'user__username', 'user__userIconUrl')
  599. join_family_list = EquipmentFamilyView.family_info_list(join_family_qs)
  600. my_family_qs = FamilyMember.objects.filter(user_id=user_id, identity=1) \
  601. .order_by('sort').values('identity', 'family_id', 'family__name', 'permission_id', 'permission__no',
  602. 'family__location', 'user__username', 'user__userIconUrl')
  603. my_family_list = EquipmentFamilyView.family_info_list(my_family_qs)
  604. return response.json(0, {'myFamilyList': my_family_list, 'joinFamilyList': join_family_list})
  605. @staticmethod
  606. def family_info_list(family_member_qs):
  607. items = []
  608. data = {}
  609. for item in family_member_qs:
  610. data['familyId'] = item['family_id']
  611. data['identity'] = item['identity']
  612. data['familyName'] = item['family__name']
  613. data['permissionId'] = item['permission_id']
  614. data['permissionNo'] = item['permission__no']
  615. data['familyLocation'] = item['family__location']
  616. data['userName'] = item['user__username']
  617. data['userIconUrl'] = item['user__userIconUrl']
  618. room_qs = FamilyRoom.objects.filter(family_id=data['familyId']).order_by('sort') \
  619. .values('id', 'name')
  620. data['rooms'] = list(room_qs)
  621. items.append(data)
  622. data = {}
  623. return items
  624. @classmethod
  625. def get_family_setting(cls, request_dict, response):
  626. """
  627. 家庭设置
  628. @param request_dict: 请求
  629. @param response: 响应
  630. @return: 家庭列表items
  631. """
  632. family_id = request_dict.get('familyId', None)
  633. if not family_id:
  634. return response.json(444)
  635. family_id = int(family_id)
  636. user_family_qs = UserFamily.objects.filter(id=family_id).values('id', 'name', 'location')
  637. if not user_family_qs.exists():
  638. return response.json(404)
  639. family_dict = user_family_qs.first()
  640. device_count = FamilyRoomDevice.objects.filter(family_id=family_id, sub_device=0).count()
  641. family_dict['deviceCount'] = device_count
  642. family_dict['roomCount'] = FamilyRoom.objects.filter(family_id=family_id).count()
  643. family_member_qs = FamilyMember.objects.filter(family_id=family_id)
  644. family_member_qs = family_member_qs.values('identity', 'family_id',
  645. 'permission_id',
  646. 'permission__no',
  647. 'user__username',
  648. 'user_id',
  649. 'user__userIconUrl',
  650. 'user__NickName',
  651. 'user__phone',
  652. 'user__userEmail',
  653. 'id')
  654. family_member_qs = family_member_qs.order_by('-identity').order_by('sort')
  655. items = []
  656. data = {}
  657. for item in family_member_qs:
  658. data['userName'] = item['user__username']
  659. data['userIconUrl'] = item['user__userIconUrl']
  660. data['userId'] = item['user_id']
  661. data['identity'] = item['identity']
  662. data['permissionId'] = item['permission_id']
  663. data['permissionNo'] = item['permission__no']
  664. data['nickName'] = item['user__NickName']
  665. data['phone'] = item['user__phone']
  666. data['userEmail'] = item['user__userEmail']
  667. data['memberId'] = item['id']
  668. items.append(data)
  669. data = {}
  670. family_dict['members'] = items
  671. return response.json(0, family_dict)
  672. @classmethod
  673. def family_save(cls, user_id, request_dict, response):
  674. """
  675. 家庭保存
  676. @param user_id: 用户id
  677. @param request_dict: 参数
  678. @param response: 响应
  679. @return:
  680. """
  681. family_id = request_dict.get('familyId', None)
  682. family_name = request_dict.get('familyName', None)
  683. location = request_dict.get('location', None)
  684. with transaction.atomic():
  685. now_time = int(time.time())
  686. if family_id:
  687. is_owner = cls.get_family_owner(user_id, family_id)
  688. if not is_owner:
  689. return response.json(404)
  690. family_member = FamilyMember.objects.filter(family_id=family_id, user_id=user_id)
  691. if family_member.exists():
  692. family_member = family_member.first()
  693. if family_member.identity == 0:
  694. return response.json(404)
  695. family_qs = UserFamily.objects.filter(id=family_id)
  696. if family_qs.exists():
  697. data = {
  698. 'updated_time': now_time
  699. }
  700. if family_name:
  701. data['name'] = family_name
  702. if location:
  703. data['location'] = location
  704. family_qs.update(**data)
  705. return response.json(0)
  706. data = {'user_id': user_id, 'updated_time': now_time, 'created_time': now_time}
  707. if family_name:
  708. data['name'] = family_name
  709. if location:
  710. data['location'] = location
  711. UserFamily.objects.create(**data)
  712. return response.json(0)
  713. return response.json(444)
  714. @classmethod
  715. def family_room_device_save(cls, family_id, room_id, device_id, device_type):
  716. """
  717. 设备与家庭房间保存
  718. @param family_id: 家庭id
  719. @param room_id: 房间id
  720. @param device_id: 设备id
  721. @param device_type: 设备类型
  722. @return: Boole
  723. """
  724. now_time = int(time.time())
  725. device_type = int(device_type)
  726. family_room_device = FamilyRoomDevice.objects.filter(device_id=device_id)
  727. if family_room_device.exists():
  728. return False
  729. data = {
  730. 'family_id': int(family_id),
  731. 'device_id': device_id,
  732. 'updated_time': now_time,
  733. 'created_time': now_time
  734. }
  735. category = 0 if device_type == 200 or device_type == 201 else 1
  736. data['category'] = category
  737. # 查询类别排序
  738. family_room_device_qs = FamilyRoomDevice.objects.filter(family_id=int(family_id), category=category).values(
  739. 'category_sort')
  740. if family_room_device_qs.exists():
  741. data['category_sort'] = family_room_device_qs[0]['category_sort']
  742. if room_id:
  743. room_id = int(room_id)
  744. if FamilyRoom.objects.filter(id=room_id).exists():
  745. data['room_id'] = room_id
  746. FamilyRoomDevice.objects.create(**data)
  747. return True
  748. @classmethod
  749. def family_device_binding(cls, user_id, family_id):
  750. """
  751. 用户旧设备与默认家庭进行绑定
  752. @param user_id:
  753. @param family_id:
  754. @return: True
  755. """
  756. device_info_qs = Device_Info.objects.filter(userID=user_id)
  757. device_info_qs = device_info_qs.filter(~Q(isExist=0)).values('id', 'Type')
  758. if device_info_qs.exists():
  759. with transaction.atomic():
  760. not_time = time.time()
  761. device_list = []
  762. for item in device_info_qs:
  763. device_id = item['id']
  764. device_type = item['Type']
  765. if device_type == 200 or 201:
  766. category = 0
  767. else:
  768. category = 1
  769. family_device_qs = FamilyRoomDevice.objects.filter(device_id=device_id)
  770. if not family_device_qs.exists():
  771. # 设备绑定家庭
  772. device_list.append(FamilyRoomDevice(family_id=family_id, device_id=device_id,
  773. created_time=not_time, category=category,
  774. updated_time=not_time))
  775. if device_list:
  776. FamilyRoomDevice.objects.bulk_create(device_list)
  777. return True
  778. @classmethod
  779. def get_family_room_list(cls, request_dict, response):
  780. """
  781. 获取房间列表并统计该房间下有几台设备
  782. @param request_dict: 请求参数
  783. @param response: 响应参数
  784. @return: total;data
  785. """
  786. family_id = request_dict.get('familyId', None)
  787. if not family_id:
  788. return response.json(444)
  789. count = FamilyRoomDevice.objects.filter(family_id=family_id).values('device_id').annotate(
  790. count=Count('device_id')).count()
  791. room_qs = FamilyRoom.objects.filter(family_id=family_id).order_by('sort')
  792. total = room_qs.count()
  793. room_qs = room_qs.values('id', 'name', 'sort')
  794. room_list = []
  795. if not room_qs.exists():
  796. return response.json(0, {'total': 0, 'data': room_list, 'deviceTotal': count})
  797. for item in room_qs:
  798. item['deviceCount'] = FamilyRoomDevice.objects.filter(family_id=family_id, room_id=item['id']).count()
  799. room_list.append(item)
  800. return response.json(0, {'total': total, 'data': room_list, 'deviceTotal': count})
  801. @classmethod
  802. def room_save(cls, request_dict, response):
  803. """
  804. 房间保存
  805. @param request_dict: 请求参数
  806. @param response: 响应参数
  807. @return:
  808. """
  809. family_id = request_dict.get('familyId', None)
  810. room_name = request_dict.get('roomName', None)
  811. room_id = request_dict.get('roomId', None)
  812. if not all([family_id, room_name]):
  813. return response.json(444)
  814. with transaction.atomic():
  815. now_time = int(time.time())
  816. if room_id:
  817. room_qs = FamilyRoom.objects.filter(id=int(room_id))
  818. if room_qs.exists():
  819. room_qs.update(name=room_name, updated_time=now_time)
  820. return response.json(0)
  821. room_qs = FamilyRoom.objects.filter(family_id=family_id, name=room_name)
  822. if room_qs.exists():
  823. return response.json(174)
  824. FamilyRoom.objects.create(family_id=family_id, name=room_name, updated_time=now_time,
  825. created_time=now_time)
  826. return response.json(0)
  827. @classmethod
  828. def changes_member_permission(cls, app_user_id, request_dict, response):
  829. """
  830. 更新家庭成员权限
  831. @param app_user_id: 当前app登录用户
  832. @param request_dict: 请求参数
  833. @param response: 响应实体
  834. @return:
  835. """
  836. family_id = request_dict.get('familyId', None)
  837. user_id = request_dict.get('userId', None)
  838. no = request_dict.get('no', None)
  839. if not all([family_id, user_id, no]):
  840. return response.json(444)
  841. owner = cls.get_family_owner(app_user_id, family_id)
  842. if not owner:
  843. return response.json(404)
  844. permission_qs = FamilyMemberPermission.objects.filter(no=no).values()
  845. if permission_qs.exists():
  846. permission_qs = permission_qs.first()
  847. p_id = permission_qs['id']
  848. FamilyMember.objects.filter(family_id=family_id, user_id=user_id).update(permission_id=p_id)
  849. return response.json(0)
  850. @classmethod
  851. def family_member_del(cls, app_user_id, request_dict, response):
  852. """
  853. 家庭成员删除
  854. @param app_user_id: 当前app登录用户
  855. @param request_dict: 请求参数
  856. @param response: 响应实体
  857. @return:
  858. """
  859. family_id = request_dict.get('familyId', None)
  860. user_id = request_dict.get('userId', None)
  861. if not all([family_id, user_id]):
  862. return response.json(444)
  863. owner = cls.get_family_owner(app_user_id, family_id)
  864. if not owner:
  865. return response.json(404)
  866. family_member_qs = FamilyMember.objects.filter(family_id=family_id, user_id=user_id)
  867. if family_member_qs.exists():
  868. family_member_qs.delete()
  869. return response.json(0)
  870. @classmethod
  871. def get_member_permission_list(cls, app_user_id, request_dict, response):
  872. """
  873. 获取用户权限列表
  874. @param app_user_id: 当前app登录用户
  875. @param request_dict:
  876. @param response:
  877. @return:
  878. """
  879. family_id = request_dict.get('familyId', None)
  880. user_id = request_dict.get('userId', app_user_id)
  881. if not family_id:
  882. return response.json(404)
  883. result = cls.get_member_permission_by_family_id(user_id, family_id)
  884. return response.json(0, result)
  885. @classmethod
  886. def get_member_permission_by_family_id(cls, user_id, family_id):
  887. """
  888. 获取权限列表并返回当前user_id所在家庭中权限
  889. @param user_id:
  890. @param family_id:
  891. @return:
  892. """
  893. member_qs = FamilyMember.objects.filter(family_id=family_id)
  894. if user_id:
  895. member_qs = member_qs.filter(user_id=user_id).values()
  896. if member_qs.exists():
  897. member_qs = member_qs.first()
  898. permission = FamilyMemberPermission.objects.all().values('id', 'no')
  899. data_list = []
  900. this_permission = {}
  901. result = {}
  902. for item in permission:
  903. if item['id'] == member_qs['permission_id']:
  904. this_permission['id'] = item['id']
  905. this_permission['no'] = item['no']
  906. data_list.append(item)
  907. result['memberPermission'] = this_permission
  908. result['permissionList'] = data_list
  909. return result
  910. @classmethod
  911. def get_member_permission_details(cls, user_id, family_id):
  912. """
  913. 根据用户id获取家庭设备权限
  914. @param user_id:
  915. @param family_id:
  916. @return: 权限编号 001:所有权限,002:查看设备,003:暂无权限
  917. """
  918. member_qs = FamilyMember.objects.filter(family_id=family_id, user_id=user_id).values()
  919. if member_qs.exists():
  920. member_qs = member_qs.first()
  921. permission_id = member_qs['permission_id']
  922. permission_qs = FamilyMemberPermission.objects.filter(id=permission_id).values('no')
  923. return permission_qs.first()['no']
  924. return ''
  925. @classmethod
  926. def get_family_owner(cls, user_id, family_id):
  927. """
  928. 判断是否是家庭主用户
  929. @param user_id:
  930. @param family_id:
  931. @return:
  932. """
  933. user_family_qs = UserFamily.objects.filter(id=family_id, user_id=user_id)
  934. if user_family_qs.exists():
  935. return True
  936. return False
  937. @classmethod
  938. def get_device(cls, user_id, request_dict, response):
  939. """
  940. 首页设备查询
  941. @param user_id: 用户id
  942. @param request_dict: 请求参数
  943. @request_dict page: 页数
  944. @request_dict line: 分页大小
  945. @request_dict familyId: 家庭id
  946. @request_dict roomId: 房间id
  947. @param response: 响应对象
  948. @return: response
  949. """
  950. page = request_dict.get('page', None)
  951. line = request_dict.get('line', None)
  952. family_id = request_dict.get('familyId', None)
  953. room_id = request_dict.get('roomId', None)
  954. if not all([page, line, family_id]):
  955. return response.json(444, {'error param': 'page or line or family_id'})
  956. page = int(page)
  957. line = int(line)
  958. device_dict = {
  959. 'gateways': [],
  960. 'cameras': [],
  961. 'sensors': [],
  962. 'sort': []
  963. }
  964. permission = cls.get_member_permission_details(user_id, int(family_id))
  965. if not permission or permission == '003':
  966. return response.json(404)
  967. family_room_device_qs = FamilyRoomDevice.objects \
  968. .filter(Q(family_id=family_id), ~Q(device_id__isExist=2)) \
  969. .values().order_by('sort', '-device__data_joined')
  970. if not family_room_device_qs.exists():
  971. return response.json(0, device_dict)
  972. gateways = []
  973. cameras = []
  974. sensors = []
  975. try:
  976. category_sort = family_room_device_qs.values('category').annotate(
  977. count=Count('category')).values('category', 'category_sort').order_by('category_sort')
  978. for item in category_sort:
  979. if item['category'] == 0:
  980. item['category_name'] = '网关子设备类'
  981. else:
  982. item['category_name'] = '摄像头类'
  983. device_dict['sort'] = list(category_sort)
  984. if room_id:
  985. family_room = FamilyRoom.objects.filter(id=room_id)
  986. if not family_room.exists():
  987. return response.json(0, device_dict)
  988. family_room_device_qs = family_room_device_qs.filter(room_id=room_id)
  989. # 处理网关摄像头
  990. gateways_or_cameras_qs = family_room_device_qs.filter(sub_device=0)[(page - 1) * line:page * line]
  991. for item in gateways_or_cameras_qs:
  992. room_qs = FamilyRoom.objects.filter(id=item['room_id']).values('name')
  993. room_name = room_qs[0]['name'] if room_qs.exists() else ''
  994. device_qs = Device_Info.objects.filter(id=item['device_id']).values(
  995. 'id', 'userID', 'NickName', 'UID', 'View_Account', 'View_Password',
  996. 'ChannelIndex',
  997. 'Type', 'isShare', 'primaryUserID', 'primaryMaster', 'data_joined',
  998. 'vodPrimaryUserID',
  999. 'vodPrimaryMaster', 'userID__userEmail', 'version', 'isVod',
  1000. 'isExist', 'NotificationMode',
  1001. 'isCameraOpenCloud', 'serial_number'
  1002. ).first()
  1003. if device_qs:
  1004. if device_qs['View_Password']:
  1005. device_qs['View_Password'] = CommonService.encode_data(device_qs['View_Password'], 1, 4)
  1006. device_qs['sensorStatus'] = 0
  1007. device_qs['roomName'] = room_name
  1008. if device_qs['primaryUserID'] and device_qs['id'] == device_qs['primaryUserID']:
  1009. device_qs['isPrimaryUser'] = 1
  1010. else:
  1011. device_qs['isPrimaryUser'] = 0
  1012. if 'data_joined' in device_qs:
  1013. if device_qs['data_joined']:
  1014. device_qs['data_joined'] = device_qs['data_joined'].strftime("%Y-%m-%d %H:%M:%S")
  1015. else:
  1016. device_qs['data_joined'] = ''
  1017. if device_qs['Type'] == 200 or device_qs['Type'] == 201:
  1018. if device_qs['Type'] == 201:
  1019. socket_info_qs = SocketInfo.objects.filter(device_id=device_qs['id']).values(
  1020. 'status')
  1021. device_qs['socketStatus'] = socket_info_qs.first()[
  1022. 'status'] if socket_info_qs.exists() else ''
  1023. gateways.append(device_qs)
  1024. else:
  1025. cameras.append(device_qs)
  1026. # 处理传感器
  1027. sensors_qs = family_room_device_qs.filter(~Q(sub_device=0))
  1028. for item in sensors_qs: # 查询传感器
  1029. sub_device_qs = GatewaySubDevice.objects.filter(id=item['sub_device']).values()
  1030. if sub_device_qs.exists():
  1031. sub_device_dict = {
  1032. "id": sub_device_qs[0]['id'],
  1033. "NickName": sub_device_qs[0]['nickname'],
  1034. "Type": sub_device_qs[0]['device_type'],
  1035. 'sensorStatus': sub_device_qs[0]['status'],
  1036. }
  1037. sensors.append(sub_device_dict)
  1038. device_dict['sensors'] = sensors
  1039. device_list = [gateways, cameras]
  1040. for index, item in enumerate(device_list):
  1041. uid_list = []
  1042. for dvl in item:
  1043. uid_list.append(dvl['UID'])
  1044. # 设备关联套餐,设备预览图
  1045. uid_bucket_qs, uid_preview_qs = cls.get_bucket_and_preview_by_uid(uid_list)
  1046. # 设备配置信息
  1047. uid_set_dict = cls.get_uid_set_dict(uid_list)
  1048. # 设备详情信息
  1049. result = cls.get_device_details(item, uid_bucket_qs, uid_preview_qs, uid_set_dict)
  1050. if index == 0:
  1051. device_dict['gateways'] = result
  1052. else:
  1053. device_dict['cameras'] = result
  1054. return response.json(0, device_dict)
  1055. except Exception as e:
  1056. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))