123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- import hashlib
- import json
- import os
- import threading
- import time
- import boto3
- import botocore
- from django.core.paginator import Paginator
- from django.db import transaction
- from django.views.generic.base import View
- from Ansjer.config import BASE_DIR, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
- from Ansjer.config import LOGGER, CONFIG_TEST, SERVER_DOMAIN, CONFIG_CN, CONFIG_INFO
- from Model.models import Equipment_Version, App_Info, AppSetModel, App_Colophon, Pc_Info, CountryModel, CNRegion, \
- Device_Info, UidSetModel, Device_User, IPAddr, DeviceVersionInfo
- from Object.RedisObject import RedisObject
- from Object.ResponseObject import ResponseObject
- from Object.TokenObject import TokenObject
- from Object.UrlTokenObject import UrlTokenObject
- from Service.CommonService import CommonService
- class VersionManagement(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 == 'upLoadFile':
- return self.upLoadFile(request, request_dict, response)
- elif operation == 'deviceAutoUpdate':
- return self.device_auto_update('124', 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
- userID = tko.userID
- if operation == 'getEquipmentVersionList':
- return self.getEquipmentVersionList(request_dict, response)
- elif operation == 'editVersionInformation':
- return self.editVersionInformation(request_dict, response)
- elif operation == 'deleteEquipmentVersion':
- return self.deleteEquipmentVersion(request_dict, response)
- elif operation == 'getAppVersionList':
- return self.getAppVersionList(request_dict, response)
- elif operation == 'addOrEditAppInfo':
- return self.addOrEditAppInfo(request_dict, response)
- elif operation == 'deleteAppVersion':
- return self.deleteAppVersion(request_dict, response)
- elif operation == 'getAppSet':
- return self.getAppSet(request_dict, response)
- elif operation == 'editAppSet':
- return self.editAppSet(request_dict, response)
- elif operation == 'getAppRecordList':
- return self.getAppRecordList(request_dict, response)
- elif operation == 'getAppBundleIdList':
- return self.getAppBundleIdList(request_dict, response)
- elif operation == 'addOrEditAppRecord':
- return self.addOrEditAppRecord(request_dict, response)
- elif operation == 'deleteAppRecord':
- return self.deleteAppRecord(request_dict, response)
- elif operation == 'getPcInfoList':
- return self.getPcInfoList(request_dict, response)
- elif operation == 'editPcVersion':
- return self.editPcVersion(request_dict, response)
- elif operation == 'deletePcInfo':
- return self.deletePcInfo(request_dict, response)
- elif operation == 'getCountryList':
- return self.getCountryList(request_dict, response)
- elif operation == 'getCityList':
- return self.getCityList(request_dict, response)
- elif operation == 'deviceAutoUpdate':
- return self.device_auto_update(userID, request_dict, response)
- else:
- return response.json(404)
- def getEquipmentVersionList(self, request_dict, response):
- mci = request_dict.get('mci', None)
- lang = request_dict.get('lang', None)
- version = request_dict.get('version', 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:
- equipment_version_qs = Equipment_Version.objects.filter().order_by('-update_time')
- if mci:
- equipment_version_qs = equipment_version_qs.filter(mci=mci)
- if lang:
- equipment_version_qs = equipment_version_qs.filter(lang=lang)
- if version:
- equipment_version_qs = equipment_version_qs.filter(version__contains=version)
- total = equipment_version_qs.count()
- equipment_version_qs = equipment_version_qs.values()[(page - 1) * line:page * line]
- equipment_version_list = CommonService.qs_to_list(equipment_version_qs)
- for equipment_version in equipment_version_list:
- new_equipment_version = equipment_version['version'][1:]
- d_code = new_equipment_version.rsplit('.', 1)[1]
- software_ver = new_equipment_version.rsplit('.', 1)[0].replace('V', '')
- device_ver_info_qs = DeviceVersionInfo.objects.filter(d_code=d_code, software_ver=software_ver)
- if device_ver_info_qs.exists():
- equipment_version['is_hav_dev_ver_info'] = 1
- else:
- equipment_version['is_hav_dev_ver_info'] = 0
- return response.json(0, {'list': equipment_version_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 upLoadFile(self, request, request_dict, response):
- file = request.FILES.get('file', None)
- mci = request_dict.get('mci', '')
- lang = request_dict.get('lang', '')
- ESN = request_dict.get('ESN', '')
- max_ver = request_dict.get('max_ver', '')
- channel = request_dict.get('channel', '')
- resolutionRatio = request_dict.get('resolutionRatio', '')
- Description = request_dict.get('Description', '')
- status = request_dict.get('status', 0)
- isPopup = request_dict.get('isPopup', 0)
- auto_update = request_dict.get('autoUpdate', 0)
- data_json = request_dict.get('dataJson', None)
- if not all([file, mci, lang, ESN, max_ver, channel, resolutionRatio]):
- return response.json(444)
- try:
- with transaction.atomic():
- nowTime = CommonService.timestamp_to_str(timestamp=int(time.time()))
- channel = int(channel)
- resolutionRatio = int(resolutionRatio)
- status = int(status)
- isPopup = int(isPopup)
- if data_json:
- data_json = eval(data_json)
- # 文件名为设备版本,最后一个'.'的前面为软件版本,后面为设备规格名称
- # V2.2.4.16E201252CA,软件版本:2.2.4,设备规格名称:16E201252CA
- # V1.7.2.36C11680X30411F000600000150001Z,软件版本:1.7.2,设备规格名称:36C11680X30411F000600000150001Z
- file_name = str(file) # 文件名
- # .img和.tar.gz文件
- file_type_index = file_name.find('.img')
- if file_type_index == -1:
- file_type_index = file_name.find('.tar')
- if file_type_index == -1:
- return response.json(903)
- version = file_name[:file_type_index] # 设备版本
- version_index = version.rindex('.')
- softwareVersion = version[1:version_index] # 软件版本
- code = version[version_index + 1:] # 设备规格名称
- chipModelList2Code = code[:4] # 主芯片
- type = code[8:10] # 设备机型
- companyCode = code[-1:] # 公司代码
- fileSize = file.size
- filePath = '/'.join(('static/otapack', mci, lang, file_name))
- file_data = file.read()
- fileMd5 = hashlib.md5(file_data).hexdigest()
- data_dict = {'mci': mci, 'lang': lang, 'ESN': ESN, 'max_ver': max_ver, 'channel': channel,
- 'resolutionRatio': resolutionRatio, 'Description': Description, 'status': status,
- 'is_popup': isPopup, 'version': version, 'softwareVersion': softwareVersion, 'code': code,
- 'chipModelList2Code': chipModelList2Code, 'type': type, 'companyCode': companyCode,
- 'fileSize': fileSize, 'filePath': filePath, 'fileMd5': fileMd5, 'update_time': nowTime,
- 'data_json': data_json, 'auto_update': auto_update}
- # Equipment_Version表创建或更新数据
- equipment_version_qs = Equipment_Version.objects.filter(code=code, lang=lang)
- if not equipment_version_qs.exists():
- Equipment_Version.objects.create(eid=CommonService.getUserID(getUser=False, setOTAID=True),
- **data_dict)
- else:
- equipment_version_qs.update(**data_dict)
- # 上传文件到服务器
- upload_path = '/'.join((BASE_DIR, 'static/otapack', mci, lang)).replace('\\', '/') + '/'
- if not os.path.exists(upload_path): # 上传目录不存在则创建
- os.makedirs(upload_path)
- # 文件上传
- full_name = upload_path + file_name
- if os.path.exists(full_name): # 删除同名文件
- os.remove(full_name)
- with open(full_name, 'wb+') as write_file:
- for chunk in file.chunks():
- write_file.write(chunk)
- LOGGER.info('versionManagement/upLoadFile成功上传{}'.format(file_name))
- if not DeviceVersionInfo.objects.filter(d_code=code, software_ver=softwareVersion).exists():
- return response.json(0, "该版本尚未添加设备版本信息")
- return response.json(0)
- except Exception as e:
- LOGGER.info(
- 'versionManagement/upLoadFile接口异常,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 editVersionInformation(self, request_dict, response):
- eid = request_dict.get('eid', None)
- ESN = request_dict.get('ESN', '')
- max_ver = request_dict.get('max_ver', '')
- status = request_dict.get('status', '')
- channel = request_dict.get('channel', '')
- resolutionRatio = request_dict.get('resolutionRatio', '')
- Description = request_dict.get('Description', '')
- is_popup = request_dict.get('is_popup', '')
- auto_update = request_dict.get('autoUpdate', 0)
- data_json = request_dict.get('dataJson', None)
- if not eid:
- return response.json(444)
- status = 1 if status == 'true' else 0
- if data_json:
- data_json = eval(data_json)
- try:
- equipment_version_qs = Equipment_Version.objects.filter(eid=eid)
- if not equipment_version_qs.exists():
- return response.json(173)
- data_dict = {'ESN': ESN, 'max_ver': max_ver, 'status': status, 'channel': channel,
- 'auto_update': auto_update, 'data_json': data_json,
- 'resolutionRatio': resolutionRatio, 'Description': Description, 'is_popup': is_popup}
- equipment_version_qs.update(**data_dict)
- 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 deleteEquipmentVersion(self, request_dict, response):
- eid = request_dict.get('eid', None)
- if not eid:
- return response.json(444)
- try:
- equipment_version_qs = Equipment_Version.objects.filter(eid=eid)
- filePath = equipment_version_qs.values('filePath')[0]['filePath']
- equipment_version_qs.delete()
- # 删除文件
- full_name = '/'.join((BASE_DIR, filePath)).replace('\\', '/')
- if os.path.exists(full_name):
- os.remove(full_name)
- 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 getAppVersionList(self, request_dict, response):
- app_type = request_dict.get('app_type', None)
- appName = request_dict.get('appName', None)
- version = request_dict.get('version', 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:
- app_info_qs = App_Info.objects.filter()
- if app_type:
- if app_type == 'IOS':
- app_type = 1
- elif app_type == '安卓':
- app_type = 2
- else:
- app_type = 3
- app_info_qs = app_info_qs.filter(app_type=app_type)
- if appName:
- app_info_qs = app_info_qs.filter(appName__contains=appName)
- if version:
- app_info_qs = app_info_qs.filter(version__contains=version)
- total = app_info_qs.count()
- app_info_qs = app_info_qs.values()[(page - 1) * line:page * line]
- app_info_list = CommonService.qs_to_list(app_info_qs)
- return response.json(0, {'list': app_info_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 addOrEditAppInfo(self, request_dict, response):
- id = request_dict.get('id', None)
- appName = request_dict.get('appName', '')
- appBundleId = request_dict.get('appBundleId', '')
- bundleVersion = request_dict.get('bundleVersion', '')
- newAppversion = request_dict.get('newAppversion', '')
- minAppversion = request_dict.get('minAppversion', '')
- content = request_dict.get('content', '')
- app_type = request_dict.get('app_type', '')
- downloadLink = request_dict.get('downloadLink', '')
- try:
- app_type = int(app_type)
- data_dict = {'appName': appName, 'appBundleId': appBundleId, 'bundleVersion': bundleVersion,
- 'newAppversion': newAppversion, 'minAppversion': minAppversion, 'content': content,
- 'app_type': app_type, 'downloadLink': downloadLink}
- if not id: # 添加
- App_Info.objects.create(**data_dict)
- else: # 编辑
- app_info_qs = App_Info.objects.filter(id=id)
- if not app_info_qs.exists():
- return response.json(173)
- app_info_qs.update(**data_dict)
- 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 deleteAppVersion(self, request_dict, response):
- appBundleId = request_dict.get('appBundleId', None)
- if not appBundleId:
- return response.json(444)
- try:
- App_Info.objects.filter(appBundleId=appBundleId).delete()
- AppSetModel.objects.filter(appBundleId=appBundleId).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 getAppSet(self, request_dict, response):
- appBundleId = request_dict.get('appBundleId', None)
- if not appBundleId:
- return response.json(444)
- try:
- app_set_qs = AppSetModel.objects.filter(appBundleId=appBundleId).values('content')
- if app_set_qs.exists():
- content = app_set_qs[0]['content']
- return response.json(0, {'content': content})
- else:
- nowTime = int(time.time())
- AppSetModel.objects.create(
- appBundleId=appBundleId,
- 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 editAppSet(self, request_dict, response):
- appBundleId = request_dict.get('appBundleId', None)
- content = request_dict.get('content', None)
- if not all([appBundleId, content]):
- return response.json(444)
- try:
- AppSetModel.objects.filter(appBundleId=appBundleId).update(content=content)
- 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 getAppRecordList_1(self, request_dict, response):
- app_type = request_dict.get('app_type', 'IOS')
- 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:
- if app_type:
- if app_type == 'IOS':
- app_type = 1
- elif app_type == '安卓':
- app_type = 2
- else:
- app_type = 3
- app_colophon_qs = App_Colophon.objects.filter(app_id__app_type=app_type).order_by('app_id').values_list(
- 'app_id__appBundleId', flat=True).distinct()
- if not app_colophon_qs.exists():
- return response.json(173)
- total = app_colophon_qs.count()
- app_colophon_list = list(app_colophon_qs[(page - 1) * line:page * line])
- app_info_qs = App_Colophon.objects.filter(app_id__appBundleId__in=app_colophon_list). \
- values("id", "lang", "newApp_version", "content", "version_time", "app_id__appBundleId",
- "app_id__appName", "app_id__app_type")
- app_info_list = list(app_info_qs)
- data_dict = {}
- # 组装数据
- for app_info in app_info_list:
- for app_colophon in app_colophon_list:
- if app_colophon not in data_dict.keys():
- data_dict[app_colophon] = []
- if app_colophon == app_info['app_id__appBundleId']:
- data_dict[app_colophon].append(app_info)
- for k, v in enumerate(data_dict):
- new = sorted(data_dict[v], key=lambda x: x['id'], reverse=True)
- data_dict[v] = new
- res = {
- 'data_dict': data_dict,
- 'total': total
- }
- return response.json(0, res)
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def getAppRecordList(self, request_dict, response):
- app_type = request_dict.get('appType', 'IOS')
- queryVersion = request_dict.get('queryVersion', None)
- queryAppBundleId = request_dict.get('queryAppBundleId', 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:
- if app_type == 'IOS':
- app_type = 1
- elif app_type == '安卓':
- app_type = 2
- else:
- app_type = 3
- app_colophon_qs = App_Colophon.objects.filter(app_id__app_type=app_type).order_by('app_id').values_list(
- 'app_id__appBundleId', flat=True).distinct()
- if not app_colophon_qs.exists():
- return response.json(173)
- total = app_colophon_qs.count()
- app_colophon_list = list(app_colophon_qs[(page - 1) * line:page * line])
- app_info_qs = App_Colophon.objects.filter(app_id__appBundleId__in=app_colophon_list). \
- values("id", "lang", "newApp_version", "content", "version_time", "app_id__appBundleId",
- "app_id__appName", "app_id__app_type")
- app_info_list = list(app_info_qs)
- app_record_list = [] # 响应的app record数据
- appBundleId_list = [] # 记录已添加过的appBundleId
- # 组装数据
- for app_info in app_info_list:
- version = app_info['lang'] + app_info['newApp_version']
- if app_info['app_id__appBundleId'] not in appBundleId_list:
- appBundleId_list.append(app_info['app_id__appBundleId'])
- newApp_version_list = [[app_info['lang'], app_info['newApp_version']]]
- app_record_dict = {
- 'app_id__appBundleId': app_info['app_id__appBundleId'],
- 'app_id__appName': app_info['app_id__appName'],
- 'app_id__app_type': app_info['app_id__app_type'],
- 'version': version,
- 'newApp_version_list': newApp_version_list,
- 'id': app_info['id'],
- 'content': app_info['content'],
- 'version_time': time.strftime("%Y-%m-%d", time.localtime(app_info['version_time'])),
- }
- if queryVersion and queryVersion == version and queryAppBundleId == app_info['app_id__appBundleId']:
- app_record_dict['id'] = app_info['id']
- app_record_dict['content'] = app_info['content']
- app_record_dict['version_time'] = time.strftime("%Y-%m-%d",
- time.localtime(app_info['version_time']))
- app_record_list.append(app_record_dict)
- else:
- index = appBundleId_list.index(app_info['app_id__appBundleId'])
- newApp_version_list = [app_info['lang'], app_info['newApp_version']]
- if queryVersion and queryVersion == version and queryAppBundleId == app_info['app_id__appBundleId']:
- # app_record_list里对应字典插入值
- app_record_list[index]['id'] = app_info['id']
- app_record_list[index]['content'] = app_info['content']
- app_record_list[index]['version_time'] = time.strftime("%Y-%m-%d",
- time.localtime(app_info['version_time']))
- app_record_list[index]['version'] = version
- app_record_list[index]['newApp_version_list'].insert(0, newApp_version_list)
- else:
- app_record_list[index]['newApp_version_list'].append(newApp_version_list)
- res = {
- 'app_record_list': app_record_list,
- 'total': total
- }
- return response.json(0, res)
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def getAppBundleIdList(self, request_dict, response):
- print('request_dict:', request_dict)
- app_type = request_dict.get('appType', 'IOS')
- try:
- if app_type == 'IOS':
- app_type = 1
- elif app_type == '安卓':
- app_type = 2
- else:
- app_type = 3
- app_info_qs = App_Info.objects.filter(app_type=app_type).values('id', 'appBundleId')
- appBundleIdList = list(app_info_qs)
- return response.json(0, {'appBundleIdList': appBundleIdList})
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def addOrEditAppRecord(self, request_dict, response):
- print('request_dict:', request_dict)
- appBundleId = request_dict.get('app_id__appBundleId', None)
- newApp_version = request_dict.get('version', None)
- version_time = request_dict.get('version_time', None)
- cn_content = request_dict.get('cnContent', None)
- en_content = request_dict.get('enContent', None)
- content = request_dict.get('content', None)
- app_colophon_id = request_dict.get('id', None)
- if not all([appBundleId, newApp_version, version_time]):
- return response.json(444)
- try:
- version_time = int(time.mktime(time.strptime(version_time, '%Y-%m-%d'))) # 字符串转时间戳
- if app_colophon_id: # 编辑
- # 编辑获取的版本信息前两位为语言
- lang = newApp_version[:2]
- newApp_version = newApp_version[2:]
- App_Colophon.objects.filter(id=app_colophon_id).update(lang=lang, newApp_version=newApp_version,
- content=content, version_time=version_time)
- else: # 添加
- app_info_qs = App_Info.objects.filter(appBundleId=appBundleId).values('id')
- if not app_info_qs.exists():
- return response.json(173)
- data_dict = {
- 'app_id_id': app_info_qs[0]['id'],
- 'newApp_version': newApp_version,
- 'version_time': version_time,
- 'lang': 'cn',
- 'content': cn_content,
- }
- with transaction.atomic():
- # 创建中文内容数据
- App_Colophon.objects.create(**data_dict)
- # 创建英文内容数据
- data_dict['lang'] = 'en'
- data_dict['content'] = en_content
- App_Colophon.objects.create(**data_dict)
- 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 deleteAppRecord(self, request_dict, response):
- print('request_dict:', request_dict)
- app_colophon_id = request_dict.get('app_colophon_id', None)
- try:
- if not app_colophon_id:
- return response.json(444)
- app_colophon_qs = App_Colophon.objects.filter(id=app_colophon_id)
- if not app_colophon_qs.exists():
- return response.json(173)
- app_colophon_qs.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 getPcInfoList(self, request_dict, response):
- print('request_dict:', request_dict)
- pc_name = request_dict.get('pcName', 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:
- pc_info_qs = Pc_Info.objects.filter()
- if pc_name:
- pc_info_qs = Pc_Info.objects.filter(pc_name__contains=pc_name)
- if not pc_info_qs.exists():
- return response.json(173)
- total = pc_info_qs.count()
- pc_info_qs = pc_info_qs.values()[(page - 1) * line:page * line]
- pc_info_list = CommonService.qs_to_list(pc_info_qs)
- return response.json(0, {'list': pc_info_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 editPcVersion(self, request_dict, response):
- pc_info_id = request_dict.get('id', None)
- pc_name = request_dict.get('pc_name', '')
- bundle_version = request_dict.get('bundle_version', '')
- pc_version = request_dict.get('pc_version', '')
- pc_test = request_dict.get('pc_test', '')
- lang = request_dict.get('lang', '')
- file_type = request_dict.get('file_type', '')
- package = request_dict.get('package', '')
- explain = request_dict.get('explain', '')
- is_update = request_dict.get('is_update', '')
- is_open = request_dict.get('is_open', '')
- content = request_dict.get('content', '')
- authority = request_dict.get('authority', '')
- download_link = request_dict.get('download_link', '')
- if not pc_info_id:
- return response.json(444)
- try:
- pc_info_qs = Pc_Info.objects.filter(id=pc_info_id)
- if not pc_info_qs.exists():
- return response.json(173)
- data_dict = {
- 'pc_name': pc_name,
- 'bundle_version': bundle_version,
- 'pc_version': pc_version,
- 'pc_test': pc_test,
- 'lang': lang,
- 'file_type': file_type,
- 'package': package,
- 'explain': explain,
- 'is_update': is_update,
- 'is_open': is_open,
- 'content': content,
- 'authority': authority,
- 'download_link': download_link,
- }
- pc_info_qs.update(**data_dict)
- 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 deletePcInfo(self, request_dict, response):
- print('request_dict:', request_dict)
- pc_info_id = request_dict.get('id', None)
- try:
- if not pc_info_id:
- return response.json(444)
- pc_info_qs = Pc_Info.objects.filter(id=pc_info_id)
- if not pc_info_qs.exists():
- return response.json(173)
- # 删除存储桶的文件
- Key = pc_info_qs.values('download_link')[0]['download_link']
- pc_info_qs.delete()
- aws_s3_client = boto3.client(
- 's3',
- region_name='cn-northwest-1',
- aws_access_key_id=AWS_ACCESS_KEY_ID[0],
- aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
- config=botocore.client.Config(signature_version='s3v4'),
- )
- try:
- aws_s3_client.delete_object(Bucket='pc-package', Key=Key)
- finally:
- 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 getCountryList(self, request_dict, response):
- try:
- country_qs = CountryModel.objects.all().values_list('country_name', flat=True)
- return response.json(0, list(country_qs))
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- def getCityList(self, request_dict, response):
- try:
- city_qs = CNRegion.objects.filter(level=2).values_list('name', flat=True)
- return response.json(0, list(city_qs))
- except Exception as e:
- print(e)
- return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
- @classmethod
- def device_auto_update(cls, user_id, request_dict, response):
- verId = request_dict.get('verId', None)
- if not verId:
- return response.json(444)
- LOGGER.info(f'版本ID:{verId},操作用户{user_id}')
- version_qs = Equipment_Version.objects.filter(eid=verId, auto_update=True, status=1)
- if not version_qs.exists():
- return response.json(173)
- agent_thread = threading.Thread(target=VersionManagement().device_async_update,
- args=version_qs)
- agent_thread.start()
- return response.json(0)
- @staticmethod
- def device_async_update(version_qs):
- code = version_qs.code
- version = version_qs.softwareVersion
- ver_data = version_qs.data_json
- uid_set_qs = UidSetModel.objects.filter(ucode=code).exclude(version=version) \
- .values('uid', 'ip', 'version')
- LOGGER.info(f'通知设备自动升级查询符合数量{uid_set_qs.count()}')
- if not uid_set_qs.exists():
- return
- # 创建分页器,每页100条数据
- paginator = Paginator(uid_set_qs, 100)
- # 遍历每一页数据
- for page_num in range(1, paginator.num_pages + 1):
- # 获取当前页的数据
- page_data = paginator.page(page_num)
- # 遍历当前页的每一条数据
- for data in page_data:
- uid = data['uid']
- result = VersionManagement.check_version_auto_update(uid, '', ver_data)
- if not result:
- continue
- serial_number = CommonService.get_serial_number_by_uid(uid)
- now_ver = data['version']
- LOGGER.info(f'uid={uid},ucode={code},当前版本{now_ver},最新版本{version}')
- VersionManagement.send_auto_update_url(version_qs, uid, serial_number, code, now_ver)
- @classmethod
- def check_version_auto_update(cls, uid, user_id, ver_data):
- """
- :param uid: 设备UID
- :param user_id: 用户id
- :param ver_data: 版本指定升级数据
- :return: True | False
- """
- try:
- if not ver_data: # 过滤值默认当前版本所有设备自动升级
- return True
- if uid and ver_data['uid_list']: # 当前版本指定UID
- return uid in ver_data['uid_list']
- if user_id and ver_data['country_list'] and CONFIG_INFO not in [CONFIG_CN, CONFIG_TEST]: # 当前版本指定用户国家
- user_qs = Device_User.objects.filter(userID=user_id).values('region_country')
- if not user_qs.exists(): # 用户不存在不升级
- return False
- if user_qs[0]['region_country'] == 0: # 用户未选择国家 不进行升级提示
- return False
- return user_qs[0]['region_country'] in ver_data['country_list']
- if CONFIG_INFO in [CONFIG_CN, CONFIG_TEST] and ver_data['addr']: # 中国区可指定城市
- city_list = ver_data['addr']['city_list']
- if not city_list:
- return True
- uid_set_qs = UidSetModel.objects.filter(uid=uid).values('ip')
- if not uid_set_qs:
- return False
- ip_qs = IPAddr.objects.filter(ip=uid_set_qs[0]['ip']).values('city').order_by('-id')
- if not ip_qs:
- return False
- return ip_qs[0]['city'] in city_list
- return False
- except Exception as e:
- LOGGER.error(f'检测是否符合自动升级{repr(e)}')
- return False
- @staticmethod
- def send_auto_update_url(version_qs, uid, serial_number, code, now_ver):
- """
- 发送自动升级URL
- @param version_qs: 最新版本querySet
- @param uid: 设备UID
- @param serial_number: 设备序列号
- @param code: 设备规格码
- @param now_ver: 设备当前版本好
- @return:
- """
- try:
- file_path = version_qs.filePath
- version = version_qs.version
- mci = version_qs.mci
- ver = version_qs.softwareVersion
- max_ver = version_qs.max_ver
- if ver <= max_ver:
- user_qs = Device_Info.objects.filter(UID=uid, isShare=False).values('userID_id')
- if not user_qs.exists():
- return False
- user_id = user_qs[0]['userID_id']
- # 创建url的token
- param_url = "ansjer/" + CommonService.RandomStr(6) + "/" + file_path
- data = {'Url': param_url, 'user_id': user_id,
- 'uid': uid, 'serial_number': serial_number, 'old_version': "V" + now_ver + "." + code,
- 'new_version': version, 'mci': mci}
- device_info_value = json.dumps(data)
- expire = 600
- str_uuid = str(user_id)
- if serial_number and serial_number != 'null':
- str_uuid += serial_number
- elif uid and uid != 'null':
- str_uuid += uid
- str_uuid += now_ver
- device_info_key = 'ASJ:SERVER:VERSION:{}'.format(str_uuid)
- LOGGER.info('缓存key={}'.format(device_info_key))
- redisObject = RedisObject()
- redisObject.set_data(device_info_key, device_info_value, expire)
- url_tko = UrlTokenObject()
- file_path = url_tko.generate(data={'uid': str_uuid})
- url = SERVER_DOMAIN + 'dlotapack/' + file_path
- # 主题名称
- topic_name = f'ansjer/generic/{serial_number}'
- # 发布消息内容
- msg = {"commandCode": 1, "data": {"url": url}}
- result = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
- LOGGER.info(f'uid={uid}发送数据msg={msg},发送MQTT结果={result}')
- except Exception as e:
- LOGGER.error(f'自动升级异常{repr(e)}')
|