EquipmentFamilyController.py 37 KB

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