EquipmentFamilyController.py 39 KB

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