GatewayFamilyMemberController.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  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 Model.models import UserFamily, FamilyMemberJoin, FamilyMember, Device_User, SysMsgModel
  14. from Object.RedisObject import RedisObject
  15. from Object.ResponseObject import ResponseObject
  16. from Object.TokenObject import TokenObject
  17. from Service.CommonService import CommonService
  18. # 家庭房间管理
  19. class GatewayFamilyMemberView(View):
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. operation = kwargs.get('operation')
  23. return self.validation(request.GET, request, operation)
  24. def post(self, request, *args, **kwargs):
  25. request.encoding = 'utf-8'
  26. operation = kwargs.get('operation')
  27. return self.validation(request.POST, request, operation)
  28. def validation(self, request_dict, request, operation):
  29. token = request.META.get('HTTP_AUTHORIZATION')
  30. token = TokenObject(token)
  31. lang = request_dict.get('lang', None)
  32. response = ResponseObject(lang) if lang else ResponseObject(token.lang)
  33. if token.code != 0:
  34. return response.json(token.code)
  35. app_user_id = token.userID
  36. # 添加设备关联房间
  37. if operation == 'join':
  38. return self.member_join(app_user_id, request_dict, response)
  39. elif operation == 'join/page':
  40. return self.member_join_page(request_dict, response)
  41. elif operation == 'qrcode/generate':
  42. return self.family_generate_token(app_user_id, request_dict, response)
  43. elif operation == 'qrcode/check':
  44. return self.check_qrcode(request_dict, response)
  45. elif operation == 'join/info':
  46. return self.member_join_info(request_dict, response)
  47. @classmethod
  48. def member_join_info(cls, request_dict, response):
  49. """
  50. 查询加入家庭信息
  51. @param request_dict:
  52. @param response:
  53. @return:
  54. """
  55. join_id = request_dict.get('joinId', None)
  56. if not join_id:
  57. return response.json(444)
  58. join_id = int(join_id)
  59. family_join_qs = FamilyMemberJoin.objects.filter(id=join_id)
  60. if not family_join_qs.exists():
  61. return response.json(173)
  62. family_join_qs = family_join_qs.values('type', 'user__NickName', 'family__name', 'status', 'id')
  63. family_join_qs = family_join_qs.first()
  64. return response.json(0, {
  65. 'id': family_join_qs['id'],
  66. 'type': family_join_qs['type'],
  67. 'nickName': family_join_qs['user__NickName'],
  68. 'familyName': family_join_qs['family__name'],
  69. 'status': family_join_qs['status'],
  70. })
  71. @classmethod
  72. def member_join(cls, app_user_id, request_dict, response):
  73. """
  74. 家庭成员加入
  75. @param app_user_id:
  76. @param request_dict:
  77. @param response:
  78. @return:
  79. """
  80. family_id = request_dict.get('familyId', None)
  81. invite = request_dict.get('QRCodeInvite', 0)
  82. user_id = request_dict.get('app_user_id', None)
  83. lang = request_dict.get('lang', 'en')
  84. if not all([family_id, invite]):
  85. return response.json(444)
  86. invite = int(invite)
  87. family_id = int(family_id)
  88. now_time = int(time.time())
  89. # 判断当前家庭是否已有该成员
  90. if invite == 1:
  91. family_qs = FamilyMember.objects.filter(family_id=family_id, user_id=app_user_id)
  92. elif user_id:
  93. family_qs = FamilyMember.objects.filter(family_id=family_id, user_id=user_id)
  94. else:
  95. return response.json(173)
  96. if family_qs.exists():
  97. return response.json(174)
  98. try:
  99. user_family_qs = UserFamily.objects.filter(id=family_id)
  100. if not user_family_qs:
  101. return response.json(173)
  102. user_family = user_family_qs.first()
  103. family_name = user_family.name
  104. data = {
  105. 'addTime': now_time,
  106. 'updTime': now_time,
  107. 'eventType': 705
  108. }
  109. # 请求加入家庭,用户信息
  110. user_qs = Device_User.objects.filter(userID=app_user_id)
  111. nick_name = user_qs.first().NickName
  112. if invite == 1:
  113. msg_text = cls.get_msg_text(nick_name, family_name, lang, True)
  114. # 通知对象 家庭所有者
  115. join_user_id = app_user_id
  116. data['userID_id'] = user_family.user_id
  117. elif app_user_id:
  118. msg_text = cls.get_msg_text(nick_name, family_name, lang, False)
  119. # 通知对象 被邀请人
  120. join_user_id = user_id
  121. data['userID_id'] = user_id
  122. else:
  123. return response.json(173)
  124. data['msg'] = msg_text
  125. with transaction.atomic():
  126. family_user_join = FamilyMemberJoin.objects.create(family_id=family_id, user_id=join_user_id,
  127. status=0,
  128. updated_time=now_time,
  129. created_time=now_time,
  130. type=invite)
  131. data['uid'] = family_user_join.id
  132. SysMsgModel.objects.create(**data)
  133. return response.json(0)
  134. except Exception as e:
  135. print(e)
  136. return response.json(177, repr(e))
  137. @classmethod
  138. def get_msg_text(cls, nick_name, family_name, lang, is_invite=False):
  139. """
  140. 系统消息通知内容,中英文判断
  141. @param nick_name:
  142. @param family_name:
  143. @param lang:
  144. @param is_invite:
  145. @return:
  146. """
  147. if lang and lang == 'cn':
  148. if is_invite:
  149. msg_text = '{}请求加入你的{}'.format(nick_name, family_name)
  150. else:
  151. msg_text = '{}邀请你加入{}'.format(nick_name, family_name)
  152. else:
  153. if is_invite:
  154. msg_text = '{} Request to join your Homegroup {}'.format(nick_name, family_name)
  155. else:
  156. msg_text = '{} invite you to join the Homegroup {}'.format(nick_name, family_name)
  157. return msg_text
  158. @classmethod
  159. def member_join_page(cls, request_dict, response):
  160. """
  161. 家庭成员邀请记录
  162. @param request_dict:
  163. @param response:
  164. @return:
  165. """
  166. page_no = request_dict.get('pageNo', None)
  167. page_size = request_dict.get('pageSize', None)
  168. family_id = request_dict.get('familyId', None)
  169. if not all([page_no, page_size, family_id]):
  170. return response.json(444)
  171. member_join = FamilyMemberJoin.objects.filter(family_id=family_id).values('status', 'user__username',
  172. 'user__userIconUrl', 'user__phone',
  173. 'user__userEmail', 'updated_time',
  174. 'created_time',
  175. 'user__NickName')
  176. page_no = int(page_no)
  177. page_size = int(page_size)
  178. member_join = member_join.order_by('-created_time')[(page_no - 1) * page_size: page_no * page_size]
  179. if not member_join.exists():
  180. return response.json(0, [])
  181. result = []
  182. for item in member_join:
  183. result.append({
  184. 'status': item['status'],
  185. 'userName': item['user__username'],
  186. 'userIconUrl': item['user__userIconUrl'],
  187. 'phone': item['user__phone'],
  188. 'nickName': item['user__NickName'],
  189. 'userEmail': item['user__userEmail'],
  190. 'updatedTime': item['updated_time'],
  191. 'createdTime': item['created_time']
  192. })
  193. return response.json(0, result)
  194. @classmethod
  195. def family_generate_token(cls, app_user_id, request_dict, response):
  196. """
  197. 获取家庭令牌信息
  198. @param app_user_id:
  199. @param request_dict:
  200. @param response:
  201. @return:
  202. """
  203. family_id = request_dict.get('familyId', None)
  204. if not family_id:
  205. return response.json(444)
  206. family_id = int(family_id)
  207. family_qs = UserFamily.objects.filter(id=family_id, user_id=app_user_id) \
  208. .values('name', 'user__userEmail',
  209. 'user__userIconUrl',
  210. 'user__phone', 'user__NickName',
  211. 'user__username')
  212. if not family_qs.exists():
  213. return response.json(173)
  214. family_qs = family_qs.first()
  215. data = {'sharer': app_user_id, 'familyId': family_id}
  216. # -----------------
  217. # share_token = jwt.encode(data, '.#^^&', algorithm='HS256').decode('utf-8')
  218. # +++++++++++++++++
  219. redisObj = RedisObject()
  220. share_token = str(int(time.time())) + CommonService.RandomStr(8)
  221. if not redisObj.set_data(key=share_token, val=json.dumps(data), expire=300):
  222. return response.json(10, '生成失败')
  223. return response.json(0, {
  224. 'shareToken': share_token,
  225. 'userPhone': family_qs['user__phone'],
  226. 'nickName': family_qs['user__NickName'],
  227. 'userIconUrl': family_qs['user__userIconUrl'],
  228. 'userName': family_qs['user__username'],
  229. 'familyName': family_qs['name'],
  230. 'userEmail': family_qs['user__userEmail'],
  231. })
  232. @classmethod
  233. def check_qrcode(cls, request_dict, response):
  234. """
  235. 检查二维码是否过期
  236. @param request_dict:
  237. @param response:
  238. @return:
  239. """
  240. share_token = request_dict.get('shareToken', None)
  241. if not share_token:
  242. return response.json(444)
  243. redisObj = RedisObject()
  244. share_data = redisObj.get_data(key=share_token)
  245. if not share_data:
  246. return response.json(119)
  247. data = json.loads(share_data)
  248. sharer = data.get('sharer', None)
  249. family_id = data.get('familyId', None)
  250. if not all([sharer, family_id]):
  251. return response.json(173)
  252. family_id = int(family_id)
  253. user_family_qs = UserFamily.objects.filter(id=family_id)
  254. if not user_family_qs.exists():
  255. return response.json(173)
  256. user_family_qs = user_family_qs.values('name', 'user__userEmail',
  257. 'user__userIconUrl',
  258. 'user__phone', 'user__NickName',
  259. 'user__username')
  260. return response.json(0, {
  261. 'userPhone': user_family_qs[0]['user__phone'],
  262. 'nickName': user_family_qs[0]['user__NickName'],
  263. 'userIconUrl': user_family_qs[0]['user__userIconUrl'],
  264. 'userName': user_family_qs[0]['user__username'],
  265. 'familyName': user_family_qs[0]['name'],
  266. 'userEmail': user_family_qs[0]['user__userEmail'],
  267. })