GatewayFamilyMemberController.py 24 KB

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