| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 | #!/usr/bin/env python3# -*- coding: utf-8 -*-"""@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.@AUTHOR: ASJRD018@NAME: AnsjerFormal@software: PyCharm@DATE: 2019/3/4 16:30@Version: python3.6@MODIFY DECORD:ansjer dev@file: DeviceShare.py@Contact: chanjunkai@163.com"""import jsonimport timefrom django.views.generic.base import Viewfrom Ansjer.config import SERVER_DOMAIN, LOGGERfrom Controller.SensorGateway.EquipmentFamilyController import EquipmentFamilyViewfrom Controller.UserDevice.UserDeviceShareController import UserDeviceShareViewfrom Model.models import Device_Info, Device_User, DeviceChannelUserSet, DeviceChannelUserPermissionfrom Model.models import UID_Bucketfrom Object.ContentSecurityObject import ContentSecurityfrom Object.RedisObject import RedisObjectfrom Object.ResponseObject import ResponseObjectfrom Object.TokenObject import TokenObjectfrom Service.CommonService import CommonServiceclass DeviceShareView(View):    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.GET, operation)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        return self.validation(request.POST, operation)    def validation(self, request_dict, operation):        response = ResponseObject()        token = request_dict.get('token', None)        lang = request_dict.get('lang', None)        if token:            tko = TokenObject(token)            response.lang = lang if lang else tko.lang            if tko.code == 0:                userID = tko.userID                if operation == 'generateTokenUrl':                    return self.do_generate_token_url(userID, request_dict, response)                elif operation == 'showShareInfo':                    return self.do_show_share_info(request_dict, response)                elif operation == 'confirm':                    return self.do_confirm(userID, request_dict, response)                elif operation == 'queryUser':                    return self.do_query_user(userID, request_dict, response)                elif operation == 'deleteUser':                    return self.do_delete_user(userID, request_dict, response)                elif operation == 'deleteUserV2':                    return self.do_delete_userV2(userID, request_dict, response)                elif operation == 'getDeviceShareCount':                    return self.get_device_share_count(request_dict, response)                elif operation == 'editUserNotes':                    return self.edit_user_notes(request_dict, response)                else:                    return response.json(414)            else:                return response.json(tko.code)        else:            return response.json(444, {'param': 'token'})    @classmethod    def get_device_share_count(cls, request_dict, response):        """        获取设备分享总数        """        try:            uid = request_dict.get('uid', None)            if not uid:                return response.json(444)            d_share_user_qs = Device_Info.objects.filter(UID=uid, isShare=True)            if d_share_user_qs.count() >= 5:                return response.json(10070)            return response.json(0, {'total': d_share_user_qs.count()})        except Exception as e:            print(e)            return response.json(503)    def do_generate_token_url(self, userID, request_dict, response):        """        APP主用户通过二维码分享设备        """        UID = request_dict.get('UID', None)        dvqs = Device_Info.objects.filter(UID=UID, userID_id=userID, isShare=False).values('NickName')        userqs = Device_User.objects.filter(userID=userID).values('username', 'userEmail', 'phone', 'userIconPath')        if dvqs:            data = {'sharer': userID, 'UID': UID}            # -----------------            # 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=3600):                return response.json(10, '生成失败')            # =================            if userqs[0]['username']:                share_user = userqs[0]['username']            elif userqs[0]['userEmail']:                share_user = userqs[0]['userEmail']            elif userqs[0]['phone']:                share_user = userqs[0]['phone']            else:                share_user = ''            userIconPath = userqs[0]['userIconPath']            if userIconPath:                if userIconPath.find('static/') != -1:                    userIconPath = userIconPath.replace('static/', '').replace('\\', '/')                    userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath            return response.json(0, {                'shareToken': share_token,                'deviceName': dvqs[0]['NickName'],                'shareUser': share_user,                'userIconPath': userIconPath            })        else:            return response.json(12)    def do_show_share_info(self, request_dict, response):        shareToken = request_dict.get('shareToken', None)        if shareToken is not None:            redisObj = RedisObject()            data_str = redisObj.get_data(key=shareToken)            if data_str:                data = json.loads(data_str)                # 分享者userID                sharer = data.get('sharer', None)                # 分享的uid                UID = data.get('UID', None)                sharerDvqs = Device_Info.objects.filter(userID_id=sharer, UID=UID, isShare=False). \                    values('NickName', 'Type')                if sharerDvqs.exists():                    sharerDuqs = Device_User.objects.filter(userID=sharer).values('username', 'userEmail', 'phone')                    if sharerDuqs[0]['username']:                        share_user = sharerDuqs[0]['username']                    elif sharerDuqs[0]['userEmail']:                        share_user = sharerDuqs[0]['userEmail']                    elif sharerDuqs[0]['phone']:                        share_user = sharerDuqs[0]['phone']                    else:                        share_user = ''                    return response.json(0, {                        'deviceName': sharerDvqs[0]['NickName'],                        'deviceType': sharerDvqs[0]['Type'],                        'shareUser': share_user,                    })                else:                    return response.json(173)            else:                return response.json(119)        else:            return response.json(414)    def do_confirm(self, userID, request_dict, response):        shareToken = request_dict.get('shareToken', None)        family_id = request_dict.get('familyId', None)        room_id = request_dict.get('roomId', None)        if not shareToken:            return response.json(444, {'param': 'shareToken'})            # try:            #     data = jwt.decode(shareToken, '.#^^&', algorithms='HS256')            # except Exception as e:            #     return response.json(10, repr(e))        try:            redisObj = RedisObject()            data_str = redisObj.get_data(key=shareToken)            if not data_str:                return response.json(119)            data = json.loads(data_str)            print('data:', data)            # 分享者userID            sharer = data.get('sharer', None)            # 分享的uid            UID = data.get('UID', None)            d_share_user_qs = Device_Info.objects.filter(UID=UID, isShare=True)            if d_share_user_qs.count() >= 5:                return response.json(10070)            dval = Device_Info.objects.filter(userID_id=userID, UID=UID)            if not dval.exists():                try:                    sharerUser = Device_User.objects.get(userID=sharer)                    sharerDvqs = Device_Info.objects.get(userID_id=sharer, UID=UID)                    deviceId = CommonService.getUserID(getUser=False)                    sharerDvqs.id = deviceId                    sharerDvqs.userID_id = userID                    sharerDvqs.isShare = True                    sharerDvqs.primaryUserID = sharer                    if sharerUser.username:                        primaryMaster = sharerUser.username                    elif sharerUser.userEmail:                        primaryMaster = sharerUser.userEmail                    elif sharerUser.phone:                        primaryMaster = sharerUser.phone                    else:                        return response.json(178)                    print(primaryMaster)                    sharerDvqs.primaryMaster = primaryMaster                    sharerDvqs.data_joined = None                    sharerDvqs.save()                    UserDeviceShareView.qrcode_share_channel_permission_save(userID, UID)                except Exception as e:                    return response.json(10, repr(e))                else:                    dvqs = Device_Info.objects.filter(id=deviceId).values('id', 'userID', 'NickName', 'UID',                                                                          'View_Account',                                                                          'View_Password', 'ChannelIndex', 'Type',                                                                          'isShare',                                                                          'primaryUserID', 'primaryMaster',                                                                          'data_joined', 'version',                                                                          'isVod', 'isExist')                    if family_id:                        EquipmentFamilyView.family_room_device_save(family_id, room_id, deviceId, dvqs[0]['Type'])                    dvql = CommonService.qs_to_list(dvqs)                    ubqs = UID_Bucket.objects.filter(uid=UID). \                        values('bucket__content', 'status', 'channel', 'endTime', 'uid')                    res = dvql[0]                    res['vod'] = list(ubqs)                    # redisObj.del_data(key=shareToken)                    return response.json(0, res)            else:                return response.json(174)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    # 1,这个用户的分享出去的设备    # 2,获得上面个的设备拥有者    #  http://192.168.136.39:8000/deviceShare/queryEq?token=XXX&UID=jLBDSU9547NTRSMF111A    def do_query_user(self, userID, request_dict, response):        UID = request_dict.get('UID', None)        if UID is not None:            # 查询分享获得的用户            qs = Device_Info.objects.filter(UID=UID, isShare=True, primaryUserID=userID, isExist=1). \                values('userID__NickName', 'userID__username', 'userID__userEmail', 'userID__phone', 'id', 'userID',                       'userID__userIconPath', 'noteName')            data = []            # print(qs)            for q in qs:                d = {'id': q['id'], 'userID': q['userID'], 'noteName': q['noteName']}                if q['userID__NickName']:                    d['user'] = q['userID__NickName']                elif q['userID__username']:                    d['user'] = q['userID__username']                elif q['userID__userEmail']:                    d['user'] = q['userID__userEmail']                elif q['userID__phone']:                    d['user'] = q['userID__phone']                userIconPath = q['userID__userIconPath']                if userIconPath:                    if userIconPath.find('static/') != -1:                        userIconPath = userIconPath.replace('static/', '').replace('\\', '/')                        d['userIconUrl'] = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath                data.append(d)            return response.json(0, data)        else:            return response.json(444, {'param': 'UID'})    def do_delete_user(self, userID, request_dict, response):        id = request_dict.get('id', None)        if id:            try:                Device_Info.objects.filter(id=id, primaryUserID=userID).delete()            except Exception as e:                return response.json(10, repr(e))            else:                return response.json(0)        else:            return response.json(444, 'id')    def do_delete_userV2(self, userID, request_dict, response):        ids = request_dict.get('ids', None)        if not ids:            return response.json(444, 'id')        try:            Device_Info.objects.filter(id__in=ids.split(','), primaryUserID=userID).delete()        except Exception as e:            return response.json(10, repr(e))        else:            return response.json(0)    @staticmethod    def del_device_channel_permission(user_id, uid):        """        删除设备通道权限        @param user_id: 用户ID        @param uid: 设备UID        @return: True | False        """        if user_id and uid:            user_channel_qs = DeviceChannelUserSet.objects.filter(user_id=user_id, uid=uid)            if user_channel_qs.exists():                DeviceChannelUserPermission.objects.filter(channel_user_id=user_channel_qs.first().id).delete()                user_channel_qs.delete()            return True        elif uid:            user_channel_qs = DeviceChannelUserSet.objects.filter(uid=uid)            if user_channel_qs.exists():                channels_user_list = [val.id for val in user_channel_qs]                DeviceChannelUserPermission.objects.filter(channel_user_id__in=channels_user_list).delete()                user_channel_qs.delete()            return True        else:            return False    @staticmethod    def edit_user_notes(request_dict, response):        deviceInfoId = request_dict.get('id', None)        noteName = request_dict.get('noteName', None)        if not all([deviceInfoId, noteName]):            return response.json(444)        try:            service = 'nickname_detection'            service_dict = {'content': noteName}            service_parameters = json.dumps(service_dict)            legal = ContentSecurity().text_review(service, service_parameters)            if not legal:                return response.json(108)            Device_Info.objects.filter(id=deviceInfoId).update(noteName=noteName)            return response.json(0)        except Exception as e:            LOGGER.info('DeviceShareView.edit_user_notes,errLine:{}, errMsg:{}'                        .format(e.__traceback__.tb_lineno, repr(e)))            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 |