VersionManagementController.py 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import hashlib
  4. import json
  5. import os
  6. import threading
  7. import time
  8. import boto3
  9. import botocore
  10. from django.core.paginator import Paginator
  11. from django.db import transaction
  12. from django.views.generic.base import View
  13. from Ansjer.config import BASE_DIR, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
  14. from Ansjer.config import LOGGER, CONFIG_TEST, SERVER_DOMAIN, CONFIG_CN, CONFIG_INFO
  15. from Model.models import Equipment_Version, App_Info, AppSetModel, App_Colophon, Pc_Info, CountryModel, CNRegion, \
  16. Device_Info, UidSetModel, Device_User, IPAddr
  17. from Object.RedisObject import RedisObject
  18. from Object.ResponseObject import ResponseObject
  19. from Object.TokenObject import TokenObject
  20. from Object.UrlTokenObject import UrlTokenObject
  21. from Service.CommonService import CommonService
  22. class VersionManagement(View):
  23. def get(self, request, *args, **kwargs):
  24. request.encoding = 'utf-8'
  25. operation = kwargs.get('operation')
  26. return self.validation(request.GET, request, operation)
  27. def post(self, request, *args, **kwargs):
  28. request.encoding = 'utf-8'
  29. operation = kwargs.get('operation')
  30. return self.validation(request.POST, request, operation)
  31. def validation(self, request_dict, request, operation):
  32. language = request_dict.get('language', 'en')
  33. response = ResponseObject(language, 'pc')
  34. if operation == 'upLoadFile':
  35. return self.upLoadFile(request, request_dict, response)
  36. elif operation == 'deviceAutoUpdate':
  37. return self.device_auto_update('124', request_dict, response)
  38. else:
  39. tko = TokenObject(
  40. request.META.get('HTTP_AUTHORIZATION'),
  41. returntpye='pc')
  42. if tko.code != 0:
  43. return response.json(tko.code)
  44. response.lang = tko.lang
  45. userID = tko.userID
  46. if operation == 'getEquipmentVersionList':
  47. return self.getEquipmentVersionList(request_dict, response)
  48. elif operation == 'editVersionInformation':
  49. return self.editVersionInformation(request_dict, response)
  50. elif operation == 'deleteEquipmentVersion':
  51. return self.deleteEquipmentVersion(request_dict, response)
  52. elif operation == 'getAppVersionList':
  53. return self.getAppVersionList(request_dict, response)
  54. elif operation == 'addOrEditAppInfo':
  55. return self.addOrEditAppInfo(request_dict, response)
  56. elif operation == 'deleteAppVersion':
  57. return self.deleteAppVersion(request_dict, response)
  58. elif operation == 'getAppSet':
  59. return self.getAppSet(request_dict, response)
  60. elif operation == 'editAppSet':
  61. return self.editAppSet(request_dict, response)
  62. elif operation == 'getAppRecordList':
  63. return self.getAppRecordList(request_dict, response)
  64. elif operation == 'getAppBundleIdList':
  65. return self.getAppBundleIdList(request_dict, response)
  66. elif operation == 'addOrEditAppRecord':
  67. return self.addOrEditAppRecord(request_dict, response)
  68. elif operation == 'deleteAppRecord':
  69. return self.deleteAppRecord(request_dict, response)
  70. elif operation == 'getPcInfoList':
  71. return self.getPcInfoList(request_dict, response)
  72. elif operation == 'editPcVersion':
  73. return self.editPcVersion(request_dict, response)
  74. elif operation == 'deletePcInfo':
  75. return self.deletePcInfo(request_dict, response)
  76. elif operation == 'getCountryList':
  77. return self.getCountryList(request_dict, response)
  78. elif operation == 'getCityList':
  79. return self.getCityList(request_dict, response)
  80. elif operation == 'deviceAutoUpdate':
  81. return self.device_auto_update(userID, request_dict, response)
  82. else:
  83. return response.json(404)
  84. def getEquipmentVersionList(self, request_dict, response):
  85. mci = request_dict.get('mci', None)
  86. lang = request_dict.get('lang', None)
  87. version = request_dict.get('version', None)
  88. pageNo = request_dict.get('pageNo', None)
  89. pageSize = request_dict.get('pageSize', None)
  90. if not all([pageNo, pageSize]):
  91. return response.json(444)
  92. page = int(pageNo)
  93. line = int(pageSize)
  94. try:
  95. equipment_version_qs = Equipment_Version.objects.filter().order_by('-update_time')
  96. if mci:
  97. equipment_version_qs = equipment_version_qs.filter(mci=mci)
  98. if lang:
  99. equipment_version_qs = equipment_version_qs.filter(lang=lang)
  100. if version:
  101. equipment_version_qs = equipment_version_qs.filter(version__contains=version)
  102. total = equipment_version_qs.count()
  103. equipment_version_qs = equipment_version_qs.values()[(page - 1) * line:page * line]
  104. equipment_version_list = CommonService.qs_to_list(equipment_version_qs)
  105. return response.json(0, {'list': equipment_version_list, 'total': total})
  106. except Exception as e:
  107. print(e)
  108. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  109. def upLoadFile(self, request, request_dict, response):
  110. file = request.FILES.get('file', None)
  111. mci = request_dict.get('mci', '')
  112. lang = request_dict.get('lang', '')
  113. ESN = request_dict.get('ESN', '')
  114. max_ver = request_dict.get('max_ver', '')
  115. channel = request_dict.get('channel', '')
  116. resolutionRatio = request_dict.get('resolutionRatio', '')
  117. Description = request_dict.get('Description', '')
  118. status = request_dict.get('status', 0)
  119. isPopup = request_dict.get('isPopup', 0)
  120. auto_update = request_dict.get('autoUpdate', 0)
  121. data_json = request_dict.get('dataJson', None)
  122. if not all([file, mci, lang, ESN, max_ver, channel, resolutionRatio]):
  123. return response.json(444)
  124. try:
  125. with transaction.atomic():
  126. nowTime = CommonService.timestamp_to_str(timestamp=int(time.time()))
  127. channel = int(channel)
  128. resolutionRatio = int(resolutionRatio)
  129. status = int(status)
  130. isPopup = int(isPopup)
  131. if data_json:
  132. data_json = eval(data_json)
  133. # 文件名为设备版本,最后一个'.'的前面为软件版本,后面为设备规格名称
  134. # V2.2.4.16E201252CA,软件版本:2.2.4,设备规格名称:16E201252CA
  135. # V1.7.2.36C11680X30411F000600000150001Z,软件版本:1.7.2,设备规格名称:36C11680X30411F000600000150001Z
  136. file_name = str(file) # 文件名
  137. # .img和.tar.gz文件
  138. file_type_index = file_name.find('.img')
  139. if file_type_index == -1:
  140. file_type_index = file_name.find('.tar')
  141. if file_type_index == -1:
  142. return response.json(903)
  143. version = file_name[:file_type_index] # 设备版本
  144. version_index = version.rindex('.')
  145. softwareVersion = version[1:version_index] # 软件版本
  146. code = version[version_index + 1:] # 设备规格名称
  147. chipModelList2Code = code[:4] # 主芯片
  148. type = code[8:10] # 设备机型
  149. companyCode = code[-1:] # 公司代码
  150. fileSize = file.size
  151. filePath = '/'.join(('static/otapack', mci, lang, file_name))
  152. file_data = file.read()
  153. fileMd5 = hashlib.md5(file_data).hexdigest()
  154. data_dict = {'mci': mci, 'lang': lang, 'ESN': ESN, 'max_ver': max_ver, 'channel': channel,
  155. 'resolutionRatio': resolutionRatio, 'Description': Description, 'status': status,
  156. 'is_popup': isPopup, 'version': version, 'softwareVersion': softwareVersion, 'code': code,
  157. 'chipModelList2Code': chipModelList2Code, 'type': type, 'companyCode': companyCode,
  158. 'fileSize': fileSize, 'filePath': filePath, 'fileMd5': fileMd5, 'update_time': nowTime,
  159. 'data_json': data_json, 'auto_update': auto_update}
  160. # Equipment_Version表创建或更新数据
  161. equipment_version_qs = Equipment_Version.objects.filter(code=code, lang=lang)
  162. if not equipment_version_qs.exists():
  163. Equipment_Version.objects.create(eid=CommonService.getUserID(getUser=False, setOTAID=True),
  164. **data_dict)
  165. else:
  166. equipment_version_qs.update(**data_dict)
  167. # 上传文件到服务器
  168. upload_path = '/'.join((BASE_DIR, 'static/otapack', mci, lang)).replace('\\', '/') + '/'
  169. if not os.path.exists(upload_path): # 上传目录不存在则创建
  170. os.makedirs(upload_path)
  171. # 文件上传
  172. full_name = upload_path + file_name
  173. if os.path.exists(full_name): # 删除同名文件
  174. os.remove(full_name)
  175. with open(full_name, 'wb+') as write_file:
  176. for chunk in file.chunks():
  177. write_file.write(chunk)
  178. LOGGER.info('versionManagement/upLoadFile成功上传{}'.format(file_name))
  179. return response.json(0)
  180. except Exception as e:
  181. LOGGER.info(
  182. 'versionManagement/upLoadFile接口异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  183. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  184. def editVersionInformation(self, request_dict, response):
  185. eid = request_dict.get('eid', None)
  186. ESN = request_dict.get('ESN', '')
  187. max_ver = request_dict.get('max_ver', '')
  188. status = request_dict.get('status', '')
  189. channel = request_dict.get('channel', '')
  190. resolutionRatio = request_dict.get('resolutionRatio', '')
  191. Description = request_dict.get('Description', '')
  192. is_popup = request_dict.get('is_popup', '')
  193. auto_update = request_dict.get('autoUpdate', 0)
  194. data_json = request_dict.get('dataJson', None)
  195. if not eid:
  196. return response.json(444)
  197. status = 1 if status == 'true' else 0
  198. if data_json:
  199. data_json = eval(data_json)
  200. try:
  201. equipment_version_qs = Equipment_Version.objects.filter(eid=eid)
  202. if not equipment_version_qs.exists():
  203. return response.json(173)
  204. data_dict = {'ESN': ESN, 'max_ver': max_ver, 'status': status, 'channel': channel,
  205. 'auto_update': auto_update, 'data_json': data_json,
  206. 'resolutionRatio': resolutionRatio, 'Description': Description, 'is_popup': is_popup}
  207. equipment_version_qs.update(**data_dict)
  208. return response.json(0)
  209. except Exception as e:
  210. print(e)
  211. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  212. def deleteEquipmentVersion(self, request_dict, response):
  213. eid = request_dict.get('eid', None)
  214. if not eid:
  215. return response.json(444)
  216. try:
  217. equipment_version_qs = Equipment_Version.objects.filter(eid=eid)
  218. filePath = equipment_version_qs.values('filePath')[0]['filePath']
  219. equipment_version_qs.delete()
  220. # 删除文件
  221. full_name = '/'.join((BASE_DIR, filePath)).replace('\\', '/')
  222. if os.path.exists(full_name):
  223. os.remove(full_name)
  224. return response.json(0)
  225. except Exception as e:
  226. print(e)
  227. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  228. def getAppVersionList(self, request_dict, response):
  229. app_type = request_dict.get('app_type', None)
  230. appName = request_dict.get('appName', None)
  231. version = request_dict.get('version', None)
  232. pageNo = request_dict.get('pageNo', None)
  233. pageSize = request_dict.get('pageSize', None)
  234. if not all([pageNo, pageSize]):
  235. return response.json(444)
  236. page = int(pageNo)
  237. line = int(pageSize)
  238. try:
  239. app_info_qs = App_Info.objects.filter()
  240. if app_type:
  241. if app_type == 'IOS':
  242. app_type = 1
  243. elif app_type == '安卓':
  244. app_type = 2
  245. else:
  246. app_type = 3
  247. app_info_qs = app_info_qs.filter(app_type=app_type)
  248. if appName:
  249. app_info_qs = app_info_qs.filter(appName__contains=appName)
  250. if version:
  251. app_info_qs = app_info_qs.filter(version__contains=version)
  252. total = app_info_qs.count()
  253. app_info_qs = app_info_qs.values()[(page - 1) * line:page * line]
  254. app_info_list = CommonService.qs_to_list(app_info_qs)
  255. return response.json(0, {'list': app_info_list, 'total': total})
  256. except Exception as e:
  257. print(e)
  258. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  259. def addOrEditAppInfo(self, request_dict, response):
  260. id = request_dict.get('id', None)
  261. appName = request_dict.get('appName', '')
  262. appBundleId = request_dict.get('appBundleId', '')
  263. bundleVersion = request_dict.get('bundleVersion', '')
  264. newAppversion = request_dict.get('newAppversion', '')
  265. minAppversion = request_dict.get('minAppversion', '')
  266. content = request_dict.get('content', '')
  267. app_type = request_dict.get('app_type', '')
  268. downloadLink = request_dict.get('downloadLink', '')
  269. try:
  270. app_type = int(app_type)
  271. data_dict = {'appName': appName, 'appBundleId': appBundleId, 'bundleVersion': bundleVersion,
  272. 'newAppversion': newAppversion, 'minAppversion': minAppversion, 'content': content,
  273. 'app_type': app_type, 'downloadLink': downloadLink}
  274. if not id: # 添加
  275. App_Info.objects.create(**data_dict)
  276. else: # 编辑
  277. app_info_qs = App_Info.objects.filter(id=id)
  278. if not app_info_qs.exists():
  279. return response.json(173)
  280. app_info_qs.update(**data_dict)
  281. return response.json(0)
  282. except Exception as e:
  283. print(e)
  284. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  285. def deleteAppVersion(self, request_dict, response):
  286. appBundleId = request_dict.get('appBundleId', None)
  287. if not appBundleId:
  288. return response.json(444)
  289. try:
  290. App_Info.objects.filter(appBundleId=appBundleId).delete()
  291. AppSetModel.objects.filter(appBundleId=appBundleId).delete()
  292. return response.json(0)
  293. except Exception as e:
  294. print(e)
  295. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  296. def getAppSet(self, request_dict, response):
  297. appBundleId = request_dict.get('appBundleId', None)
  298. if not appBundleId:
  299. return response.json(444)
  300. try:
  301. app_set_qs = AppSetModel.objects.filter(appBundleId=appBundleId).values('content')
  302. if app_set_qs.exists():
  303. content = app_set_qs[0]['content']
  304. return response.json(0, {'content': content})
  305. else:
  306. nowTime = int(time.time())
  307. AppSetModel.objects.create(
  308. appBundleId=appBundleId,
  309. addTime=nowTime,
  310. updTime=nowTime
  311. )
  312. return response.json(0)
  313. except Exception as e:
  314. print(e)
  315. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  316. def editAppSet(self, request_dict, response):
  317. appBundleId = request_dict.get('appBundleId', None)
  318. content = request_dict.get('content', None)
  319. if not all([appBundleId, content]):
  320. return response.json(444)
  321. try:
  322. AppSetModel.objects.filter(appBundleId=appBundleId).update(content=content)
  323. return response.json(0)
  324. except Exception as e:
  325. print(e)
  326. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  327. def getAppRecordList_1(self, request_dict, response):
  328. app_type = request_dict.get('app_type', 'IOS')
  329. pageNo = request_dict.get('pageNo', None)
  330. pageSize = request_dict.get('pageSize', None)
  331. if not all([pageNo, pageSize]):
  332. return response.json(444)
  333. page = int(pageNo)
  334. line = int(pageSize)
  335. try:
  336. if app_type:
  337. if app_type == 'IOS':
  338. app_type = 1
  339. elif app_type == '安卓':
  340. app_type = 2
  341. else:
  342. app_type = 3
  343. app_colophon_qs = App_Colophon.objects.filter(app_id__app_type=app_type).order_by('app_id').values_list(
  344. 'app_id__appBundleId', flat=True).distinct()
  345. if not app_colophon_qs.exists():
  346. return response.json(173)
  347. total = app_colophon_qs.count()
  348. app_colophon_list = list(app_colophon_qs[(page - 1) * line:page * line])
  349. app_info_qs = App_Colophon.objects.filter(app_id__appBundleId__in=app_colophon_list). \
  350. values("id", "lang", "newApp_version", "content", "version_time", "app_id__appBundleId",
  351. "app_id__appName", "app_id__app_type")
  352. app_info_list = list(app_info_qs)
  353. data_dict = {}
  354. # 组装数据
  355. for app_info in app_info_list:
  356. for app_colophon in app_colophon_list:
  357. if app_colophon not in data_dict.keys():
  358. data_dict[app_colophon] = []
  359. if app_colophon == app_info['app_id__appBundleId']:
  360. data_dict[app_colophon].append(app_info)
  361. for k, v in enumerate(data_dict):
  362. new = sorted(data_dict[v], key=lambda x: x['id'], reverse=True)
  363. data_dict[v] = new
  364. res = {
  365. 'data_dict': data_dict,
  366. 'total': total
  367. }
  368. return response.json(0, res)
  369. except Exception as e:
  370. print(e)
  371. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  372. def getAppRecordList(self, request_dict, response):
  373. app_type = request_dict.get('appType', 'IOS')
  374. queryVersion = request_dict.get('queryVersion', None)
  375. queryAppBundleId = request_dict.get('queryAppBundleId', None)
  376. pageNo = request_dict.get('pageNo', None)
  377. pageSize = request_dict.get('pageSize', None)
  378. if not all([pageNo, pageSize]):
  379. return response.json(444)
  380. page = int(pageNo)
  381. line = int(pageSize)
  382. try:
  383. if app_type == 'IOS':
  384. app_type = 1
  385. elif app_type == '安卓':
  386. app_type = 2
  387. else:
  388. app_type = 3
  389. app_colophon_qs = App_Colophon.objects.filter(app_id__app_type=app_type).order_by('app_id').values_list(
  390. 'app_id__appBundleId', flat=True).distinct()
  391. if not app_colophon_qs.exists():
  392. return response.json(173)
  393. total = app_colophon_qs.count()
  394. app_colophon_list = list(app_colophon_qs[(page - 1) * line:page * line])
  395. app_info_qs = App_Colophon.objects.filter(app_id__appBundleId__in=app_colophon_list). \
  396. values("id", "lang", "newApp_version", "content", "version_time", "app_id__appBundleId",
  397. "app_id__appName", "app_id__app_type")
  398. app_info_list = list(app_info_qs)
  399. app_record_list = [] # 响应的app record数据
  400. appBundleId_list = [] # 记录已添加过的appBundleId
  401. # 组装数据
  402. for app_info in app_info_list:
  403. version = app_info['lang'] + app_info['newApp_version']
  404. if app_info['app_id__appBundleId'] not in appBundleId_list:
  405. appBundleId_list.append(app_info['app_id__appBundleId'])
  406. newApp_version_list = [[app_info['lang'], app_info['newApp_version']]]
  407. app_record_dict = {
  408. 'app_id__appBundleId': app_info['app_id__appBundleId'],
  409. 'app_id__appName': app_info['app_id__appName'],
  410. 'app_id__app_type': app_info['app_id__app_type'],
  411. 'version': version,
  412. 'newApp_version_list': newApp_version_list,
  413. 'id': app_info['id'],
  414. 'content': app_info['content'],
  415. 'version_time': time.strftime("%Y-%m-%d", time.localtime(app_info['version_time'])),
  416. }
  417. if queryVersion and queryVersion == version and queryAppBundleId == app_info['app_id__appBundleId']:
  418. app_record_dict['id'] = app_info['id']
  419. app_record_dict['content'] = app_info['content']
  420. app_record_dict['version_time'] = time.strftime("%Y-%m-%d",
  421. time.localtime(app_info['version_time']))
  422. app_record_list.append(app_record_dict)
  423. else:
  424. index = appBundleId_list.index(app_info['app_id__appBundleId'])
  425. newApp_version_list = [app_info['lang'], app_info['newApp_version']]
  426. if queryVersion and queryVersion == version and queryAppBundleId == app_info['app_id__appBundleId']:
  427. # app_record_list里对应字典插入值
  428. app_record_list[index]['id'] = app_info['id']
  429. app_record_list[index]['content'] = app_info['content']
  430. app_record_list[index]['version_time'] = time.strftime("%Y-%m-%d",
  431. time.localtime(app_info['version_time']))
  432. app_record_list[index]['version'] = version
  433. app_record_list[index]['newApp_version_list'].insert(0, newApp_version_list)
  434. else:
  435. app_record_list[index]['newApp_version_list'].append(newApp_version_list)
  436. res = {
  437. 'app_record_list': app_record_list,
  438. 'total': total
  439. }
  440. return response.json(0, res)
  441. except Exception as e:
  442. print(e)
  443. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  444. def getAppBundleIdList(self, request_dict, response):
  445. print('request_dict:', request_dict)
  446. app_type = request_dict.get('appType', 'IOS')
  447. try:
  448. if app_type == 'IOS':
  449. app_type = 1
  450. elif app_type == '安卓':
  451. app_type = 2
  452. else:
  453. app_type = 3
  454. app_info_qs = App_Info.objects.filter(app_type=app_type).values('id', 'appBundleId')
  455. appBundleIdList = list(app_info_qs)
  456. return response.json(0, {'appBundleIdList': appBundleIdList})
  457. except Exception as e:
  458. print(e)
  459. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  460. def addOrEditAppRecord(self, request_dict, response):
  461. print('request_dict:', request_dict)
  462. appBundleId = request_dict.get('app_id__appBundleId', None)
  463. newApp_version = request_dict.get('version', None)
  464. version_time = request_dict.get('version_time', None)
  465. cn_content = request_dict.get('cnContent', None)
  466. en_content = request_dict.get('enContent', None)
  467. content = request_dict.get('content', None)
  468. app_colophon_id = request_dict.get('id', None)
  469. if not all([appBundleId, newApp_version, version_time]):
  470. return response.json(444)
  471. try:
  472. version_time = int(time.mktime(time.strptime(version_time, '%Y-%m-%d'))) # 字符串转时间戳
  473. if app_colophon_id: # 编辑
  474. # 编辑获取的版本信息前两位为语言
  475. lang = newApp_version[:2]
  476. newApp_version = newApp_version[2:]
  477. App_Colophon.objects.filter(id=app_colophon_id).update(lang=lang, newApp_version=newApp_version,
  478. content=content, version_time=version_time)
  479. else: # 添加
  480. app_info_qs = App_Info.objects.filter(appBundleId=appBundleId).values('id')
  481. if not app_info_qs.exists():
  482. return response.json(173)
  483. data_dict = {
  484. 'app_id_id': app_info_qs[0]['id'],
  485. 'newApp_version': newApp_version,
  486. 'version_time': version_time,
  487. 'lang': 'cn',
  488. 'content': cn_content,
  489. }
  490. with transaction.atomic():
  491. # 创建中文内容数据
  492. App_Colophon.objects.create(**data_dict)
  493. # 创建英文内容数据
  494. data_dict['lang'] = 'en'
  495. data_dict['content'] = en_content
  496. App_Colophon.objects.create(**data_dict)
  497. return response.json(0)
  498. except Exception as e:
  499. print(e)
  500. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  501. def deleteAppRecord(self, request_dict, response):
  502. print('request_dict:', request_dict)
  503. app_colophon_id = request_dict.get('app_colophon_id', None)
  504. try:
  505. if not app_colophon_id:
  506. return response.json(444)
  507. app_colophon_qs = App_Colophon.objects.filter(id=app_colophon_id)
  508. if not app_colophon_qs.exists():
  509. return response.json(173)
  510. app_colophon_qs.delete()
  511. return response.json(0)
  512. except Exception as e:
  513. print(e)
  514. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  515. def getPcInfoList(self, request_dict, response):
  516. print('request_dict:', request_dict)
  517. pc_name = request_dict.get('pcName', None)
  518. pageNo = request_dict.get('pageNo', None)
  519. pageSize = request_dict.get('pageSize', None)
  520. if not all([pageNo, pageSize]):
  521. return response.json(444)
  522. page = int(pageNo)
  523. line = int(pageSize)
  524. try:
  525. pc_info_qs = Pc_Info.objects.filter()
  526. if pc_name:
  527. pc_info_qs = Pc_Info.objects.filter(pc_name__contains=pc_name)
  528. if not pc_info_qs.exists():
  529. return response.json(173)
  530. total = pc_info_qs.count()
  531. pc_info_qs = pc_info_qs.values()[(page - 1) * line:page * line]
  532. pc_info_list = CommonService.qs_to_list(pc_info_qs)
  533. return response.json(0, {'list': pc_info_list, 'total': total})
  534. except Exception as e:
  535. print(e)
  536. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  537. def editPcVersion(self, request_dict, response):
  538. pc_info_id = request_dict.get('id', None)
  539. pc_name = request_dict.get('pc_name', '')
  540. bundle_version = request_dict.get('bundle_version', '')
  541. pc_version = request_dict.get('pc_version', '')
  542. pc_test = request_dict.get('pc_test', '')
  543. lang = request_dict.get('lang', '')
  544. file_type = request_dict.get('file_type', '')
  545. package = request_dict.get('package', '')
  546. explain = request_dict.get('explain', '')
  547. is_update = request_dict.get('is_update', '')
  548. is_open = request_dict.get('is_open', '')
  549. content = request_dict.get('content', '')
  550. authority = request_dict.get('authority', '')
  551. download_link = request_dict.get('download_link', '')
  552. if not pc_info_id:
  553. return response.json(444)
  554. try:
  555. pc_info_qs = Pc_Info.objects.filter(id=pc_info_id)
  556. if not pc_info_qs.exists():
  557. return response.json(173)
  558. data_dict = {
  559. 'pc_name': pc_name,
  560. 'bundle_version': bundle_version,
  561. 'pc_version': pc_version,
  562. 'pc_test': pc_test,
  563. 'lang': lang,
  564. 'file_type': file_type,
  565. 'package': package,
  566. 'explain': explain,
  567. 'is_update': is_update,
  568. 'is_open': is_open,
  569. 'content': content,
  570. 'authority': authority,
  571. 'download_link': download_link,
  572. }
  573. pc_info_qs.update(**data_dict)
  574. return response.json(0)
  575. except Exception as e:
  576. print(e)
  577. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  578. def deletePcInfo(self, request_dict, response):
  579. print('request_dict:', request_dict)
  580. pc_info_id = request_dict.get('id', None)
  581. try:
  582. if not pc_info_id:
  583. return response.json(444)
  584. pc_info_qs = Pc_Info.objects.filter(id=pc_info_id)
  585. if not pc_info_qs.exists():
  586. return response.json(173)
  587. # 删除存储桶的文件
  588. Key = pc_info_qs.values('download_link')[0]['download_link']
  589. pc_info_qs.delete()
  590. aws_s3_client = boto3.client(
  591. 's3',
  592. region_name='cn-northwest-1',
  593. aws_access_key_id=AWS_ACCESS_KEY_ID[0],
  594. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[0],
  595. config=botocore.client.Config(signature_version='s3v4'),
  596. )
  597. try:
  598. aws_s3_client.delete_object(Bucket='pc-package', Key=Key)
  599. finally:
  600. return response.json(0)
  601. except Exception as e:
  602. print(e)
  603. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  604. def getCountryList(self, request_dict, response):
  605. try:
  606. country_qs = CountryModel.objects.all().values_list('country_name', flat=True)
  607. return response.json(0, list(country_qs))
  608. except Exception as e:
  609. print(e)
  610. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  611. def getCityList(self, request_dict, response):
  612. try:
  613. city_qs = CNRegion.objects.filter(level=2).values_list('name', flat=True)
  614. return response.json(0, list(city_qs))
  615. except Exception as e:
  616. print(e)
  617. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  618. @classmethod
  619. def device_auto_update(cls, user_id, request_dict, response):
  620. verId = request_dict.get('verId', None)
  621. if not verId:
  622. return response.json(444)
  623. LOGGER.info(f'版本ID:{verId},操作用户{user_id}')
  624. version_qs = Equipment_Version.objects.filter(eid=verId, auto_update=True, status=1)
  625. if not version_qs.exists():
  626. return response.json(173)
  627. agent_thread = threading.Thread(target=VersionManagement().device_async_update,
  628. args=version_qs)
  629. agent_thread.start()
  630. return response.json(0)
  631. @staticmethod
  632. def device_async_update(version_qs):
  633. code = version_qs.code
  634. version = version_qs.softwareVersion
  635. ver_data = version_qs.data_json
  636. uid_set_qs = UidSetModel.objects.filter(ucode=code).exclude(version=version) \
  637. .values('uid', 'ip', 'version')
  638. LOGGER.info(f'通知设备自动升级查询符合数量{uid_set_qs.count()}')
  639. if not uid_set_qs.exists():
  640. return
  641. # 创建分页器,每页100条数据
  642. paginator = Paginator(uid_set_qs, 100)
  643. # 遍历每一页数据
  644. for page_num in range(1, paginator.num_pages + 1):
  645. # 获取当前页的数据
  646. page_data = paginator.page(page_num)
  647. # 遍历当前页的每一条数据
  648. for data in page_data:
  649. uid = data['uid']
  650. result = VersionManagement.check_version_auto_update(uid, '', ver_data)
  651. if not result:
  652. continue
  653. serial_number = CommonService.get_serial_number_by_uid(uid)
  654. now_ver = data['version']
  655. LOGGER.info(f'uid={uid},ucode={code},当前版本{now_ver},最新版本{version}')
  656. VersionManagement.send_auto_update_url(version_qs, uid, serial_number, code, now_ver)
  657. @classmethod
  658. def check_version_auto_update(cls, uid, user_id, ver_data):
  659. """
  660. :param uid: 设备UID
  661. :param user_id: 用户id
  662. :param ver_data: 版本指定升级数据
  663. :return: True | False
  664. """
  665. try:
  666. if not ver_data: # 过滤值默认当前版本所有设备自动升级
  667. return True
  668. if uid and ver_data['uid_list']: # 当前版本指定UID
  669. return uid in ver_data['uid_list']
  670. if user_id and ver_data['country_list'] and CONFIG_INFO not in [CONFIG_CN, CONFIG_TEST]: # 当前版本指定用户国家
  671. user_qs = Device_User.objects.filter(userID=user_id).values('region_country')
  672. if not user_qs.exists(): # 用户不存在不升级
  673. return False
  674. if user_qs[0]['region_country'] == 0: # 用户未选择国家 不进行升级提示
  675. return False
  676. return user_qs[0]['region_country'] in ver_data['country_list']
  677. if CONFIG_INFO in [CONFIG_CN, CONFIG_TEST] and ver_data['addr']: # 中国区可指定城市
  678. city_list = ver_data['addr']['city_list']
  679. if not city_list:
  680. return True
  681. uid_set_qs = UidSetModel.objects.filter(uid=uid).values('ip')
  682. if not uid_set_qs:
  683. return False
  684. ip_qs = IPAddr.objects.filter(ip=uid_set_qs[0]['ip']).values('city').order_by('-id')
  685. if not ip_qs:
  686. return False
  687. return ip_qs[0]['city'] in city_list
  688. return False
  689. except Exception as e:
  690. LOGGER.error(f'检测是否符合自动升级{repr(e)}')
  691. return False
  692. @staticmethod
  693. def send_auto_update_url(version_qs, uid, serial_number, code, now_ver):
  694. """
  695. 发送自动升级URL
  696. @param version_qs: 最新版本querySet
  697. @param uid: 设备UID
  698. @param serial_number: 设备序列号
  699. @param code: 设备规格码
  700. @param now_ver: 设备当前版本好
  701. @return:
  702. """
  703. try:
  704. file_path = version_qs.filePath
  705. version = version_qs.version
  706. mci = version_qs.mci
  707. ver = version_qs.softwareVersion
  708. max_ver = version_qs.max_ver
  709. if ver <= max_ver:
  710. user_qs = Device_Info.objects.filter(UID=uid, isShare=False).values('userID_id')
  711. if not user_qs.exists():
  712. return False
  713. user_id = user_qs[0]['userID_id']
  714. # 创建url的token
  715. param_url = "ansjer/" + CommonService.RandomStr(6) + "/" + file_path
  716. data = {'Url': param_url, 'user_id': user_id,
  717. 'uid': uid, 'serial_number': serial_number, 'old_version': "V" + now_ver + "." + code,
  718. 'new_version': version, 'mci': mci}
  719. device_info_value = json.dumps(data)
  720. expire = 600
  721. str_uuid = str(user_id)
  722. if serial_number and serial_number != 'null':
  723. str_uuid += serial_number
  724. elif uid and uid != 'null':
  725. str_uuid += uid
  726. str_uuid += now_ver
  727. device_info_key = 'ASJ:SERVER:VERSION:{}'.format(str_uuid)
  728. LOGGER.info('缓存key={}'.format(device_info_key))
  729. redisObject = RedisObject()
  730. redisObject.set_data(device_info_key, device_info_value, expire)
  731. url_tko = UrlTokenObject()
  732. file_path = url_tko.generate(data={'uid': str_uuid})
  733. url = SERVER_DOMAIN + 'dlotapack/' + file_path
  734. # 主题名称
  735. topic_name = f'ansjer/generic/{serial_number}'
  736. # 发布消息内容
  737. msg = {"commandCode": 1, "data": {"url": url}}
  738. result = CommonService.req_publish_mqtt_msg(serial_number, topic_name, msg)
  739. LOGGER.info(f'uid={uid}发送数据msg={msg},发送MQTT结果={result}')
  740. except Exception as e:
  741. LOGGER.error(f'自动升级异常{repr(e)}')