NewVersionController.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import hashlib
  4. import json
  5. import os
  6. import time
  7. import urllib
  8. import uuid
  9. import boto3
  10. import threading
  11. import logging
  12. import xlwt
  13. from boto3.session import Session
  14. from django.http import JsonResponse, HttpResponseRedirect, HttpResponse, StreamingHttpResponse
  15. from django.views.generic.base import View
  16. from Ansjer.config import BASE_DIR, SERVER_DOMAIN
  17. from Model.models import Device_Info, Role, MenuModel, VodBucketModel, CDKcontextModel, Store_Meal, Order_Model, \
  18. UID_Bucket, ExperienceContextModel, Lang, Device_User, CloudLogModel, UidSetModel, Equipment_Version, \
  19. EquipmentVersionLimitModel
  20. from Object.RedisObject import RedisObject
  21. from Object.ResponseObject import ResponseObject
  22. from Object.TokenObject import TokenObject
  23. from Object.UidTokenObject import UidTokenObject
  24. from Object.UrlTokenObject import UrlTokenObject
  25. from Service.CommonService import CommonService
  26. from django.db.models import Q, F
  27. from time import strftime
  28. class NewVersionManagement(View):
  29. def get(self, request, *args, **kwargs):
  30. request.encoding = 'utf-8'
  31. operation = kwargs.get('operation')
  32. return self.validation(request.GET, request, operation)
  33. def post(self, request, *args, **kwargs):
  34. request.encoding = 'utf-8'
  35. operation = kwargs.get('operation')
  36. return self.validation(request.POST, request, operation)
  37. def validation(self, request_dict, request, operation):
  38. language = request_dict.get('language', 'en')
  39. response = ResponseObject(language, 'pc')
  40. tko = TokenObject(
  41. request.META.get('HTTP_AUTHORIZATION'),
  42. returntpye='pc')
  43. if tko.code != 0:
  44. return response.json(tko.code)
  45. response.lang = tko.lang
  46. userID = tko.userID
  47. if operation == 'query':
  48. return self.do_query(request_dict, response)
  49. if operation == 'update':
  50. return self.do_update(request_dict, response, request)
  51. if operation == 'filter':
  52. return self.do_filter(request_dict, response)
  53. else:
  54. return response.json(404)
  55. def do_update(self, request_dict, response, request):
  56. code = request_dict.get('code', None)
  57. status = request_dict.get('status', None)
  58. lang = request_dict.get('lang', None)
  59. max_ver = request_dict.get('max_ver', None)
  60. file_s = request.FILES.get('file', None)
  61. paths = 'static/versions/image'
  62. if not os.path.exists(paths):
  63. os.makedirs(paths) # makedirs 创建文件时如果路径不存在会创建这个路径
  64. # print ('该文件不存在')
  65. else:
  66. print('该文件存在')
  67. ev = Equipment_Version.objects.filter(code=code, lang=lang)
  68. if file_s is None:
  69. rv_path = 'static/versions/image/' + code + '.png'
  70. img = SERVER_DOMAIN + 'sysfile/' + rv_path
  71. else:
  72. rv_path = 'static/versions/image/' + code + '.png'
  73. try:
  74. as_path = os.path.join(BASE_DIR, rv_path)
  75. if os.path.exists(as_path):
  76. os.remove(as_path)
  77. with open(as_path, 'wb+') as destination:
  78. for chunk in file_s.chunks():
  79. destination.write(chunk)
  80. except Exception as e:
  81. pass
  82. else:
  83. img = SERVER_DOMAIN + 'sysfile/' + rv_path
  84. if code is not None:
  85. if ev.exists():
  86. try:
  87. update_time = time.timezone.localtime(time.timezone.now())
  88. update_dict = {
  89. 'status': status,
  90. 'img': img,
  91. 'update_time': update_time
  92. }
  93. if max_ver:
  94. update_dict['max_ver'] = max_ver
  95. ev.update(**update_dict)
  96. except Exception as e:
  97. return response.json(404, repr(e))
  98. else:
  99. return response.json(0, {'update_time': str(update_time), 'img': img})
  100. else:
  101. return response.json(173)
  102. else:
  103. return response.json(444, 'code')
  104. def do_check_ver(self, request_dict, response):
  105. code = request_dict.get('code', None)
  106. ov = request_dict.get('ov', None)
  107. uid = request_dict.get('uid', '')
  108. if not code:
  109. return response.json(444, 'code')
  110. eqs = Equipment_Version.objects.filter(code=uid, status=1, lang='en').order_by('-data_joined')
  111. if not eqs.exclude():
  112. eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  113. if not eqs.exists():
  114. return response.json(900)
  115. if ov is not None:
  116. # 判断大小
  117. if ov > eqs[0].softwareVersion:
  118. return response.json(0, {'softwareVersion': ov})
  119. file_path = eqs[0].filePath
  120. if file_path.find('static/Upgrade/') != -1:
  121. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  122. url = SERVER_DOMAIN + 'OTA/downloads/' + path + '?time=' + str(time.time())
  123. elif file_path.find('static/otapack') != -1:
  124. url = SERVER_DOMAIN + 'OTA/downloadsPack/' + file_path + '?time=' + str(time.time())
  125. # url = SERVER_DOMAIN + 'dl/otaPack/' + file_path + '?time=' + str(time.time())
  126. else:
  127. return response.json(900, '2')
  128. res = {
  129. "url": url,
  130. "fileSize": eqs[0].fileSize,
  131. "Description": eqs[0].Description,
  132. "softwareVersion": eqs[0].softwareVersion
  133. }
  134. return response.json(0, res)
  135. # 修改加密的路径
  136. def do_check_value(self, request_dict, response):
  137. code = request_dict.get('code', None)
  138. ov = request_dict.get('ov', None)
  139. uid = request_dict.get('uid', '')
  140. if not code:
  141. return response.json(444, 'code')
  142. eqs = Equipment_Version.objects.filter(code=uid, status=1, lang='en').order_by('-data_joined')
  143. if not eqs.exclude():
  144. eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  145. if not eqs.exists():
  146. return response.json(900)
  147. if ov is not None:
  148. # 判断大小
  149. if ov > eqs[0].softwareVersion:
  150. return response.json(0, {'softwareVersion': ov})
  151. equipment = eqs[0]
  152. redisObject = RedisObject()
  153. key = 'limit_{eid}'.format(eid=equipment.eid)
  154. evl_qs = redisObject.get_data(key=key)
  155. if evl_qs:
  156. evl_qs = json.loads(evl_qs)
  157. else:
  158. evl_qs = EquipmentVersionLimitModel.objects.filter(equipment_version_id=equipment.eid,
  159. status=1).values()
  160. if evl_qs.exists():
  161. redisObject.set_data(key=key, val=json.dumps(list(evl_qs.values())), expire=600)
  162. if evl_qs and len(evl_qs) > 0:
  163. evl = evl_qs[0]
  164. if evl['type'] == 1: # uid限制
  165. uids = json.loads(evl['content'])
  166. if not uids.__contains__(uid):
  167. return response.json(902)
  168. file_path = eqs[0].filePath
  169. if file_path.find('static/Upgrade/') != -1:
  170. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  171. # 创建url的token
  172. tko = UrlTokenObject()
  173. path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  174. url = SERVER_DOMAIN + 'OTA/downloads/' + path
  175. elif file_path.find('static/otapack') != -1:
  176. file_path = file_path
  177. # 创建url的token
  178. tko = UrlTokenObject()
  179. file_path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  180. url = SERVER_DOMAIN + 'dlotapack/' + file_path
  181. else:
  182. return response.json(900, '2')
  183. # http: // 192.168.136.39:8000 / EquipmentVersion / checkVer?code = 20D20410010
  184. res = {
  185. "url": url,
  186. "fileSize": eqs[0].fileSize,
  187. "Description": eqs[0].Description,
  188. "softwareVersion": eqs[0].softwareVersion
  189. }
  190. print(url)
  191. return response.json(0, res)
  192. def do_query(self, request_dict, response):
  193. mci = request_dict.get('mci', None)
  194. page = request_dict.get('page', None)
  195. line = request_dict.get('line', None)
  196. code = request_dict.get('code', None)
  197. if not page or not line:
  198. return response.json(444, 'page,line')
  199. else:
  200. page = int(page)
  201. line = int(line)
  202. cv_qs = Equipment_Version.objects
  203. if mci is not None:
  204. cv_qs = cv_qs.filter(mci=mci)
  205. if code is not None:
  206. cv_qs = cv_qs.filter(code__contains=code)
  207. cv_qs = cv_qs.order_by('code').values_list('code', flat=True).distinct()
  208. print(cv_qs)
  209. count = cv_qs.count()
  210. cv_qs = list(cv_qs[(page - 1) * line:page * line])
  211. # return response.json(0, cv_qs)
  212. ev_qs = Equipment_Version.objects.filter(code__in=list(cv_qs)).values()
  213. ev_list = CommonService.qs_to_list(ev_qs)
  214. datas = {}
  215. # 组装数据
  216. for ev in ev_list:
  217. for code in cv_qs:
  218. if code not in datas.keys():
  219. datas[code] = []
  220. if code == ev['code']:
  221. datas[code].append(ev)
  222. res = {
  223. 'datas': datas,
  224. 'count': count
  225. }
  226. return response.json(0, res)
  227. def do_filter(self, request_dict, response):
  228. mci = request_dict.get('mci', None)
  229. page = request_dict.get('page', None)
  230. line = request_dict.get('line', None)
  231. code = request_dict.get('code', None)
  232. lang = request_dict.get('lang', None)
  233. if not page or not line:
  234. return response.json(444, 'page,line')
  235. else:
  236. page = int(page)
  237. line = int(line)
  238. ev_qs = Equipment_Version.objects
  239. if mci:
  240. ev_qs = ev_qs.filter(mci=mci)
  241. if code:
  242. ev_qs = ev_qs.filter(code__contains=code)
  243. if lang:
  244. if lang == 'cn' or lang == 'zh-Hans':
  245. ev_qs = ev_qs.filter(Q(lang='cn') | Q(lang='zh-Hans'))
  246. else:
  247. ev_qs = ev_qs.filter(lang=lang)
  248. count = ev_qs.count()
  249. ev_qs = ev_qs[(page - 1) * line:page * line].values()
  250. ev_ls = CommonService.qs_to_list(ev_qs)
  251. res = {
  252. 'datas': ev_ls,
  253. 'count': count
  254. }
  255. return response.json(0, res)