GatewayFamilyMemberController.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. # -*- encoding: utf-8 -*-
  2. """
  3. @File : GatewayFamilyMemberController.py
  4. @Time : 2022/5/25 10:21
  5. @Author : stephen
  6. @Email : zhangdongming@asj6.wecom.work
  7. @Software: PyCharm
  8. """
  9. import json
  10. import time
  11. from django.db import transaction
  12. from django.views.generic.base import View
  13. from Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyView
  14. from Model.models import UserFamily, FamilyMemberJoin, FamilyMember, SysMsgModel, FamilyMemberPermission, \
  15. Device_User, FamilyRoomDevice
  16. from Object.RedisObject import RedisObject
  17. from Object.ResponseObject import ResponseObject
  18. from Object.TokenObject import TokenObject
  19. from Service.CommonService import CommonService
  20. # 家庭房间管理
  21. class GatewayFamilyMemberView(View):
  22. def get(self, request, *args, **kwargs):
  23. request.encoding = 'utf-8'
  24. operation = kwargs.get('operation')
  25. return self.validation(request.GET, request, operation)
  26. def post(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. operation = kwargs.get('operation')
  29. return self.validation(request.POST, request, operation)
  30. def validation(self, request_dict, request, operation):
  31. token = request.META.get('HTTP_AUTHORIZATION')
  32. token = TokenObject(token)
  33. lang = request_dict.get('lang', None)
  34. response = ResponseObject(lang) if lang else ResponseObject(token.lang)
  35. if token.code != 0:
  36. return response.json(token.code)
  37. app_user_id = token.userID
  38. # 添加设备关联房间
  39. if operation == 'join':
  40. return self.member_join(app_user_id, request_dict, response)
  41. elif operation == 'join/page':
  42. return self.member_join_page(request_dict, response)
  43. elif operation == 'qrcode/generate':
  44. return self.family_generate_token(app_user_id, request_dict, response)
  45. elif operation == 'qrcode/check':
  46. return self.check_qrcode(request_dict, response)
  47. elif operation == 'join/info':
  48. return self.member_join_info(request_dict, response)
  49. elif operation == 'join/update':
  50. return self.user_join_confirm(request_dict, response)
  51. elif operation == 'del':
  52. return self.member_del(app_user_id, request_dict, response)
  53. elif operation == 'created':
  54. return self.family_created(app_user_id, request_dict, response)
  55. elif operation == 'del/home':
  56. return self.del_home(app_user_id, request_dict, response)
  57. elif operation == 'join/del':
  58. return self.member_join_del(app_user_id, request_dict, response)
  59. @classmethod
  60. def member_join_del(cls, app_user_id, request_dict, response):
  61. """
  62. 删除最近联系人
  63. @param app_user_id:
  64. @param request_dict:
  65. @param response:
  66. @return:
  67. """
  68. member_id = request_dict.get('memberId', None)
  69. if not member_id:
  70. return response.json()
  71. family_member_join_qs = FamilyMemberJoin.objects.filter(id=member_id)
  72. if not family_member_join_qs.exists():
  73. return response.json(173)
  74. is_owner = EquipmentFamilyView.get_family_owner(app_user_id, family_member_join_qs.first().family_id)
  75. if not is_owner:
  76. return response.json(404)
  77. try:
  78. with transaction.atomic():
  79. family_member_join_qs.delete()
  80. return response.json(0)
  81. except Exception as e:
  82. print(e)
  83. return response.json(177, repr(e))
  84. @classmethod
  85. def del_home(cls, app_user_id, request_dict, response):
  86. """
  87. 删除家庭
  88. @param app_user_id:
  89. @param request_dict:
  90. @param response:
  91. @return:
  92. """
  93. family_id = request_dict.get('familyId', None)
  94. if not family_id:
  95. return response.json(444)
  96. is_owner = EquipmentFamilyView.get_family_owner(app_user_id, family_id)
  97. if not is_owner:
  98. return response.json(404)
  99. family_id = int(family_id)
  100. try:
  101. with transaction.atomic():
  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. user_family_qs = UserFamily.objects.filter(id=family_id)
  106. if user_family_qs.exists():
  107. user_family_qs.delete()
  108. return response.json(0)
  109. return response.json(176)
  110. except Exception as e:
  111. print(e)
  112. return response.json(177, repr(e))
  113. @classmethod
  114. def family_created(cls, app_user_id, request_dict, response):
  115. """
  116. 创建家庭
  117. @param app_user_id:
  118. @param request_dict:
  119. @param response:
  120. @return:
  121. """
  122. family_name = request_dict.get('familyName', None)
  123. if not family_name:
  124. return response.json(444)
  125. n_time = int(time.time())
  126. location = request_dict.get('location', '')
  127. try:
  128. with transaction.atomic():
  129. member_permission_qs = FamilyMemberPermission.objects.filter(no='001').values('id')
  130. user_family = UserFamily.objects.create(user_id=app_user_id, name=family_name,
  131. location=location,
  132. updated_time=n_time,
  133. created_time=n_time)
  134. if user_family.id:
  135. device_user = Device_User.objects.get(userID=app_user_id)
  136. permission_id = member_permission_qs.first()['id']
  137. FamilyMember.objects.create(family_id=user_family.id, user_id=app_user_id,
  138. user_name=device_user.username, identity=1,
  139. permission_id=int(permission_id), sort=1, updated_time=n_time,
  140. created_time=n_time)
  141. return response.json(0)
  142. except Exception as e:
  143. print(e)
  144. return response.json(177, repr(e))
  145. @classmethod
  146. def member_del(cls, app_user_id, request_dict, response):
  147. """
  148. 成员删除或退出
  149. @param app_user_id:
  150. @param request_dict:
  151. @param response:
  152. @return:
  153. """
  154. member_id = request_dict.get('memberId', None)
  155. family_id = request_dict.get('familyId', None)
  156. if not family_id:
  157. return response.json(444)
  158. try:
  159. family_id = int(family_id)
  160. with transaction.atomic():
  161. # 家庭所有者删除成员
  162. if member_id:
  163. is_owner = EquipmentFamilyView.get_family_owner(app_user_id, family_id)
  164. if not is_owner:
  165. return response.json(404)
  166. member_id = int(member_id)
  167. family_member_qs = FamilyMember.objects.filter(id=member_id)
  168. if not family_member_qs.exists():
  169. return response.json(173)
  170. family_member_qs.delete()
  171. return response.json(0)
  172. else:
  173. # 成员退出当前家庭
  174. family_member = FamilyMember.objects.filter(user_id=app_user_id, identity=1)
  175. if family_member.exists():
  176. return response.json(173)
  177. family_member_qs = FamilyMember.objects.filter(family_id=family_id, user_id=app_user_id)
  178. if not family_member_qs.exists():
  179. return response.json(173)
  180. family_member_qs.delete()
  181. return response.json(0)
  182. except Exception as e:
  183. return response.json(177, repr(e))
  184. @classmethod
  185. def user_join_confirm(cls, request_dict, response):
  186. """
  187. 用户加入家庭确认
  188. @param request_dict:
  189. @param response:
  190. @return:
  191. """
  192. join_id = request_dict.get('joinId', None)
  193. confirm = request_dict.get('confirm', None)
  194. lang = request_dict.get('lang', 'en')
  195. if not all([join_id, confirm]):
  196. return response.json(444)
  197. join_id = int(join_id)
  198. family_join = FamilyMemberJoin.objects.filter(id=join_id, status=0)
  199. if not family_join.exists():
  200. return response.json(173)
  201. try:
  202. now_time = int(time.time())
  203. with transaction.atomic():
  204. family_join.update(status=2 if confirm == 'confirm' else 1)
  205. family_join = FamilyMemberJoin.objects.filter(id=join_id)
  206. family_join = family_join.values('id', 'user_id', 'user__username', 'user__NickName', 'family__name',
  207. 'family_id', 'family__user_id', 'status', 'type', 'updated_time')
  208. family_join = family_join.first()
  209. nick_name = family_join['user__NickName']
  210. family_name = family_join['family__name']
  211. join_type = family_join['type']
  212. data = {
  213. 'addTime': now_time,
  214. 'updTime': now_time,
  215. 'userID_id': family_join['family__user_id'] if join_type == 1 else family_join['user_id'],
  216. 'eventType': 705
  217. }
  218. if confirm == 'confirm':
  219. msg_text = cls.get_confirm_text(nick_name, family_name, join_type, True, lang)
  220. p_id = FamilyMemberPermission.objects.filter(no='002').values('id').first()
  221. p_id = p_id['id']
  222. FamilyMember.objects.create(family_id=family_join['family_id'], updated_time=now_time,
  223. user_id=family_join['user_id'],
  224. created_time=now_time,
  225. permission_id=p_id,
  226. user_name=family_join['user__username'])
  227. elif confirm == 'refusal':
  228. msg_text = cls.get_confirm_text(nick_name, family_name, join_type, False, lang)
  229. else:
  230. ex = Exception("data is null")
  231. raise ex
  232. data['msg'] = msg_text
  233. data['uid'] = family_join['id']
  234. SysMsgModel.objects.create(**data)
  235. return response.json(0)
  236. except Exception as e:
  237. print(e)
  238. return response.json(177, repr(e))
  239. @classmethod
  240. def get_confirm_text(cls, nick_name, family_name, join_type, is_confirm, lang='en'):
  241. # join_type == 1等于扫码请求加u人
  242. if is_confirm:
  243. if join_type == 1:
  244. if lang == 'cn':
  245. msg_text = '{} 同意你的请求'.format(family_name)
  246. else:
  247. msg_text = '{} confirm to your request'.format(family_name)
  248. else:
  249. if lang == 'cn':
  250. msg_text = '{}同意加入{}'.format(nick_name, family_name)
  251. else:
  252. msg_text = '{} confirm to join {}'.format(nick_name, family_name)
  253. else:
  254. if join_type == 1:
  255. if lang == 'cn':
  256. msg_text = '{}拒绝你的请求'.format(family_name)
  257. else:
  258. msg_text = '{} refused your request'.format(family_name)
  259. else:
  260. if lang == 'cn':
  261. msg_text = '{}拒绝加入{}'.format(nick_name, family_name)
  262. else:
  263. msg_text = '{} refused to join '.format(family_name)
  264. return msg_text
  265. @classmethod
  266. def member_join_info(cls, request_dict, response):
  267. """
  268. 查询加入家庭信息
  269. @param request_dict:
  270. @param response:
  271. @return:
  272. """
  273. join_id = request_dict.get('joinId', None)
  274. if not join_id:
  275. return response.json(444)
  276. join_id = int(join_id)
  277. family_join_qs = FamilyMemberJoin.objects.filter(id=join_id)
  278. if not family_join_qs.exists():
  279. return response.json(173)
  280. family_join_qs = family_join_qs.values('type', 'user__NickName', 'family__name', 'status', 'id')
  281. family_join_qs = family_join_qs.first()
  282. return response.json(0, {
  283. 'id': family_join_qs['id'],
  284. 'type': family_join_qs['type'],
  285. 'nickName': family_join_qs['user__NickName'],
  286. 'familyName': family_join_qs['family__name'],
  287. 'status': family_join_qs['status'],
  288. })
  289. @classmethod
  290. def member_join(cls, app_user_id, request_dict, response):
  291. """
  292. 家庭成员加入
  293. @param app_user_id:
  294. @param request_dict:
  295. @param response:
  296. @return:
  297. """
  298. family_id = request_dict.get('familyId', None)
  299. invite = request_dict.get('QRCodeInvite', 0)
  300. user_id = request_dict.get('app_user_id', None)
  301. lang = request_dict.get('lang', 'en')
  302. if not all([family_id, invite]):
  303. return response.json(444)
  304. invite = int(invite)
  305. family_id = int(family_id)
  306. now_time = int(time.time())
  307. # 判断当前家庭是否已有该成员
  308. if invite == 1:
  309. family_qs = FamilyMember.objects.filter(family_id=family_id, user_id=app_user_id)
  310. elif user_id:
  311. family_qs = FamilyMember.objects.filter(family_id=family_id, user_id=user_id)
  312. else:
  313. return response.json(173)
  314. if family_qs.exists():
  315. return response.json(174)
  316. try:
  317. user_family_qs = UserFamily.objects.filter(id=family_id)
  318. if not user_family_qs:
  319. return response.json(173)
  320. user_family = user_family_qs.first()
  321. family_name = user_family.name
  322. data = {
  323. 'addTime': now_time,
  324. 'updTime': now_time,
  325. 'eventType': 705
  326. }
  327. # 请求加入家庭,用户信息
  328. user_qs = Device_User.objects.filter(userID=app_user_id)
  329. nick_name = user_qs.first().NickName
  330. if invite == 1:
  331. msg_text = cls.get_msg_text(nick_name, family_name, lang, True)
  332. # 通知对象 家庭所有者
  333. join_user_id = app_user_id
  334. data['userID_id'] = user_family.user_id
  335. elif app_user_id:
  336. msg_text = cls.get_msg_text(nick_name, family_name, lang, False)
  337. # 通知对象 被邀请人
  338. join_user_id = user_id
  339. data['userID_id'] = user_id
  340. else:
  341. return response.json(173)
  342. data['msg'] = msg_text
  343. with transaction.atomic():
  344. family_user_join = FamilyMemberJoin.objects.create(family_id=family_id, user_id=join_user_id,
  345. status=0,
  346. updated_time=now_time,
  347. created_time=now_time,
  348. type=invite)
  349. data['uid'] = family_user_join.id
  350. SysMsgModel.objects.create(**data)
  351. return response.json(0)
  352. except Exception as e:
  353. print(e)
  354. return response.json(177, repr(e))
  355. @classmethod
  356. def get_msg_text(cls, nick_name, family_name, lang, is_invite=False):
  357. """
  358. 系统消息通知内容,中英文判断
  359. @param nick_name:
  360. @param family_name:
  361. @param lang:
  362. @param is_invite:
  363. @return:
  364. """
  365. if lang and lang == 'cn':
  366. if is_invite:
  367. msg_text = '{}请求加入你的{}'.format(nick_name, family_name)
  368. else:
  369. msg_text = '{}邀请你加入{}'.format(nick_name, family_name)
  370. else:
  371. if is_invite:
  372. msg_text = '{} Request to join your Homegroup {}'.format(nick_name, family_name)
  373. else:
  374. msg_text = '{} invite you to join the Homegroup {}'.format(nick_name, family_name)
  375. return msg_text
  376. @classmethod
  377. def member_join_page(cls, request_dict, response):
  378. """
  379. 家庭成员邀请记录
  380. @param request_dict:
  381. @param response:
  382. @return:
  383. """
  384. page_no = request_dict.get('pageNo', None)
  385. page_size = request_dict.get('pageSize', None)
  386. family_id = request_dict.get('familyId', None)
  387. if not all([page_no, page_size, family_id]):
  388. return response.json(444)
  389. member_join = FamilyMemberJoin.objects.filter(family_id=family_id).values('status', 'user__username',
  390. 'user__userIconUrl', 'user__phone',
  391. 'user__userEmail', 'updated_time',
  392. 'created_time',
  393. 'user__NickName')
  394. page_no = int(page_no)
  395. page_size = int(page_size)
  396. member_join = member_join.order_by('-created_time')[(page_no - 1) * page_size: page_no * page_size]
  397. if not member_join.exists():
  398. return response.json(0, [])
  399. result = []
  400. for item in member_join:
  401. result.append({
  402. 'status': item['status'],
  403. 'userName': item['user__username'],
  404. 'userIconUrl': item['user__userIconUrl'],
  405. 'phone': item['user__phone'],
  406. 'nickName': item['user__NickName'],
  407. 'userEmail': item['user__userEmail'],
  408. 'updatedTime': item['updated_time'],
  409. 'createdTime': item['created_time']
  410. })
  411. return response.json(0, result)
  412. @classmethod
  413. def family_generate_token(cls, app_user_id, request_dict, response):
  414. """
  415. 获取家庭令牌信息
  416. @param app_user_id:
  417. @param request_dict:
  418. @param response:
  419. @return:
  420. """
  421. family_id = request_dict.get('familyId', None)
  422. if not family_id:
  423. return response.json(444)
  424. family_id = int(family_id)
  425. family_qs = UserFamily.objects.filter(id=family_id, user_id=app_user_id) \
  426. .values('name', 'user__userEmail',
  427. 'user__userIconUrl',
  428. 'user__phone', 'user__NickName',
  429. 'user__username')
  430. if not family_qs.exists():
  431. return response.json(173)
  432. family_qs = family_qs.first()
  433. data = {'sharer': app_user_id, 'familyId': family_id}
  434. # -----------------
  435. # share_token = jwt.encode(data, '.#^^&', algorithm='HS256').decode('utf-8')
  436. # +++++++++++++++++
  437. redisObj = RedisObject()
  438. share_token = str(int(time.time())) + CommonService.RandomStr(22)
  439. if not redisObj.set_data(key=share_token, val=json.dumps(data), expire=300):
  440. return response.json(10, '生成失败')
  441. return response.json(0, {
  442. 'shareToken': share_token,
  443. 'userPhone': family_qs['user__phone'],
  444. 'nickName': family_qs['user__NickName'],
  445. 'userIconUrl': family_qs['user__userIconUrl'],
  446. 'userName': family_qs['user__username'],
  447. 'familyName': family_qs['name'],
  448. 'userEmail': family_qs['user__userEmail'],
  449. })
  450. @classmethod
  451. def check_qrcode(cls, request_dict, response):
  452. """
  453. 检查二维码是否过期
  454. @param request_dict:
  455. @param response:
  456. @return:
  457. """
  458. share_token = request_dict.get('shareToken', None)
  459. if not share_token:
  460. return response.json(444)
  461. redisObj = RedisObject()
  462. share_data = redisObj.get_data(key=share_token)
  463. if not share_data:
  464. return response.json(119)
  465. data = json.loads(share_data)
  466. sharer = data.get('sharer', None)
  467. family_id = data.get('familyId', None)
  468. if not all([sharer, family_id]):
  469. return response.json(173)
  470. family_id = int(family_id)
  471. user_family_qs = UserFamily.objects.filter(id=family_id)
  472. if not user_family_qs.exists():
  473. return response.json(173)
  474. user_family_qs = user_family_qs.values('id', 'name', 'user__userEmail',
  475. 'user__userIconUrl',
  476. 'user__phone', 'user__NickName',
  477. 'user__username')
  478. return response.json(0, {
  479. 'familyId': user_family_qs[0]['id'],
  480. 'userPhone': user_family_qs[0]['user__phone'],
  481. 'nickName': user_family_qs[0]['user__NickName'],
  482. 'userIconUrl': user_family_qs[0]['user__userIconUrl'],
  483. 'userName': user_family_qs[0]['user__username'],
  484. 'familyName': user_family_qs[0]['name'],
  485. 'userEmail': user_family_qs[0]['user__userEmail'],
  486. })