# -*- coding: utf-8 -*- """ @Author : Rocky @Time : 2023/07/13 11:30 @File :VseesController.py """ import json import hashlib import time import uuid import requests from django.db import transaction from django.views import View from Ansjer.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SES_ACCESS_REGION from Model.models import VseesDeviceType, vseesProductInfo, EnterpriseUserInfo, LogModel from Object.AWS.AmazonS3Util import AmazonS3Util from Object.RedisObject import RedisObject from Object.ResponseObject import ResponseObject from Object.TokenObject import TokenObject from Service.CommonService import CommonService class VseesManagement(View): def get(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') return self.validation(request.GET, operation, request) def post(self, request, *args, **kwargs): request.encoding = 'utf-8' operation = kwargs.get('operation') return self.validation(request.POST, operation, request) def validation(self, request_dict, operation, request): response = ResponseObject() if operation == 'get-state': # 获取sate值 return self.get_state(response) elif operation == 'get-device-info': # 查询微瞳设备类型图标信息 return self.get_device_info(response) elif operation == 'get-product-info': # 获取产品信息 return self.get_product_info(request_dict, request) elif operation == 'get-user': # 获取用户 return self.get_user(request_dict, response) else: tko = TokenObject( request.META.get('HTTP_AUTHORIZATION'), returntpye='pc') if tko.code != 0: return response.json(tko.code) response.lang = tko.lang user_id = tko.userID if operation == 'get-info': # 获取产品详细信息 return self.get_info(request_dict, response) elif operation == 'add-info': # 新增信息 return self.add_info(request_dict, request, response, user_id) elif operation == 'edit-status': # 修改状态 return self.edit_status(request_dict, response, request, user_id) elif operation == 'upload-file': # 更新文件 return self.upload_file(request_dict, request, response, user_id) elif operation == 'edit-info': # 修改信息 return self.edit_info(request_dict, response, request, user_id) else: return response.json(404) @staticmethod def get_info(request_dict, response): """ 获取微瞳产品信息 @request_dict vsees_id:设备类型id @request_dict type:0:视频, 1:说明书, 2:固件 return: """ vsees_id = request_dict.get('vsees_id', None) product_type = request_dict.get('type', None) if not all([vsees_id, product_type]): return response.json(444, 'vsees_id, type') try: product_info_qs = vseesProductInfo.objects.filter(vsees__id=vsees_id, type=product_type, status=0).values('title', 'file_name', 'status').order_by( '-add_time') if not product_info_qs.exists(): return response.json(173) return response.json(0, list(product_info_qs)) except Exception as e: print(e) return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))) @classmethod def add_info(cls, request_dict, request, response, user_id): """ 新增微瞳产品信息 @request_dict product_id:产品信息id @request_dict file:文件 @request_dict vsees_id:设备类型id @request_dict url:路径 @request_dict title:标题 @request_dict device_type:0:视频链接, 1:说明书, 2:固件 @request_dict status:状态0:已上架, 1: 已下架 return: """ file = request.FILES.get('file', None) vsees_id = request_dict.get('vsees_id', None) url = request_dict.get('url', None) title = request_dict.get('title', None) product_type = request_dict.get('type', None) if not all([file or url, title, product_type, vsees_id]): return response.json(444, 'error: file or url, title, type, vsees_id') now_time = int(time.time()) fileName = str(file) device_type = int(product_type) # 判断上架状态标题是否重复 product_info_qs = vseesProductInfo.objects.filter(vsees__id=vsees_id, title=title, type=product_type, status=0) if product_info_qs.exists(): return response.json(174) try: with transaction.atomic(): data = { 'vsees_id': vsees_id, 'title': title, 'type': device_type, 'status': 0, 'add_time': now_time, 'upd_time': now_time, } # 记录操作日志 content = json.loads(json.dumps(request_dict)) log = { 'ip': CommonService.get_ip_address(request), 'user_id': user_id, 'status': 200, 'time': int(time.time()), 'url': 'vsees/upload-file', 'content': json.dumps(content), 'operation': '{}新增{}-0:视频链接, 1:说明书, 2:固件'.format(user_id, device_type), } LogModel.objects.create(**log) # 添加链接 if device_type == 0: data['file_name'] = url data['url'] = url vseesProductInfo.objects.create(**data) return response.json(0) # 添加说明书 elif device_type == 1: url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/clarification/{}'.format(fileName) file_key = 'vsees/clarification/{}' # 添加固件 elif device_type == 2: url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/firmware/{}'.format(fileName) file_key = 'vsees/firmware/{}' key = file_key.format(fileName) s3 = cls.upload(file, key) if s3: data['file_name'] = fileName data['url'] = url vseesProductInfo.objects.create(**data) return response.json(0) return response.json(178) except Exception as e: print(e) return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))) @classmethod def upload(cls, file, key): """ 上传 @request_dict file:文件 @request_dict key:需要上传文件路径+文件名 """ bucket_name = 'ansjerfilemanager' s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION) s3 = s3.upload_file_obj( bucket_name, key, file, {'ContentType': file.content_type, 'ACL': 'public-read'}) if s3: return True else: return False @classmethod def upload_file(cls, request_dict, request, response, user_id): """ 更新文件 @request_dict product_id:产品信息id @request_dict file:文件 @request_dict device_type:0:视频, 1:说明书, 2:固件 """ file = request.FILES.get('file', None) product_id = request_dict.get('product_id', None) product_type = request_dict.get('type', None) if not all([file, product_type, product_id]): return response.json(444, 'error: file, type, product_id') now_time = int(time.time()) fileName = str(file) product_info_qs = vseesProductInfo.objects.filter(id=product_id, type=product_type, status=0) if not product_info_qs.exists(): return response.json(177) try: # 说明 if product_type == 1: url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/clarification/{}'.format(fileName) file_key = 'vsees/clarification/{}' # 固件 else: url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/firmware/{}'.format(fileName) file_key = 'vsees/firmware/{}' key = file_key.format(fileName) s3 = cls.upload(file, key) if s3: vseesProductInfo.objects.filter(id=product_id).update(url=url, upd_time=now_time, file_name=fileName) # 记录操作日志 ip = CommonService.get_ip_address(request) content = json.loads(json.dumps(request_dict)) log = { 'ip': ip, 'user_id': user_id, 'status': 200, 'time': int(time.time()), 'url': 'vsees/upload-file', 'content': json.dumps(content), 'operation': '{}更新文件'.format(user_id), } LogModel.objects.create(**log) return response.json(0) return response.json(177) except Exception as e: print(e) return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))) @staticmethod def edit_status(request_dict, response, request, user_id): """ 修改状态 @request_dict product_id:id @request_dict status:状态0:已上架, 1: 已下架 """ product_id = request_dict.get('product_id', None) status = request_dict.get('status', None) if not all([status, product_id]): return response.json(444, 'error: status, product_id') # 只下架 if int(status) == 0: return response.json(177) vseesProductInfo.objects.filter(id=product_id).update(status=status) # 记录操作日志 content = json.loads(json.dumps(request_dict)) log = { 'ip': CommonService.get_ip_address(request), 'user_id': user_id, 'status': 200, 'time': int(time.time()), 'url': 'vsees/edit-status', 'content': json.dumps(content), 'operation': '{}修改资源状态'.format(user_id), } LogModel.objects.create(**log) return response.json(0) @staticmethod def edit_info(request_dict, response, request, user_id): """ 修改信息 @request_dict product_id:id @request_dict url:路径 @request_dict title:标题 """ product_id = request_dict.get('product_id', None) url = request_dict.get('url', None) title = request_dict.get('title') if not product_id: return response.json(444, 'error: product_id') product_info_qs = vseesProductInfo.objects.filter(id=product_id, title=title, status=0) if product_info_qs.exists(): return response.json(174) if title: product_info_qs.update(title=title) if url: product_info_qs.update(url=url) # 记录操作日志 ip = CommonService.get_ip_address(request) content = json.loads(json.dumps(request_dict)) log = { 'ip': ip, 'user_id': user_id, 'status': 200, 'time': int(time.time()), 'url': 'vsees/edit-info', 'content': json.dumps(content), 'operation': '{}修改资源信息'.format(user_id), } LogModel.objects.create(**log) return response.json(0) # 用户界面接口 ------------------------------------------------------------------------------------------------------- @staticmethod def get_device_info(response): """ 获取微瞳图标信息 """ try: device_type_qs = VseesDeviceType.objects.all().values().order_by('id') return response.json(0, list(device_type_qs)) except Exception as e: print(e) return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))) @staticmethod def get_product_info(request_dict, response): """ 获取微瞳产品信息 @request_dict deviceTypeId:设备类型id @request_dict type:0:视频, 1:说明书, 2:固件 @request_dict title:标题 return: """ vsees_id = request_dict.get('vsees_id', None) title = request_dict.get('title', None) product_type = request_dict.get('type', None) if not vsees_id: return response.json(444, 'vsees_id') try: product_info_qs = vseesProductInfo.objects.all() if not title and product_type: product_info_qs = product_info_qs.filter(vsees__id=vsees_id, status=0).values('title').order_by( '-add_time') return response.json(0, list(product_info_qs)) else: product_info_qs = product_info_qs.filter(vsees__id=vsees_id, title=title, type=product_type, status=0).values('url').order_by('-add_time') if not product_info_qs.exists(): return response.json(173) return response.json(0, {'url': product_info_qs[0]['url']}) except Exception as e: print(e) return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))) # -------------------企业微信扫码登录-------------------------------- @staticmethod def get_state(response): """ 获取state @param response: 响应对象 @return: response """ nwo_time = time.time() redis_obj = RedisObject() try: state = hashlib.md5((str(uuid.uuid1()) + str(nwo_time)).encode('utf-8')).hexdigest() state_statue = redis_obj.set_ex_data(state, 0, 300) # redis记录state if state_statue: return response.json(0, {'state': state}) else: return response.json(120) except Exception as e: print(e) return response.json(500) @classmethod def get_user(cls, request_dict, response): code = request_dict.get('code', None) state = request_dict.get('state', None) if not all([code, state]): return response.json(444, 'error: code, state') # 验证state,获取token access_token = cls.get_token(response, state) if not access_token: return response.json(120) data = { 'access_token': access_token, 'code': code } try: # 获取用户id token_url = 'https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo' token_response = requests.get(token_url, params=data) data = token_response.json() userid = data.get("userid") if userid: enterprise_user_info_qs = EnterpriseUserInfo.objects.filter(userID=userid) if not enterprise_user_info_qs.exists(): cls.get_user_info(access_token, userid, response) tko = TokenObject() rest = tko.generate(data={'userID': userid, 'user': 'come@on'}) return response.json(0, {'rest': rest}) else: errcode = data.get('errcode') errmsg = data.get('errmsg') return response.json({'errcode': errcode, 'errmsg': errmsg}) except Exception as e: print(e) return response.json(500, repr(e)) @classmethod def get_token(cls, response, state): redis_client = RedisObject() state_val = redis_client.get_data(state) # 验证state if state_val: redis_client.del_data(state) else: return False access_token = redis_client.get_data(key='enterprise_wechat_access_token') if access_token: redis_client.del_data(state) return access_token data = { 'corpid': 'ww467ec1685e8262e6', 'corpsecret': 'IeUoaQ-0hEhEduCQq1zyfVXjfeZpMsThK1nklszRzUY' } # 获取access_token,redis中不存在该值时重新请求获取access_token(有效时长两小时) token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken' token_response = requests.get(token_url, params=data) data = token_response.json() if data.get('errcode') == 0: access_token = data['access_token'] expires_in = data['expires_in'] redis_client.set_data('enterprise_wechat_access_token', access_token, expires_in) return access_token else: errcode = data.get('errcode') errmsg = data.get('errmsg') return response.json({'errcode': errcode, 'errmsg': errmsg}) @classmethod def get_user_info(cls, access_token, userid, response): now_time = int(time.time()) data = { 'access_token': access_token, 'userid': userid } # 获取用户信息 token_url = 'https://qyapi.weixin.qq.com/cgi-bin/user/get' token_response = requests.get(token_url, params=data) data = token_response.json() userid = data.get("userid") url_data = { 'userID': userid, 'name': data.get('name'), 'position': data.get('position'), 'status': data.get('status'), 'add_time': now_time, 'upd_time': now_time } if data.get('errcode') == 0: EnterpriseUserInfo.objects.create(**url_data) return True else: errcode = data.get('errcode') errmsg = data.get('errmsg') return response.json({'errcode': errcode, 'errmsg': errmsg})