EquipmentOTA.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  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. file_s = request.FILES.get('file', None)
  177. paths = 'static/versions/image'
  178. if not os.path.exists(paths):
  179. os.makedirs(paths) # makedirs 创建文件时如果路径不存在会创建这个路径
  180. # print ('该文件不存在')
  181. else:
  182. print ('该文件存在')
  183. ev = Equipment_Version.objects.filter(code=code, lang=lang)
  184. if file_s is None:
  185. rv_path = 'static/versions/image/' + code + '.png'
  186. img = SERVER_DOMAIN + 'sysfile/' + rv_path
  187. else:
  188. rv_path = 'static/versions/image/' + code + '.png'
  189. try:
  190. as_path = os.path.join(BASE_DIR, rv_path)
  191. if os.path.exists(as_path):
  192. os.remove(as_path)
  193. with open(as_path, 'wb+') as destination:
  194. for chunk in file_s.chunks():
  195. destination.write(chunk)
  196. except Exception as e:
  197. pass
  198. else:
  199. img= SERVER_DOMAIN + 'sysfile/' + rv_path
  200. if code is not None:
  201. if ev.exists():
  202. try:
  203. update_time = timezone.localtime(timezone.now())
  204. ev.update(status=status,img=img, update_time=update_time)
  205. except Exception as e:
  206. return response.json(404, repr(e))
  207. else:
  208. return response.json(0, {'update_time': str(update_time),'img':img})
  209. else:
  210. return response.json(173)
  211. else:
  212. return response.json(444, 'code')
  213. def do_check_ver(self, request_dict, response):
  214. code = request_dict.get('code', None)
  215. ov = request_dict.get('ov', None)
  216. uid = request_dict.get('uid', '')
  217. if not code:
  218. return response.json(444, 'code')
  219. eqs = Equipment_Version.objects.filter(code=uid, status=1, lang='en').order_by('-data_joined')
  220. if not eqs.exclude():
  221. eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  222. if not eqs.exists():
  223. return response.json(900)
  224. if ov is not None:
  225. # 判断大小
  226. if ov > eqs[0].softwareVersion:
  227. return response.json(0, {'softwareVersion': ov})
  228. file_path = eqs[0].filePath
  229. if file_path.find('static/Upgrade/') != -1:
  230. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  231. url = SERVER_DOMAIN + 'OTA/downloads/' + path + '?time=' + str(time.time())
  232. elif file_path.find('static/otapack') != -1:
  233. url = SERVER_DOMAIN + 'OTA/downloadsPack/' + file_path + '?time=' + str(time.time())
  234. # url = SERVER_DOMAIN + 'dl/otaPack/' + file_path + '?time=' + str(time.time())
  235. else:
  236. return response.json(900, '2')
  237. res = {
  238. "url": url,
  239. "fileSize": eqs[0].fileSize,
  240. "Description": eqs[0].Description,
  241. "softwareVersion": eqs[0].softwareVersion
  242. }
  243. return response.json(0, res)
  244. # 修改加密的路径
  245. def do_check_value(self, request_dict, response):
  246. code = request_dict.get('code', None)
  247. ov = request_dict.get('ov', None)
  248. uid = request_dict.get('uid', '')
  249. if not code:
  250. return response.json(444, 'code')
  251. eqs = Equipment_Version.objects.filter(code=uid, status=1, lang='en').order_by('-data_joined')
  252. if not eqs.exclude():
  253. eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  254. if not eqs.exists():
  255. return response.json(900)
  256. if ov is not None:
  257. # 判断大小
  258. if ov > eqs[0].softwareVersion:
  259. return response.json(0, {'softwareVersion': ov})
  260. file_path = eqs[0].filePath
  261. if file_path.find('static/Upgrade/') != -1:
  262. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  263. # 创建url的token
  264. tko = UrlTokenObject()
  265. path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  266. url = SERVER_DOMAIN + 'OTA/downloads/' + path
  267. elif file_path.find('static/otapack') != -1:
  268. file_path = file_path
  269. # 创建url的token
  270. tko = UrlTokenObject()
  271. file_path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  272. url = SERVER_DOMAIN + 'dlotapack/' + file_path
  273. else:
  274. return response.json(900, '2')
  275. # http: // 192.168.136.39:8000 / EquipmentVersion / checkVer?code = 20D20410010
  276. res = {
  277. "url": url,
  278. "fileSize": eqs[0].fileSize,
  279. "Description": eqs[0].Description,
  280. "softwareVersion": eqs[0].softwareVersion
  281. }
  282. print(url)
  283. return response.json(0, res)
  284. def do_query(self, request_dict, response):
  285. mci = request_dict.get('mci', None)
  286. page = request_dict.get('page', None)
  287. line = request_dict.get('line', None)
  288. code = request_dict.get('code', None)
  289. if not page or not line:
  290. return response.json(444, 'page,line')
  291. else:
  292. page = int(page)
  293. line = int(line)
  294. cv_qs = Equipment_Version.objects
  295. if mci is not None:
  296. cv_qs = cv_qs.filter(mci=mci)
  297. if code is not None:
  298. cv_qs = cv_qs.filter(code__contains=code)
  299. cv_qs = cv_qs.order_by('code').values_list('code', flat=True).distinct()
  300. print(cv_qs)
  301. count = cv_qs.count()
  302. cv_qs = list(cv_qs[(page - 1) * line:page * line])
  303. # return response.json(0, cv_qs)
  304. ev_qs = Equipment_Version.objects.filter(code__in=list(cv_qs)).values()
  305. ev_list = CommonService.qs_to_list(ev_qs)
  306. datas = {}
  307. # 组装数据
  308. for ev in ev_list:
  309. for code in cv_qs:
  310. if code not in datas.keys():
  311. datas[code] = []
  312. if code == ev['code']:
  313. datas[code].append(ev)
  314. res = {
  315. 'datas': datas,
  316. 'count': count
  317. }
  318. return response.json(0, res)
  319. def do_filter(self, request_dict, response):
  320. mci = request_dict.get('mci', None)
  321. page = request_dict.get('page', None)
  322. line = request_dict.get('line', None)
  323. code = request_dict.get('code', None)
  324. lang = request_dict.get('lang', None)
  325. if not page or not line:
  326. return response.json(444, 'page,line')
  327. else:
  328. page = int(page)
  329. line = int(line)
  330. ev_qs = Equipment_Version.objects
  331. if mci:
  332. ev_qs = ev_qs.filter(mci=mci)
  333. if code:
  334. ev_qs = ev_qs.filter(code__contains=code)
  335. if lang:
  336. ev_qs = ev_qs.filter(lang=lang)
  337. count = ev_qs.count()
  338. ev_qs = ev_qs[(page - 1) * line:page * line].values()
  339. ev_ls = CommonService.qs_to_list(ev_qs)
  340. res = {
  341. 'datas': ev_ls,
  342. 'count': count
  343. }
  344. return response.json(0, res)