GatewayFamilyMemberController.py 20 KB

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