123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- # -*- encoding: utf-8 -*-
- """
- @File : GatewayFamilyMemberController.py
- @Time : 2022/5/25 10:21
- @Author : stephen
- @Email : zhangdongming@asj6.wecom.work
- @Software: PyCharm
- """
- import json
- import time
- from django.db import transaction
- from django.views.generic.base import View
- from Model.models import UserFamily, FamilyMemberJoin, FamilyMember, Device_User, SysMsgModel
- from Object.RedisObject import RedisObject
- from Object.ResponseObject import ResponseObject
- from Object.TokenObject import TokenObject
- from Service.CommonService import CommonService
- # 家庭房间管理
- class GatewayFamilyMemberView(View):
- def get(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- return self.validation(request.GET, request, operation)
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- return self.validation(request.POST, request, operation)
- def validation(self, request_dict, request, operation):
- token = request.META.get('HTTP_AUTHORIZATION')
- token = TokenObject(token)
- lang = request_dict.get('lang', None)
- response = ResponseObject(lang) if lang else ResponseObject(token.lang)
- if token.code != 0:
- return response.json(token.code)
- app_user_id = token.userID
- # 添加设备关联房间
- if operation == 'join':
- return self.member_join(app_user_id, request_dict, response)
- elif operation == 'join/page':
- return self.member_join_page(request_dict, response)
- elif operation == 'qrcode/generate':
- return self.family_generate_token(app_user_id, request_dict, response)
- elif operation == 'qrcode/check':
- return self.check_qrcode(request_dict, response)
- elif operation == 'join/info':
- return self.member_join_info(request_dict, response)
- @classmethod
- def member_join_info(cls, request_dict, response):
- """
- 查询加入家庭信息
- @param request_dict:
- @param response:
- @return:
- """
- join_id = request_dict.get('joinId', None)
- if not join_id:
- return response.json(444)
- join_id = int(join_id)
- family_join_qs = FamilyMemberJoin.objects.filter(id=join_id)
- if not family_join_qs.exists():
- return response.json(173)
- family_join_qs = family_join_qs.values('type', 'user__NickName', 'family__name', 'status', 'id')
- family_join_qs = family_join_qs.first()
- return response.json(0, {
- 'id': family_join_qs['id'],
- 'type': family_join_qs['type'],
- 'nickName': family_join_qs['user__NickName'],
- 'familyName': family_join_qs['family__name'],
- 'status': family_join_qs['status'],
- })
- @classmethod
- def member_join(cls, app_user_id, request_dict, response):
- """
- 家庭成员加入
- @param app_user_id:
- @param request_dict:
- @param response:
- @return:
- """
- family_id = request_dict.get('familyId', None)
- invite = request_dict.get('QRCodeInvite', 0)
- user_id = request_dict.get('app_user_id', None)
- lang = request_dict.get('lang', 'en')
- if not all([family_id, invite]):
- return response.json(444)
- invite = int(invite)
- family_id = int(family_id)
- now_time = int(time.time())
- # 判断当前家庭是否已有该成员
- if invite == 1:
- family_qs = FamilyMember.objects.filter(family_id=family_id, user_id=app_user_id)
- elif user_id:
- family_qs = FamilyMember.objects.filter(family_id=family_id, user_id=user_id)
- else:
- return response.json(173)
- if family_qs.exists():
- return response.json(174)
- try:
- user_family_qs = UserFamily.objects.filter(id=family_id)
- if not user_family_qs:
- return response.json(173)
- user_family = user_family_qs.first()
- family_name = user_family.name
- data = {
- 'addTime': now_time,
- 'updTime': now_time,
- 'eventType': 705
- }
- # 请求加入家庭,用户信息
- user_qs = Device_User.objects.filter(userID=app_user_id)
- nick_name = user_qs.first().NickName
- if invite == 1:
- msg_text = cls.get_msg_text(nick_name, family_name, lang, True)
- # 通知对象 家庭所有者
- join_user_id = app_user_id
- data['userID_id'] = user_family.user_id
- elif app_user_id:
- msg_text = cls.get_msg_text(nick_name, family_name, lang, False)
- # 通知对象 被邀请人
- join_user_id = user_id
- data['userID_id'] = user_id
- else:
- return response.json(173)
- data['msg'] = msg_text
- with transaction.atomic():
- family_user_join = FamilyMemberJoin.objects.create(family_id=family_id, user_id=join_user_id,
- status=0,
- updated_time=now_time,
- created_time=now_time,
- type=invite)
- data['uid'] = family_user_join.id
- SysMsgModel.objects.create(**data)
- return response.json(0)
- except Exception as e:
- print(e)
- return response.json(177, repr(e))
- @classmethod
- def get_msg_text(cls, nick_name, family_name, lang, is_invite=False):
- """
- 系统消息通知内容,中英文判断
- @param nick_name:
- @param family_name:
- @param lang:
- @param is_invite:
- @return:
- """
- if lang and lang == 'cn':
- if is_invite:
- msg_text = '{}请求加入你的{}'.format(nick_name, family_name)
- else:
- msg_text = '{}邀请你加入{}'.format(nick_name, family_name)
- else:
- if is_invite:
- msg_text = '{} Request to join your Homegroup {}'.format(nick_name, family_name)
- else:
- msg_text = '{} invite you to join the Homegroup {}'.format(nick_name, family_name)
- return msg_text
- @classmethod
- def member_join_page(cls, request_dict, response):
- """
- 家庭成员邀请记录
- @param request_dict:
- @param response:
- @return:
- """
- page_no = request_dict.get('pageNo', None)
- page_size = request_dict.get('pageSize', None)
- family_id = request_dict.get('familyId', None)
- if not all([page_no, page_size, family_id]):
- return response.json(444)
- member_join = FamilyMemberJoin.objects.filter(family_id=family_id).values('status', 'user__username',
- 'user__userIconUrl', 'user__phone',
- 'user__userEmail', 'updated_time',
- 'created_time',
- 'user__NickName')
- page_no = int(page_no)
- page_size = int(page_size)
- member_join = member_join.order_by('-created_time')[(page_no - 1) * page_size: page_no * page_size]
- if not member_join.exists():
- return response.json(0, [])
- result = []
- for item in member_join:
- result.append({
- 'status': item['status'],
- 'userName': item['user__username'],
- 'userIconUrl': item['user__userIconUrl'],
- 'phone': item['user__phone'],
- 'nickName': item['user__NickName'],
- 'userEmail': item['user__userEmail'],
- 'updatedTime': item['updated_time'],
- 'createdTime': item['created_time']
- })
- return response.json(0, result)
- @classmethod
- def family_generate_token(cls, app_user_id, request_dict, response):
- """
- 获取家庭令牌信息
- @param app_user_id:
- @param request_dict:
- @param response:
- @return:
- """
- family_id = request_dict.get('familyId', None)
- if not family_id:
- return response.json(444)
- family_id = int(family_id)
- family_qs = UserFamily.objects.filter(id=family_id, user_id=app_user_id) \
- .values('name', 'user__userEmail',
- 'user__userIconUrl',
- 'user__phone', 'user__NickName',
- 'user__username')
- if not family_qs.exists():
- return response.json(173)
- family_qs = family_qs.first()
- data = {'sharer': app_user_id, 'familyId': family_id}
- # -----------------
- # share_token = jwt.encode(data, '.#^^&', algorithm='HS256').decode('utf-8')
- # +++++++++++++++++
- redisObj = RedisObject()
- share_token = str(int(time.time())) + CommonService.RandomStr(8)
- if not redisObj.set_data(key=share_token, val=json.dumps(data), expire=300):
- return response.json(10, '生成失败')
- return response.json(0, {
- 'shareToken': share_token,
- 'userPhone': family_qs['user__phone'],
- 'nickName': family_qs['user__NickName'],
- 'userIconUrl': family_qs['user__userIconUrl'],
- 'userName': family_qs['user__username'],
- 'familyName': family_qs['name'],
- 'userEmail': family_qs['user__userEmail'],
- })
- @classmethod
- def check_qrcode(cls, request_dict, response):
- """
- 检查二维码是否过期
- @param request_dict:
- @param response:
- @return:
- """
- share_token = request_dict.get('shareToken', None)
- if not share_token:
- return response.json(444)
- redisObj = RedisObject()
- share_data = redisObj.get_data(key=share_token)
- if not share_data:
- return response.json(119)
- data = json.loads(share_data)
- sharer = data.get('sharer', None)
- family_id = data.get('familyId', None)
- if not all([sharer, family_id]):
- return response.json(173)
- family_id = int(family_id)
- user_family_qs = UserFamily.objects.filter(id=family_id)
- if not user_family_qs.exists():
- return response.json(173)
- user_family_qs = user_family_qs.values('name', 'user__userEmail',
- 'user__userIconUrl',
- 'user__phone', 'user__NickName',
- 'user__username')
- return response.json(0, {
- 'userPhone': user_family_qs[0]['user__phone'],
- 'nickName': user_family_qs[0]['user__NickName'],
- 'userIconUrl': user_family_qs[0]['user__userIconUrl'],
- 'userName': user_family_qs[0]['user__username'],
- 'familyName': user_family_qs[0]['name'],
- 'userEmail': user_family_qs[0]['user__userEmail'],
- })
|