EquipmentOTA.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. import os
  2. import base64
  3. import simplejson as json
  4. import time
  5. from django.utils import timezone
  6. from django.utils.decorators import method_decorator
  7. from django.views.decorators.csrf import csrf_exempt
  8. from django.views.generic.base import View
  9. from Ansjer.config import BASE_DIR, SERVER_DOMAIN
  10. from Model.models import Equipment_Version
  11. from Object.ResponseObject import ResponseObject
  12. from Object.TokenObject import TokenObject
  13. from Object.UrlTokenObject import UrlTokenObject
  14. from Service.CommonService import CommonService
  15. from Service.ModelService import ModelService
  16. from var_dump import var_dump
  17. '''
  18. http://192.168.136.45:8077/equipment/OTA?token=test&operation=query&page=1&line=10
  19. http://192.168.136.45:8077/equipment/OTA?token=test&operation=find&page=1&line=10&content={}
  20. http://192.168.136.40:8077/equipment/OTA?eid=138001524641441203480138000&token=test&operation=delete
  21. http://192.168.136.40:8077/equipment/OTA?eid=138001524641441203480138000&token=test&operation=update&status=1
  22. https://cdna.artstation.com/p/assets/images/images/004/727/674/large/daniel-dociu-snowcavels.jpg?1485828233&dl=1
  23. https://cdna.artstation.com/p/assets/images/images/004/693/910/large/daniel-dociu-smoothsailing.jpg?1485560128&dl=1
  24. '''
  25. class EquipmentOTA(View):
  26. @method_decorator(csrf_exempt)
  27. def dispatch(self, *args, **kwargs):
  28. return super(EquipmentOTA, self).dispatch(*args, **kwargs)
  29. def get(self, request, *args, **kwargs):
  30. request.encoding = 'utf-8'
  31. return self.validation(request_dict=request.GET)
  32. def post(self, request, *args, **kwargs):
  33. request.encoding = 'utf-8'
  34. return self.validation(request_dict=request.POST)
  35. def validation(self, request_dict, *args, **kwargs):
  36. token = request_dict.get('token', None)
  37. response = ResponseObject()
  38. if token is None:
  39. return response.json(309)
  40. tko = TokenObject(token)
  41. response.lang = tko.lang
  42. if tko.code != 0:
  43. return response.json(tko.code)
  44. userID = tko.userID
  45. if userID is None:
  46. return response.json(309)
  47. operation = request_dict.get('operation', None)
  48. if operation == 'delete':
  49. return self.delete(request_dict, userID, response)
  50. elif operation == 'query':
  51. return self.query(request_dict, userID, response)
  52. elif operation == 'find':
  53. return self.find(request_dict, userID, response)
  54. elif operation == 'update':
  55. return self.update(request_dict, userID, response)
  56. else:
  57. return response.json(444, 'operation')
  58. def delete(self, request_dict, userID, response):
  59. eid = request_dict.get('eid', None)
  60. if not eid:
  61. return response.json(444, 'eid')
  62. own_perm = ModelService.check_perm(userID=userID, permID=230)
  63. if not own_perm:
  64. return response.json(404)
  65. ev = Equipment_Version.objects.filter(eid=eid)
  66. if not ev.exists():
  67. return response.json(173)
  68. try:
  69. has_ev = Equipment_Version.objects.filter(filePath=ev[0].filePath)
  70. if has_ev.exists():
  71. pass
  72. else:
  73. filepath = os.path.join(BASE_DIR, ev[0].filePath)
  74. os.remove(filepath)
  75. ev.delete()
  76. except Exception as e:
  77. return response.json(176, repr(e))
  78. else:
  79. return response.json(0)
  80. def query(self, request_dict, userID, response):
  81. page = int(request_dict.get('page', None))
  82. line = int(request_dict.get('line', None))
  83. lang = request_dict.get('lang', None)
  84. if page is None or line is None:
  85. return response.json(444, 'page,line')
  86. own_permission = ModelService.check_perm(userID=userID, permID=240)
  87. if own_permission is not True:
  88. return response.json(404)
  89. if lang is None:
  90. qs = Equipment_Version.objects.all().order_by('-data_joined')
  91. else:
  92. qs = Equipment_Version.objects.filter(lang=lang).order_by('-data_joined')
  93. if qs.exists():
  94. count = qs.count()
  95. res = qs[(page - 1) * line:page * line]
  96. send_json = CommonService.qs_to_dict(res)
  97. send_json['count'] = count
  98. return response.json(0, send_json)
  99. return response.json(0)
  100. def find(self, request_dict, userID, response):
  101. page = int(request_dict.get('page', None))
  102. line = int(request_dict.get('line', None))
  103. content = request_dict.get('content', None)
  104. if page is None or line is None or content is None:
  105. return response.json(444)
  106. own_permission = ModelService.check_perm(userID=userID, permID=250)
  107. if own_permission is not True:
  108. return response.json(404)
  109. content = json.loads(content)
  110. search_kwargs = CommonService.get_kwargs(data=content)
  111. qs = Equipment_Version.objects.filter(**search_kwargs)
  112. if not qs.exists():
  113. return response.json(0, [])
  114. count = qs.count()
  115. res = qs[(page - 1) * line:page * line]
  116. send_json = CommonService.qs_to_dict(res)
  117. send_json['count'] = count
  118. return response.json(0, send_json)
  119. def update(self, request_dict, userID, response):
  120. eid = request_dict.get('eid', None)
  121. if eid is None:
  122. return response.json(444, 'eid')
  123. own_permission = ModelService.check_perm(userID=userID, permID=230)
  124. if own_permission is not True:
  125. return response.json(404)
  126. ev = Equipment_Version.objects.filter(eid=eid)
  127. if not ev.exists():
  128. return response.json(10, 'ev none')
  129. status = request_dict.get('status', None)
  130. try:
  131. update_time = timezone.localtime(timezone.now())
  132. ev.update(status=status, update_time=update_time)
  133. except Exception as e:
  134. print(repr(e))
  135. pass
  136. else:
  137. return response.json(0, {'update_time': str(update_time)})
  138. class EquipmentVersionView(View):
  139. def get(self, request, *args, **kwargs):
  140. request.encoding = 'utf-8'
  141. operation = kwargs.get('operation')
  142. return self.validation(request.GET, operation, request)
  143. def post(self, request, *args, **kwargs):
  144. request.encoding = 'utf-8'
  145. operation = kwargs.get('operation')
  146. return self.validation(request.POST, operation, request)
  147. def validation(self, request_dict, operation, request):
  148. response = ResponseObject()
  149. if operation is None:
  150. return response.json(444, 'error path')
  151. elif operation == 'checkVer':
  152. return self.do_check_value(request_dict, response)
  153. # return self.do_check_ver(request_dict, response)
  154. token = request_dict.get('token', None)
  155. # 设备主键uid
  156. tko = TokenObject(token)
  157. response.lang = tko.lang
  158. if tko.code != 0:
  159. return response.json(tko.code)
  160. userID = tko.userID
  161. own_perm = ModelService.check_perm(userID, 240)
  162. if own_perm is False:
  163. return response.json(404)
  164. if operation == 'query':
  165. return self.do_query(request_dict, response)
  166. if operation == 'update':
  167. return self.do_update(request_dict, response, request)
  168. if operation == 'filter':
  169. return self.do_filter(request_dict, response)
  170. else:
  171. return response.json(444, 'error path')
  172. def do_update(self, request_dict, response, request):
  173. code = request_dict.get('code', None)
  174. status = request_dict.get('status', None)
  175. lang = request_dict.get('lang', None)
  176. max_ver = request_dict.get('max_ver', None)
  177. file_s = request.FILES.get('file', None)
  178. paths = 'static/versions/image'
  179. if not os.path.exists(paths):
  180. os.makedirs(paths) # makedirs 创建文件时如果路径不存在会创建这个路径
  181. # print ('该文件不存在')
  182. else:
  183. print('该文件存在')
  184. ev = Equipment_Version.objects.filter(code=code, lang=lang)
  185. if file_s is None:
  186. rv_path = 'static/versions/image/' + code + '.png'
  187. img = SERVER_DOMAIN + 'sysfile/' + rv_path
  188. else:
  189. rv_path = 'static/versions/image/' + code + '.png'
  190. try:
  191. as_path = os.path.join(BASE_DIR, rv_path)
  192. if os.path.exists(as_path):
  193. os.remove(as_path)
  194. with open(as_path, 'wb+') as destination:
  195. for chunk in file_s.chunks():
  196. destination.write(chunk)
  197. except Exception as e:
  198. pass
  199. else:
  200. img = SERVER_DOMAIN + 'sysfile/' + rv_path
  201. if code is not None:
  202. if ev.exists():
  203. try:
  204. update_time = timezone.localtime(timezone.now())
  205. update_dict = {
  206. 'status': status,
  207. 'img': img,
  208. 'update_time': update_time
  209. }
  210. if max_ver:
  211. update_dict['max_ver'] = max_ver
  212. ev.update(**update_dict)
  213. except Exception as e:
  214. return response.json(404, repr(e))
  215. else:
  216. return response.json(0, {'update_time': str(update_time), 'img': img})
  217. else:
  218. return response.json(173)
  219. else:
  220. return response.json(444, 'code')
  221. def do_check_ver(self, request_dict, response):
  222. code = request_dict.get('code', None)
  223. ov = request_dict.get('ov', None)
  224. uid = request_dict.get('uid', '')
  225. if not code:
  226. return response.json(444, 'code')
  227. eqs = Equipment_Version.objects.filter(code=uid, status=1, lang='en').order_by('-data_joined')
  228. if not eqs.exclude():
  229. eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  230. if not eqs.exists():
  231. return response.json(900)
  232. if ov is not None:
  233. # 判断大小
  234. if ov > eqs[0].softwareVersion:
  235. return response.json(0, {'softwareVersion': ov})
  236. file_path = eqs[0].filePath
  237. if file_path.find('static/Upgrade/') != -1:
  238. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  239. url = SERVER_DOMAIN + 'OTA/downloads/' + path + '?time=' + str(time.time())
  240. elif file_path.find('static/otapack') != -1:
  241. url = SERVER_DOMAIN + 'OTA/downloadsPack/' + file_path + '?time=' + str(time.time())
  242. # url = SERVER_DOMAIN + 'dl/otaPack/' + file_path + '?time=' + str(time.time())
  243. else:
  244. return response.json(900, '2')
  245. res = {
  246. "url": url,
  247. "fileSize": eqs[0].fileSize,
  248. "Description": eqs[0].Description,
  249. "softwareVersion": eqs[0].softwareVersion
  250. }
  251. return response.json(0, res)
  252. # 修改加密的路径
  253. def do_check_value(self, request_dict, response):
  254. code = request_dict.get('code', None)
  255. ov = request_dict.get('ov', None)
  256. uid = request_dict.get('uid', '')
  257. if not code:
  258. return response.json(444, 'code')
  259. eqs = Equipment_Version.objects.filter(code=uid, status=1, lang='en').order_by('-data_joined')
  260. if not eqs.exclude():
  261. eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  262. if not eqs.exists():
  263. return response.json(900)
  264. if ov is not None:
  265. # 判断大小
  266. if ov > eqs[0].softwareVersion:
  267. return response.json(0, {'softwareVersion': ov})
  268. file_path = eqs[0].filePath
  269. if file_path.find('static/Upgrade/') != -1:
  270. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  271. # 创建url的token
  272. tko = UrlTokenObject()
  273. path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  274. url = SERVER_DOMAIN + 'OTA/downloads/' + path
  275. elif file_path.find('static/otapack') != -1:
  276. file_path = file_path
  277. # 创建url的token
  278. tko = UrlTokenObject()
  279. file_path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  280. url = SERVER_DOMAIN + 'dlotapack/' + file_path
  281. else:
  282. return response.json(900, '2')
  283. # http: // 192.168.136.39:8000 / EquipmentVersion / checkVer?code = 20D20410010
  284. res = {
  285. "url": url,
  286. "fileSize": eqs[0].fileSize,
  287. "Description": eqs[0].Description,
  288. "softwareVersion": eqs[0].softwareVersion
  289. }
  290. print(url)
  291. return response.json(0, res)
  292. def do_query(self, request_dict, response):
  293. mci = request_dict.get('mci', None)
  294. page = request_dict.get('page', None)
  295. line = request_dict.get('line', None)
  296. code = request_dict.get('code', None)
  297. if not page or not line:
  298. return response.json(444, 'page,line')
  299. else:
  300. page = int(page)
  301. line = int(line)
  302. cv_qs = Equipment_Version.objects
  303. if mci is not None:
  304. cv_qs = cv_qs.filter(mci=mci)
  305. if code is not None:
  306. cv_qs = cv_qs.filter(code__contains=code)
  307. cv_qs = cv_qs.order_by('code').values_list('code', flat=True).distinct()
  308. print(cv_qs)
  309. count = cv_qs.count()
  310. cv_qs = list(cv_qs[(page - 1) * line:page * line])
  311. # return response.json(0, cv_qs)
  312. ev_qs = Equipment_Version.objects.filter(code__in=list(cv_qs)).values()
  313. ev_list = CommonService.qs_to_list(ev_qs)
  314. datas = {}
  315. # 组装数据
  316. for ev in ev_list:
  317. for code in cv_qs:
  318. if code not in datas.keys():
  319. datas[code] = []
  320. if code == ev['code']:
  321. datas[code].append(ev)
  322. res = {
  323. 'datas': datas,
  324. 'count': count
  325. }
  326. return response.json(0, res)
  327. def do_filter(self, request_dict, response):
  328. mci = request_dict.get('mci', None)
  329. page = request_dict.get('page', None)
  330. line = request_dict.get('line', None)
  331. code = request_dict.get('code', None)
  332. lang = request_dict.get('lang', None)
  333. if not page or not line:
  334. return response.json(444, 'page,line')
  335. else:
  336. page = int(page)
  337. line = int(line)
  338. ev_qs = Equipment_Version.objects
  339. if mci:
  340. ev_qs = ev_qs.filter(mci=mci)
  341. if code:
  342. ev_qs = ev_qs.filter(code__contains=code)
  343. if lang:
  344. ev_qs = ev_qs.filter(lang=lang)
  345. count = ev_qs.count()
  346. ev_qs = ev_qs[(page - 1) * line:page * line].values()
  347. ev_ls = CommonService.qs_to_list(ev_qs)
  348. res = {
  349. 'datas': ev_ls,
  350. 'count': count
  351. }
  352. return response.json(0, res)