GatewayFamilyMemberController.py 22 KB

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