12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061 |
- import datetime
- import time
- import oss2
- import requests
- from django.contrib.auth.hashers import make_password, check_password # 对密码加密模块
- from django.db import transaction
- from django.db.models import Q
- from django.utils.decorators import method_decorator
- from django.utils.timezone import utc
- from django.views.decorators.csrf import csrf_exempt
- from django.views.generic import TemplateView
- from Ansjer.config import SERVER_DOMAIN, OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, AWS_ACCESS_KEY_ID, \
- AWS_SECRET_ACCESS_KEY, AWS_SES_ACCESS_REGION, DETECT_PUSH_DOMAINS
- from Controller.CheckUserData import DataValid, RandomStr
- from Model.models import Device_User, Role, UserExModel, CountryModel, MenuModel, FeedBackModel, StatResModel, \
- SysMassModel, App_Info, SysMsgModel, DeviceSuperPassword, CustomizedPush, DeviceTypeModel
- from Object.AWS.AmazonS3Util import AmazonS3Util
- from Object.ApschedulerObject import ApschedulerObject
- from Object.RedisObject import RedisObject
- from Object.ResponseObject import ResponseObject
- from Object.TokenObject import TokenObject
- from Service.CommonService import CommonService
- from Service.ModelService import ModelService
- from django.views.generic import View
- # 登录
- class LoginView(TemplateView):
- @method_decorator(csrf_exempt) # @csrf_exempt
- def dispatch(self, *args, **kwargs):
- return super(LoginView, self).dispatch(*args, **kwargs)
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- request_dict = request.POST
- language = request_dict.get('language', 'en')
- response = ResponseObject(language, 'pc')
- return self.validates(request_dict, response)
- def validates(self, request_dict, response):
- username = request_dict.get('username', None)
- password = request_dict.get('password', None)
- password_version = request_dict.get('pwdVersion', 'V1')
- if not username or not password:
- return response.json(111)
- username = username.strip()
- password = password.strip()
- data_valid = DataValid()
- if data_valid.email_validate(username):
- return self.do_email_login(username, password, response, password_version)
- elif data_valid.mobile_validate(username):
- return self.do_phone_login(username, password, response, password_version)
- elif data_valid.name_validate(username):
- return self.do_name_login(username, password, response, password_version)
- else:
- return response.json(107)
- def do_email_login(self, email, password, response, password_version):
- user_qs = Device_User.objects.filter(Q(username=email) | Q(userEmail=email))
- return self.valid_login(user_qs, password, response, password_version)
- def do_phone_login(self, phone, password, response, password_version):
- user_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone), is_active=True, user_isValid=True)
- return self.valid_login(user_qs, password, response, password_version)
- def do_name_login(self, username, password, response, password_version):
- user_qs = Device_User.objects.filter(Q(username=username) | Q(phone=username) | Q(userEmail=username),
- is_active=True, user_isValid=True)
- return self.valid_login(user_qs, password, response, password_version)
- def valid_login(self, user_qs, password, response, password_version):
- if not user_qs.exists():
- return response.json(104)
- # users = user_qs.values('role__rid', 'role__roleName', 'userID', 'role', 'NickName', 'username', 'userEmail',
- # 'phone', 'password', 'userIconPath', 'user_isValid', 'is_active')[0]
- users = user_qs.values('role__rid', 'role__roleName', 'userID', 'NickName', 'username', 'userEmail',
- 'phone', 'password', 'userIconPath')[0]
- if password_version == 'V1':
- check_flag = check_password(password, users['password'])
- else:
- check_flag = CommonService.check_password(password, users['password'])
- if not check_flag:
- return response.json(111)
- userID = users['userID']
- tko = TokenObject(returntpye='pc')
- res = tko.generate(
- data={'userID': userID, 'lang': response.lang, 'user': users['username'], 'm_code': '123413243214'})
- if tko.code == 0:
- now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
- user_qs.update(last_login=now_time, language=response.lang)
- res['rid'] = users['role__rid']
- res['roleName'] = users['role__roleName']
- res['permList'] = ModelService.own_permission(userID)
- res['userID'] = userID
- # 昵称,邮箱,电话,刷新,头像
- userIconPath = str(users['userIconPath'])
- if userIconPath and userIconPath.find('static/') != -1:
- userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
- res['userIconUrl'] = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
- else:
- res['userIconUrl'] = ''
- res['NickName'] = users['NickName'] if users['NickName'] is not None else ''
- res['username'] = users['username'] if users['username'] is not None else ''
- res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''
- res['phone'] = users['phone'] if users['phone'] is not None else ''
- return response.json(0, res)
- else:
- return response.json(tko.code)
- # 获取登录权限
- class GetPermissions(TemplateView):
- @method_decorator(csrf_exempt) # @csrf_exempt
- def dispatch(self, *args, **kwargs):
- return super(GetPermissions, self).dispatch(*args, **kwargs)
- def get(self, request, *args, **kwargs):
- token = request.META.get('HTTP_AUTHORIZATION')
- request.encoding = 'utf-8'
- request_dict = request.GET
- language = request_dict.get('language', 'en')
- response = ResponseObject(language, 'pc')
- return self.validates(request_dict, token, response)
- def validates(self, request_dict, token, response):
- tko = TokenObject(token, returntpye='pc')
- response.lang = tko.lang
- if tko.code != 0:
- return response.json(tko.code)
- userID = tko.userID
- user_qs = Device_User.objects.filter(userID=userID)
- if not user_qs.exists():
- return response.json(104)
- # 待补充逻辑
- username = user_qs[0].username
- userIconPath = user_qs[0].userIconPath.url
- if userIconPath:
- if userIconPath.find('static/') != -1:
- userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
- userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
- role_qs = Role.objects.filter(device_user=userID)
- menu_qs = MenuModel.objects.filter(role__in=role_qs, menutype=2);
- perms = []
- for menu in menu_qs:
- perms.append(menu.menu_code)
- res = {
- "code": 200,
- "msg": "success",
- "data": {
- "roles": ["admin"], # 一个用户可包含多个角色如["admin","editor","XXXX"],必须返回,如小项目用不到角色权限请返回 ["admin"]
- "ability": ["READ", "WRITE", "DELETE"], # 如果用不到rabc精细化权限可以不返回,建议返回
- "username": username, # 用户名,必须返回
- "avatar": userIconUrl, # 头像,必须返回
- "perms": perms
- }
- }
- return response.json(0, res)
- # 获取菜单
- class GetList(TemplateView):
- @method_decorator(csrf_exempt) # @csrf_exempt
- def dispatch(self, *args, **kwargs):
- return super(GetList, self).dispatch(*args, **kwargs)
- def get(self, request, *args, **kwargs):
- token = request.META.get('HTTP_AUTHORIZATION')
- request.encoding = 'utf-8'
- request_dict = request.GET
- language = request_dict.get('language', 'en')
- response = ResponseObject(language, 'pc')
- return self.validates(request_dict, token, response)
- def validates(self, request_dict, token, response):
- tko = TokenObject(token, returntpye='pc')
- response.lang = tko.lang
- if tko.code != 0:
- return response.json(tko.code)
- userID = tko.userID
- role_qs = Role.objects.filter(device_user=userID)
- menu_qs = MenuModel.objects.filter(parentId=0, role__in=role_qs, menutype=1);
- list = []
- for menu in menu_qs:
- list.append(
- {
- 'id': menu.id,
- 'parentId': menu.parentId,
- 'path': menu.path,
- 'name': menu.name,
- 'component': menu.component,
- 'meta': {
- 'hidden': menu.hidden,
- 'levelHidden': menu.levelHidden,
- 'title': menu.title,
- 'icon': menu.icon,
- 'isCustomSvg': menu.isCustomSvg,
- 'noKeepAlive': menu.noKeepAlive,
- 'noClosable': menu.noClosable,
- 'badge': menu.badge,
- 'tabHidden': menu.tabHidden,
- 'activeMenu': menu.activeMenu,
- 'dot': menu.dot,
- 'dynamicNewTab': menu.dynamicNewTab,
- 'sort': menu.sort
- }
- }
- )
- menu_qs = MenuModel.objects.filter(role__in=role_qs, menutype=1)
- menulist = []
- for objlist in list:
- menulist.append(self.menulist(menu_qs, objlist))
- return response.json(0, {'list': menulist})
- def menulist(self, menu_qs, objlist):
- if objlist is None:
- return
- for menu in menu_qs:
- if objlist['id'] == menu.parentId:
- if 'children' not in objlist:
- objlist['children'] = []
- obj = {
- 'id': menu.id,
- 'parentId': menu.parentId,
- 'path': menu.path,
- 'name': menu.name,
- 'component': menu.component,
- 'menutype': menu.menutype,
- 'menu_code': menu.menu_code,
- 'meta': {
- 'hidden': menu.hidden,
- 'levelHidden': menu.levelHidden,
- 'title': menu.title,
- 'icon': menu.icon,
- 'isCustomSvg': menu.isCustomSvg,
- 'noKeepAlive': menu.noKeepAlive,
- 'noClosable': menu.noClosable,
- 'badge': menu.badge,
- 'tabHidden': menu.tabHidden,
- 'activeMenu': menu.activeMenu,
- 'dot': menu.dot,
- 'dynamicNewTab': menu.dynamicNewTab,
- 'sort': menu.sort
- }
- }
- objlist['children'].append(
- obj
- )
- self.menulist(menu_qs, obj)
- return objlist
- class UserManagement(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):
- language = request_dict.get('language', 'en')
- response = ResponseObject(language, 'pc')
- if operation == 'sendSysMessage':
- return self.sendSysMessage(request_dict, response)
- elif operation == 'getAppDataList':
- return self.getAppDataList(request_dict, response)
- elif operation == 'replyFeedBack':
- return self.replyFeedBack(request_dict, response)
- elif operation == 'sendSysMsgToUser':
- return self.sendSysMsgToUser(request_dict, response)
- elif operation == 'getCountryList': # 查询国家列表
- return self.getCountryList(response)
- elif operation == 'getDeviceTypeList': # 查询设备型号列表
- return self.getDeviceTypeList(response)
- else:
- tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'), returntpye='pc')
- # if tko.code != 0:
- # return response.json(tko.code)
- response.lang = tko.lang
- userID = tko.userID
- if operation == 'getUserInfo':
- return self.getUserInfo(userID, request_dict, response)
- elif operation == 'AddOrEditAccount':
- return self.AddOrEditAccount(userID, request_dict, response)
- elif operation == 'doDelete':
- return self.doDelete(request_dict, response)
- elif operation == 'resetPassword':
- return self.resetPassword(request_dict, response)
- elif operation == 'getFeedbackList':
- return self.getFeedbackList(request_dict, response)
- elif operation == 'deleteFeedBack':
- return self.deleteFeedBack(request_dict, response)
- elif operation == 'getSysMessageList':
- return self.getSysMessageList(request_dict, response)
- elif operation == 'collectFeedBack':
- return self.collectFeedBack(request_dict, response)
- elif operation == 'exportFeedBack':
- return self.exportFeedBack(request_dict, response)
- elif operation == 'customerServiceManagement': # 审核用户请求/生成超级密码
- return self.customerServiceManagement(request_dict, response)
- elif operation == 'getDeviceSuperPassword': # 查询超级密码请求表
- return self.getDeviceSuperPassword(request_dict, response)
- elif operation == 'deleteInformation': # 删除超级密码请求表
- return self.deleteInformation(request_dict, response)
- # 定制推送
- elif operation == 'getCustomizedPushList': # 查询定制推送列表
- return self.getCustomizedPushList(request_dict, response)
- elif operation == 'addOrEditCustomizedPush': # 新增/编辑推送内容
- return self.addOrEditCustomizedPush(request, request_dict, response)
- else:
- return response.json(414)
- def getUserInfo(self, userID, request_dict, response):
- """
- @param userID:用户ID
- @param request_dict:请求参数
- @param response:响应对象
- @param username:用户名
- @param NickName:用户昵称
- @param phone:电话号
- @param userEmail:用户邮箱
- @return:
- """
- print('request_dict: ', request_dict)
- username = request_dict.get('username', '').strip() # 移除字符串头尾的空格
- NickName = request_dict.get('NickName', '').strip()
- phone = request_dict.get('phone', '').strip()
- userEmail = request_dict.get('userEmail', '').strip()
- countryName = request_dict.get('countryName', '').strip()
- pageNo = request_dict.get('pageNo', None)
- pageSize = request_dict.get('pageSize', None)
- if not all([pageNo, pageSize]):
- return response.json(444)
- page = int(pageNo)
- line = int(pageSize)
- try:
- device_user_qs = Device_User.objects.all()
- # 条件查询
- if username:
- device_user_qs = device_user_qs.filter(username__icontains=username)
- if NickName:
- device_user_qs = device_user_qs.filter(NickName__icontains=NickName)
- if phone:
- device_user_qs = device_user_qs.filter(phone__icontains=phone)
- if userEmail:
- device_user_qs = device_user_qs.filter(userEmail__icontains=userEmail)
- if countryName:
- country_qs = CountryModel.objects.filter(country_name=countryName).values('id')
- if not country_qs:
- return response.json(10, '国家不存在')
- device_user_qs = device_user_qs.filter(region_country=country_qs[0]['id'])
- if not device_user_qs.exists():
- return response.json(0)
- total = device_user_qs.count()
- device_users = device_user_qs[(page - 1) * line:page * line]
- user_list = []
- for device_user in device_users:
- role = device_user.role.first()
- rid = role.rid if role else 1 # 不存在角色默认分配为'Users'
- user_ex_qs = UserExModel.objects.filter(userID_id=device_user.userID).values('appBundleId')
- app_bundle_id = user_ex_qs[0]['appBundleId'] if user_ex_qs.exists() else ''
- country_qs = CountryModel.objects.filter(id=device_user.region_country).values('country_name')
- countryName = country_qs[0]['country_name'] if country_qs.exists() else '未知国家'
- user_list.append({
- 'userID': device_user.userID,
- 'username': device_user.username,
- 'NickName': device_user.NickName,
- 'role': Role.objects.get(rid=rid).roleName,
- 'phone': device_user.phone,
- 'userEmail': device_user.userEmail,
- 'data_joined': device_user.data_joined.strftime("%Y-%m-%d %H:%M:%S"),
- 'last_login': device_user.last_login.strftime("%Y-%m-%d %H:%M:%S"),
- 'appBundleId': app_bundle_id,
- 'countryName': countryName
- })
- print('user_list: ', user_list)
- return response.json(0, {'list': user_list, 'total': total})
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def AddOrEditAccount(self, userID, request_dict, response):
- """
- 添加/编辑用户
- @param userID:用户ID
- @param request_dict:请求参数
- @param response:响应对象
- @param roleName:用户角色
- @param isEdit:添加用户需要输入密码
- @return:
- """
- print('request_dict: ', request_dict)
- username = request_dict.get('username', '').strip() # 移除字符串头尾的空格
- userEmail = request_dict.get('userEmail', '').strip()
- roleName = request_dict.get('role', None)
- password = request_dict.get('password', None)
- isEdit = request_dict.get('isEdit', None)
- password_version = request_dict.get('pwdVersion', 'V1')
- # 校验用户名,邮箱,密码是否符合规则
- dataValid = DataValid()
- if not username or not dataValid.name_validate(username):
- return response.json(444, {'Parameter error': 'username'})
- if userEmail and not dataValid.email_validate(userEmail):
- return response.json(444, {'Parameter error': 'userEmail'})
- if not isEdit: # 添加用户需要输入密码
- if not password or not dataValid.password_validate(password):
- return response.json(444, {'Parameter error': 'password'})
- if password_version == 'V1':
- password = make_password(password)
- try:
- if isEdit: # 编辑用户信息
- userID = request_dict.get('userID')
- user_data = {
- "username": username,
- "NickName": username,
- "userEmail": userEmail,
- "password": password,
- }
- device_user_qs = Device_User.objects.filter(userID=userID)
- device_user_qs.update(**user_data)
- # 如果角色改变,修改用户角色
- device_user_role = device_user_qs[0].role
- user_role = device_user_role.first()
- if not user_role or roleName != user_role.roleName:
- device_user_role.clear()
- role_qs = Role.objects.filter(roleName=roleName) # 账号角色
- device_user_qs[0].role.set(role_qs)
- else: # 添加用户
- # 查询邮箱是否已注册
- if Device_User.objects.filter(userEmail=userEmail).exists():
- return response.json(103)
- role_qs = Role.objects.filter(roleName=roleName) # 账号角色
- # 创建用户
- user_data = {
- "username": username,
- "NickName": username,
- "userEmail": userEmail,
- "password": password,
- "userID": CommonService.getUserID(μs=False, setOTAID=True),
- "is_active": True,
- "user_isValid": True,
- }
- Device_User.objects.create(**user_data).role.set(role_qs)
- return response.json(0)
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def doDelete(self, request_dict, response):
- userID = request_dict.get('userID', '')
- if not userID:
- return response.json(444)
- try:
- Device_User.objects.filter(userID=userID).delete()
- return response.json(0)
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def resetPassword(self, request_dict, response):
- userID = request_dict.get('userID', None)
- if not userID:
- return response.json(444)
- try:
- password = '123456'
- is_update = Device_User.objects.filter(userID=userID).update(password=make_password(password))
- if is_update:
- return response.json(0)
- else:
- 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)))
- def getFeedbackList(self, request_dict, response):
- """
- 用户反馈查询
- @param request_dict:请求参数
- @param response:响应对象
- @param status:回复状态
- @param collectStatus:收藏状态1
- @return:
- """
- status = request_dict.get('status', 0)
- username = request_dict.get('username', None)
- collectStatus = request_dict.get('collectStatus', None)
- pageNo = request_dict.get('pageNo', None)
- pageSize = request_dict.get('pageSize', None)
- if not all([pageNo, pageSize]):
- return response.json(444)
- page = int(pageNo)
- line = int(pageSize)
- try:
- filter_data = {}
- if status or username or collectStatus:
- if status:
- filter_data['status'] = int(status)
- if username:
- filter_data['userID_id'] = ModelService.get_userID_byname(username)
- if collectStatus:
- filter_data['collect_status'] = int(collectStatus)
- feed_back_qs = FeedBackModel.objects.filter()
- if filter_data:
- feed_back_qs = feed_back_qs.filter(**filter_data).values()
- total = feed_back_qs.count()
- feed_backs = feed_back_qs.values(
- 'id',
- 'userID__username',
- 'userID__phone',
- 'userID__userEmail',
- 'content',
- 'addTime',
- 'status',
- 'type',
- 'app',
- 'app_version',
- 'phone_model',
- 'os_version',
- 'uid',
- 'appBundleId',
- 'score',
- 'collect_status'
- )
- feed_backs = feed_backs[(page - 1) * line: page * line]
- feed_back_id_list = [feed_back['id'] for feed_back in feed_backs]
- stat_res_qs = StatResModel.objects.filter(
- feedbackmodel__id__in=feed_back_id_list).values(
- 'name', 'feedbackmodel__id')
- auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
- bucket = oss2.Bucket(
- auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
- feed_back_list = []
- for feed_back in feed_backs:
- feed_back['img_url'] = []
- for stat_res in stat_res_qs:
- if stat_res['feedbackmodel__id'] == feed_back['id']:
- obj = 'feedback/' + stat_res['name']
- img_url = bucket.sign_url('GET', obj, 3600)
- feed_back['img_url'].append(img_url)
- if not feed_back['userID__username']:
- feed_back['userID__username'] = feed_back['userID__userEmail'] if feed_back[
- 'userID__userEmail'] else feed_back['userID__phone']
- feed_back_list.append(feed_back)
- return response.json(0, {'list': feed_back_list, 'total': total})
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def replyFeedBack(self, request_dict, response):
- feedBackID = request_dict.get('feedBackID', None)
- msg = request_dict.get('msg', None)
- uid = request_dict.get('uid', None)
- if not all([feedBackID, msg]):
- return response.json(444)
- try:
- nowTime = int(time.time())
- feed_back_qs = FeedBackModel.objects.filter(id=feedBackID)
- if not feed_back_qs.exists():
- return response.json(173)
- with transaction.atomic():
- SysMsgModel.objects.create(userID_id=feed_back_qs.first().userID_id, msg=msg, uid=uid,
- addTime=nowTime, updTime=nowTime) # 创建系统消息
- feed_back_qs.update(status=1) # 更新状态为已回复
- return response.json(0)
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def sendSysMsgToUser(self, request_dict, response):
- """
- 发送系统消息至用户
- @param request_dict:请求参数
- @param response:响应对象
- @param userID:用户ID
- @param msg:发送内容
- @return:
- """
- userID = request_dict.get('userID', None)
- msg = request_dict.get('msg', None)
- if not all([userID, msg]):
- return response.json(444)
- try:
- nowTime = int(time.time())
- SysMsgModel.objects.create(userID_id=userID, msg=msg, addTime=nowTime, updTime=nowTime)
- return response.json(0)
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def deleteFeedBack(self, request_dict, response):
- feedBackID = request_dict.get('feedBackID', None)
- if not feedBackID:
- return response.json(444)
- try:
- feed_back = FeedBackModel.objects.get(id=feedBackID)
- sr_id_list = feed_back.FS.values_list('id', flat=True)
- StatResModel.objects.filter(id__in=sr_id_list).delete()
- feed_back.delete()
- return response.json(0)
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def getSysMessageList(self, request_dict, response):
- # 功能群发查询
- print('request_dict: ', request_dict)
- pageNo = request_dict.get('pageNo', None)
- pageSize = request_dict.get('pageSize', None)
- if not all([pageNo, pageSize]):
- return response.json(444)
- page = int(pageNo)
- line = int(pageSize)
- try:
- sys_mass_qs = SysMassModel.objects.filter()
- total = sys_mass_qs.count()
- sys_mass_qs = sys_mass_qs.values('id', 'sender__username', 'addTime', 'updTime', 'lang', 'recever', 'msg',
- 'platform')
- sys_mass_qs = sys_mass_qs[(page - 1) * line:page * line]
- return response.json(0, {'list': list(sys_mass_qs), 'total': total})
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def getAppDataList(self, request_dict, response):
- print('request_dict: ', request_dict)
- platform = request_dict.get('platform', None)
- if platform == 'ios':
- app_type = [1]
- elif platform == 'android':
- app_type = [2]
- else:
- app_type = [1, 2]
- try:
- app_info_qs = App_Info.objects.filter(app_type__in=app_type).values('appBundleId', 'appName').distinct()
- appBundleId_list = []
- for app_info in app_info_qs:
- appBundleId_list.append(app_info['appBundleId'])
- return response.json(0, {'appBundleId_list': appBundleId_list})
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def sendSysMessage(self, request_dict, response):
- print('request_dict: ', request_dict)
- lang = request_dict.get('lang', None)
- platform = request_dict.get('platform', None)
- recever = request_dict.get('app_list', None)
- msg = request_dict.get('msg', None)
- if not all([lang, platform, recever, msg]):
- return response.json(444)
- try:
- with transaction.atomic():
- # SysMassModel表创建群发消息记录数据
- nowTime = int(time.time())
- sender_id = Device_User.objects.filter(username='13800138001').values('userID').first()['userID']
- SysMassModel.objects.create(
- sender_id=sender_id,
- lang=lang,
- platform=platform,
- recever=recever,
- msg=msg,
- addTime=nowTime,
- updTime=nowTime,
- )
- # 根据UserExModel表的userID群发消息给用户
- region_list = lang.split(',')
- appBundleId_list = recever.split(',')
- userID_list = UserExModel.objects.filter(appBundleId__in=appBundleId_list, region__in=region_list) \
- .values_list('userID_id', flat=True)
- sys_msg_list = []
- for userID in userID_list:
- sys_msg_list.append(SysMsgModel(userID_id=userID, msg=msg, addTime=nowTime, updTime=nowTime))
- if len(sys_msg_list) > 5000:
- SysMsgModel.objects.bulk_create(sys_msg_list)
- sys_msg_list = []
- SysMsgModel.objects.bulk_create(sys_msg_list)
- return response.json(0)
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def collectFeedBack(self, request_dict, response):
- """收藏或取消收藏用户反馈信息"""
- feedBackID = request_dict.get('feedBackID', None)
- collect_status = request_dict.get('collectStatus', None)
- if not all([feedBackID, collect_status]):
- return response.json(444)
- feedBackID = int(feedBackID)
- collect_status = int(collect_status)
- feed_back_qs = FeedBackModel.objects.filter(id=feedBackID, collect_status=collect_status)
- if feed_back_qs.exists(): # 判断是否已收藏
- feed_qs = feed_back_qs.first()
- feed_qs.collect_status = 0
- feed_qs.save()
- else:
- FeedBackModel.objects.filter(id=feedBackID).update(collect_status=collect_status)
- return response.json(0)
- def exportFeedBack(self, request_dict, response):
- status = request_dict.get('status', None)
- collectStatus = request_dict.get('collectStatus', None)
- try:
- with transaction.atomic():
- filter_data = {}
- if status or collectStatus:
- if status:
- filter_data['status'] = int(status)
- if collectStatus:
- filter_data['collect_status'] = int(collectStatus)
- feed_back_qs = FeedBackModel.objects.filter()
- if filter_data:
- feed_back_qs = feed_back_qs.filter(**filter_data)
- feed_backs = feed_back_qs.values(
- 'id',
- 'userID__username',
- 'userID__phone',
- 'userID__userEmail',
- 'content',
- 'addTime',
- 'status',
- 'type',
- 'app',
- 'app_version',
- 'phone_model',
- 'os_version',
- 'uid',
- 'appBundleId',
- 'score',
- 'collect_status'
- )
- feed_back_id_list = [feed_back['id'] for feed_back in feed_backs]
- stat_res_qs = StatResModel.objects.filter(
- feedbackmodel__id__in=feed_back_id_list).values(
- 'name', 'feedbackmodel__id')
- auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
- bucket = oss2.Bucket(
- auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
- feed_back_list = []
- for feed_back in feed_backs:
- feed_back['img_url'] = []
- for stat_res in stat_res_qs:
- if stat_res['feedbackmodel__id'] == feed_back['id']:
- obj = 'feedback/' + stat_res['name']
- img_url = bucket.sign_url('GET', obj, 3600)
- feed_back['img_url'].append(img_url)
- if not feed_back['userID__username']:
- feed_back['userID__username'] = feed_back['userID__userEmail'] if feed_back[
- 'userID__userEmail'] else feed_back['userID__phone']
- feed_back_list.append(feed_back)
- return response.json(0, {'list': feed_back_list})
- except Exception as e:
- print(e)
- def customerServiceManagement(self, request_dict, response):
- """
- 审核用户请求/生成超级密码
- @param request_dict:请求参数
- @param response:响应对象
- @request_dict status: 0:未通过,1:通过
- @request_dict hint: 温馨提示
- @return:
- """
- ID = request_dict.get('ID', None)
- userID = request_dict.get('userID', None)
- uid = request_dict.get('uid', None)
- status = request_dict.get('status', None)
- hint = request_dict.get('hint', None)
- lang = request_dict.get('lang', 'en')
- if not all({ID, uid, userID}):
- return response.json(444, 'ID, uid, userID')
- now = int(time.time())
- try:
- with transaction.atomic():
- device_super_password_qs = DeviceSuperPassword.objects.filter(id=ID, uid=uid, userID=userID)
- if not device_super_password_qs.exists():
- return response.json(173)
- status = int(status)
- if status == 1:
- # 验证码生成
- super_code = RandomStr(6, True)
- super_password_id = "super_password_%s" % userID
- redisObj = RedisObject()
- redis = redisObj.set_data(key=super_password_id, val=super_code, expire=86400)
- if redis is False:
- return response.json(121)
- device_super_password_qs.update(status=status)
- if lang == 'en':
- msg = "Your authorization code is " + super_code + ",valid within 24 hours"
- else:
- msg = "您的授权代码:" + super_code + ",24小时内有效"
- # eventType: 0系统消息,1 ipcamera消息,2 超级密码
- SysMsgModel.objects.create(userID_id=userID, msg=msg, addTime=now, updTime=now, uid=uid,
- eventType=2)
- return response.json(0)
- if status == 0 and len(hint) > 1:
- device_super_password_qs.update(status=status, hint=hint)
- SysMsgModel.objects.create(userID_id=userID, msg=hint, addTime=now, updTime=now, uid=uid,
- eventType=2)
- return response.json(0)
- return response.json(177)
- except Exception as e:
- print('修改状态异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def getDeviceSuperPassword(self, request_dict, response):
- """
- 查询用户请求表
- @param request_dict:请求参数
- @param response:响应对象
- @return:
- """
- pageNo = request_dict.get('pageNo', None)
- pageSize = request_dict.get('pageSize', None)
- status = request_dict.get('status', None)
- userID = request_dict.get('userID', None)
- uid = request_dict.get('uid', None)
- if not all([pageNo, pageSize]):
- return response.json(444)
- page = int(pageNo)
- line = int(pageSize)
- try:
- device_super_password_qs = DeviceSuperPassword.objects.all()
- if status:
- device_super_password_qs = device_super_password_qs.filter(status=status)
- if userID:
- device_super_password_qs = device_super_password_qs.filter(userID=userID)
- if uid:
- device_super_password_qs = device_super_password_qs.filter(uid=uid)
- if not device_super_password_qs.exists():
- return response.json(0, [])
- count = device_super_password_qs.count()
- device_super_password_qs = device_super_password_qs.values('id',
- 'uid',
- 'userID',
- 'orderID',
- 'describe',
- 'purchase_channel',
- 'addTime',
- 'status',
- 'buyTime',
- 'hint',
- 'lang',
- 'userID__username')
- device_super_password_qs = device_super_password_qs.order_by('-addTime')[
- (page - 1) * line:page * line]
- return response.json(0, {'list': list(device_super_password_qs), 'count': count})
- except Exception as e:
- print('查询异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def deleteInformation(self, request_dict, response):
- """
- 删除信息
- @param request_dict:请求参数
- @param response:响应对象
- """
- ID = request_dict.get('id', None)
- if not ID:
- return response.json(444)
- device_super_password_qs = DeviceSuperPassword.objects.filter(id=ID)
- if not device_super_password_qs.exists():
- return response.json(173)
- device_super_password_qs.delete()
- return response.json(0)
- @staticmethod
- def getCustomizedPushList(request_dict, response):
- title = request_dict.get('title', None)
- country = request_dict.get('country', None)
- device_type = request_dict.get('device_type', None)
- push_satus = request_dict.get('push_satus', None)
- page = request_dict.get('pageNo', None)
- line = request_dict.get('pageSize', None)
- if not all([page, line]):
- return response.json(444)
- page = int(page)
- line = int(line)
- try:
- customized_push_qs = CustomizedPush.objects.all()
- if title:
- customized_push_qs = customized_push_qs.filter(title=title)
- if country:
- customized_push_qs = customized_push_qs.filter(country=country)
- if device_type:
- customized_push_qs = customized_push_qs.filter(device_type__contains=device_type)
- if push_satus:
- customized_push_qs = customized_push_qs.filter(push_satus=push_satus)
- if not customized_push_qs.exists():
- return response.json(0, [])
- total = customized_push_qs.count()
- customized_push_qs = customized_push_qs.\
- values('id', 'title', 'msg', 'link', 'icon_link', 'country', 'device_type', 'register_period',
- 'time_zone', 'push_time', 'push_app', 'push_satus')
- customized_push_qs = customized_push_qs[(page - 1) * line:page * line]
- customized_push_list = []
- for customized_push in customized_push_qs:
- # 格式化数据
- register_period = customized_push['register_period'] + '年'
- time_zone = 'UTC ' + customized_push['time_zone']
- customized_push_list.append({
- 'customized_push_id': customized_push['id'],
- 'title': customized_push['title'],
- 'msg': customized_push['msg'],
- 'link': customized_push['link'],
- 'icon_link': customized_push['icon_link'],
- 'country': customized_push['country'],
- 'device_type': customized_push['device_type'],
- 'register_period': register_period,
- 'time_zone': time_zone,
- 'push_time': customized_push['push_time'],
- 'push_app': customized_push['push_app'],
- 'push_satus': customized_push['push_satus']
- })
- return response.json(0, {'list': customized_push_list, 'total': total})
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- @classmethod
- def addOrEditCustomizedPush(cls, request, request_dict, response):
- title = request_dict.get('title', None)
- msg = request_dict.get('msg', None)
- link = request_dict.get('link', None)
- icon = request.FILES.get('icon', None)
- country = request_dict.get('country', None)
- device_type = request_dict.get('deviceType', None)
- register_period = request_dict.get('registerPeriod', None)
- time_zone = request_dict.get('timeZone', None)
- push_time = request_dict.get('pushTime', None)
- push_app = request_dict.get('pushApp', None)
- is_edit = request_dict.get('isEdit', None)
- if not all([title, msg, link, country, device_type, register_period, time_zone, push_time, push_app]):
- return response.json(444)
- # 截掉UTC和空格
- time_zone = time_zone[4:]
- try:
- push_timestamp = CommonService.convert_to_timestamp(float(time_zone), push_time)
- if push_timestamp <= int(time.time()):
- return response.json(806)
- customized_push_data = {
- 'title': title,
- 'msg': msg,
- 'link': link,
- 'country': country,
- 'device_type': device_type,
- 'register_period': register_period,
- 'time_zone': time_zone,
- 'push_time': push_time,
- 'push_timestamp': push_timestamp,
- 'push_app': push_app
- }
- icon_link = ''
- if icon is not None:
- icon_name = icon.name
- icon_link = 'https://ansjerfilemanager.s3.amazonaws.com/customized-push/' + icon_name
- customized_push_data['icon_link'] = icon_link
- if icon_link:
- # 上传没有上传过的图片到S3
- customized_push_qs = CustomizedPush.objects.filter(icon_link=icon_link)
- if not customized_push_qs.exists():
- bucket = 'ansjerfilemanager'
- file_key = 'customized-push/' + icon_name
- s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
- s3.upload_file_obj(
- bucket,
- file_key,
- icon,
- {'ContentType': icon.content_type, 'ACL': 'public-read'})
- apscheduler_obj = ApschedulerObject()
- if is_edit: # 编辑
- customized_push_id = request_dict.get('customizedPushId', None)
- if not customized_push_id:
- return response.json(444)
- CustomizedPush.objects.filter(id=customized_push_id).update(**customized_push_data)
- apscheduler_obj.del_job('customizedPushId_{}'.format(customized_push_id)) # 删除旧定时任务
- else: # 新增
- customized_push = CustomizedPush.objects.create(**customized_push_data)
- customized_push_id = customized_push.id
- # 创建定时任务
- task_id = 'customized_push_id_{}'.format(customized_push_id)
- apscheduler_obj.create_date_job(func=cls.req_customized_push, task_id=task_id, time_stamp=push_timestamp,
- args=(customized_push_id,))
- return response.json(0)
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- @staticmethod
- def req_customized_push(customized_push_id):
- """
- 请求定制化推送
- @param customized_push_id:
- @return:
- """
- data = {'customized_push_id': customized_push_id}
- print(data)
- url = DETECT_PUSH_DOMAINS + 'customized_push/start'
- req = requests.post(url=url, data=data, timeout=8)
- @staticmethod
- def getCountryList(response):
- try:
- country_qs = CountryModel.objects.filter().values('country_name')
- if not country_qs.exists():
- return response.json(173)
- country_list = []
- for country in country_qs:
- country_list.append(country['country_name'])
- return response.json(0, {'list': country_list})
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- @staticmethod
- def getDeviceTypeList(response):
- try:
- device_type_qs = DeviceTypeModel.objects.filter().values('name')
- if not device_type_qs.exists():
- return response.json(173)
- device_type_list = []
- for device_type in device_type_qs:
- device_type_list.append(device_type['name'])
- return response.json(0, {'list': device_type_list})
- except Exception as e:
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
|