GatewayFamilyMemberController.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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. @classmethod
  46. def member_join(cls, app_user_id, request_dict, response):
  47. """
  48. 家庭成员加入
  49. @param app_user_id:
  50. @param request_dict:
  51. @param response:
  52. @return:
  53. """
  54. family_id = request_dict.get('familyId', None)
  55. invite = request_dict.get('QRCodeInvite', None)
  56. user_id = request_dict.get('app_user_id', None)
  57. lang = request_dict.get('lang', 'en')
  58. if not all([family_id, invite]):
  59. return response.json(444)
  60. invite = int(invite)
  61. family_id = int(family_id)
  62. now_time = int(time.time())
  63. # 判断当前家庭是否已有该成员
  64. if invite == 1:
  65. family_qs = FamilyMember.objects.filter(family_id=family_id, user_id=app_user_id)
  66. elif user_id:
  67. family_qs = FamilyMember.objects.filter(family_id=family_id, user_id=user_id)
  68. else:
  69. return response.json(173)
  70. if family_qs.exists():
  71. return response.json(174)
  72. try:
  73. user_family_qs = UserFamily.objects.filter(id=family_id)
  74. if not user_family_qs:
  75. return response.json(173)
  76. user_family = user_family_qs.first()
  77. family_name = user_family.name
  78. data = {
  79. 'addTime': now_time,
  80. 'updTime': now_time,
  81. 'eventType': 705
  82. }
  83. # 请求加入家庭,用户信息
  84. user_qs = Device_User.objects.filter(userID=app_user_id)
  85. nick_name = user_qs.first().NickName
  86. if invite == 1:
  87. msg_text = cls.get_msg_text(nick_name, family_name, lang, True)
  88. # 通知对象 家庭所有者
  89. join_user_id = app_user_id
  90. data['userID_id'] = user_family.user_id
  91. elif app_user_id:
  92. msg_text = cls.get_msg_text(nick_name, family_name, lang, False)
  93. # 通知对象 被邀请人
  94. join_user_id = user_id
  95. data['userID_id'] = user_id
  96. else:
  97. return response.json(173)
  98. data['msg'] = msg_text
  99. with transaction.atomic():
  100. family_user_join = FamilyMemberJoin.objects.create(family_id=family_id, user_id=join_user_id,
  101. status=0,
  102. updated_time=now_time,
  103. created_time=now_time)
  104. data['uid'] = family_user_join.id
  105. SysMsgModel.objects.create(**data)
  106. return response.json(0)
  107. except Exception as e:
  108. print(e)
  109. return response.json(177, repr(e))
  110. @classmethod
  111. def get_msg_text(cls, nick_name, family_name, lang, is_invite=False):
  112. """
  113. 系统消息通知内容,中英文判断
  114. @param nick_name:
  115. @param family_name:
  116. @param lang:
  117. @param is_invite:
  118. @return:
  119. """
  120. if lang and lang == 'cn':
  121. if is_invite:
  122. msg_text = '{}请求加入你的{}'.format(nick_name, family_name)
  123. else:
  124. msg_text = '{}邀请你加入{}'.format(nick_name, family_name)
  125. else:
  126. if is_invite:
  127. msg_text = '{} Request to join your Homegroup {}'.format(nick_name, family_name)
  128. else:
  129. msg_text = '{} invite you to join the Homegroup {}'.format(nick_name, family_name)
  130. return msg_text
  131. @classmethod
  132. def member_join_page(cls, request_dict, response):
  133. """
  134. 家庭成员邀请记录
  135. @param request_dict:
  136. @param response:
  137. @return:
  138. """
  139. page_no = request_dict.get('pageNo', None)
  140. page_size = request_dict.get('pageSize', None)
  141. family_id = request_dict.get('familyId', None)
  142. if not all([page_no, page_size, family_id]):
  143. return response.json(444)
  144. member_join = FamilyMemberJoin.objects.filter(family_id=family_id).values('status', 'user__username',
  145. 'user__userIconUrl', 'user__phone',
  146. 'user__userEmail', 'updated_time',
  147. 'created_time')
  148. page_no = int(page_no)
  149. page_size = int(page_size)
  150. member_join = member_join.order_by('-created_time')[(page_no - 1) * page_size: page_no * page_size]
  151. if not member_join.exists():
  152. return response.json(0, [])
  153. result = []
  154. for item in member_join:
  155. result.append({
  156. 'status': item['status'],
  157. 'userName': item['user__username'],
  158. 'userIconUrl': item['user__userIconUrl'],
  159. 'phone': item['user__phone'],
  160. 'nickName': item['user__NickName'],
  161. 'userEmail': item['user__userEmail'],
  162. 'updatedTime': item['updated_time'],
  163. 'createdTime': item['created_time']
  164. })
  165. return response.json(0, result)
  166. @classmethod
  167. def family_generate_token(cls, app_user_id, request_dict, response):
  168. """
  169. 获取家庭令牌信息
  170. @param app_user_id:
  171. @param request_dict:
  172. @param response:
  173. @return:
  174. """
  175. family_id = request_dict.get('familyId', None)
  176. if not family_id:
  177. return response.json(444)
  178. family_id = int(family_id)
  179. family_qs = UserFamily.objects.filter(id=family_id, user_id=app_user_id) \
  180. .values('name', 'user__userEmail',
  181. 'user__userIconUrl',
  182. 'user__phone', 'user__NickName',
  183. 'user__username')
  184. if not family_qs.exists():
  185. return response.json(173)
  186. family_qs = family_qs.first()
  187. data = {'sharer': app_user_id, 'familyId': family_id}
  188. # -----------------
  189. # share_token = jwt.encode(data, '.#^^&', algorithm='HS256').decode('utf-8')
  190. # +++++++++++++++++
  191. redisObj = RedisObject()
  192. share_token = str(int(time.time())) + CommonService.RandomStr(8)
  193. if not redisObj.set_data(key=share_token, val=json.dumps(data), expire=300):
  194. return response.json(10, '生成失败')
  195. return response.json(0, {
  196. 'shareToken': share_token,
  197. 'userPhone': family_qs['user__phone'],
  198. 'nickName': family_qs['user__NickName'],
  199. 'userIconUrl': family_qs['user__userIconUrl'],
  200. 'userName': family_qs['user__username'],
  201. 'familyName': family_qs['name'],
  202. 'userEmail': family_qs['user__userEmail'],
  203. })
  204. @classmethod
  205. def check_qrcode(cls, request_dict, response):
  206. """
  207. 检查二维码是否过期
  208. @param request_dict:
  209. @param response:
  210. @return:
  211. """
  212. share_token = request_dict.get('shareToken', None)
  213. if not share_token:
  214. return response.json(444)
  215. redisObj = RedisObject()
  216. share_data = redisObj.get_data(key=share_token)
  217. if not share_data:
  218. return response.json(119)
  219. data = json.loads(share_data)
  220. sharer = data.get('sharer', None)
  221. family_id = data.get('familyId', None)
  222. if not all([sharer, family_id]):
  223. return response.json(173)
  224. family_id = int(family_id)
  225. user_family_qs = UserFamily.objects.filter(id=family_id)
  226. if not user_family_qs.exists():
  227. return response.json(173)
  228. user_family_qs = user_family_qs.values('name', 'user__userEmail',
  229. 'user__userIconUrl',
  230. 'user__phone', 'user__NickName',
  231. 'user__username')
  232. return response.json(0, {
  233. 'userPhone': user_family_qs['user__phone'],
  234. 'nickName': user_family_qs['user__NickName'],
  235. 'userIconUrl': user_family_qs['user__userIconUrl'],
  236. 'userName': user_family_qs['user__username'],
  237. 'familyName': user_family_qs['name'],
  238. 'userEmail': user_family_qs['user__userEmail'],
  239. })