# -*- 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) @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', None) 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) 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') 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['user__phone'], 'nickName': user_family_qs['user__NickName'], 'userIconUrl': user_family_qs['user__userIconUrl'], 'userName': user_family_qs['user__username'], 'familyName': user_family_qs['name'], 'userEmail': user_family_qs['user__userEmail'], })