EquipmentOTA.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  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. '''
  23. class EquipmentOTA(View):
  24. @method_decorator(csrf_exempt)
  25. def dispatch(self, *args, **kwargs):
  26. return super(EquipmentOTA, self).dispatch(*args, **kwargs)
  27. def get(self, request, *args, **kwargs):
  28. request.encoding = 'utf-8'
  29. return self.validation(request_dict=request.GET)
  30. def post(self, request, *args, **kwargs):
  31. request.encoding = 'utf-8'
  32. return self.validation(request_dict=request.POST)
  33. def validation(self, request_dict, *args, **kwargs):
  34. token = request_dict.get('token', None)
  35. response = ResponseObject()
  36. if token is None:
  37. return response.json(309)
  38. tko = TokenObject(token)
  39. response.lang = tko.lang
  40. if tko.code != 0:
  41. return response.json(tko.code)
  42. userID = tko.userID
  43. if userID is None:
  44. return response.json(309)
  45. operation = request_dict.get('operation', None)
  46. if operation == 'delete':
  47. return self.delete(request_dict, userID, response)
  48. elif operation == 'query':
  49. return self.query(request_dict, userID, response)
  50. elif operation == 'find':
  51. return self.find(request_dict, userID, response)
  52. elif operation == 'update':
  53. return self.update(request_dict, userID, response)
  54. else:
  55. return response.json(444, 'operation')
  56. def delete(self, request_dict, userID, response):
  57. eid = request_dict.get('eid', None)
  58. if not eid:
  59. return response.json(444, 'eid')
  60. own_perm = ModelService.check_perm(userID=userID, permID=230)
  61. if not own_perm:
  62. return response.json(404)
  63. ev = Equipment_Version.objects.filter(eid=eid)
  64. if not ev.exists():
  65. return response.json(173)
  66. try:
  67. has_ev = Equipment_Version.objects.filter(filePath=ev[0].filePath)
  68. if has_ev.exists():
  69. pass
  70. else:
  71. filepath = os.path.join(BASE_DIR, ev[0].filePath)
  72. os.remove(filepath)
  73. ev.delete()
  74. except Exception as e:
  75. return response.json(176, repr(e))
  76. else:
  77. return response.json(0)
  78. def query(self, request_dict, userID, response):
  79. page = int(request_dict.get('page', None))
  80. line = int(request_dict.get('line', None))
  81. lang = request_dict.get('lang', None)
  82. if page is None or line is None:
  83. return response.json(444, 'page,line')
  84. own_permission = ModelService.check_perm(userID=userID, permID=240)
  85. if own_permission is not True:
  86. return response.json(404)
  87. if lang is None:
  88. qs = Equipment_Version.objects.all().order_by('-data_joined')
  89. else:
  90. qs = Equipment_Version.objects.filter(lang=lang).order_by('-data_joined')
  91. if qs.exists():
  92. count = qs.count()
  93. res = qs[(page - 1) * line:page * line]
  94. send_json = CommonService.qs_to_dict(res)
  95. send_json['count'] = count
  96. return response.json(0, send_json)
  97. return response.json(0)
  98. def find(self, request_dict, userID, response):
  99. page = int(request_dict.get('page', None))
  100. line = int(request_dict.get('line', None))
  101. content = request_dict.get('content', None)
  102. if page is None or line is None or content is None:
  103. return response.json(444)
  104. own_permission = ModelService.check_perm(userID=userID, permID=250)
  105. if own_permission is not True:
  106. return response.json(404)
  107. content = json.loads(content)
  108. search_kwargs = CommonService.get_kwargs(data=content)
  109. qs = Equipment_Version.objects.filter(**search_kwargs)
  110. if not qs.exists():
  111. return response.json(0, [])
  112. count = qs.count()
  113. res = qs[(page - 1) * line:page * line]
  114. send_json = CommonService.qs_to_dict(res)
  115. send_json['count'] = count
  116. return response.json(0, send_json)
  117. def update(self, request_dict, userID, response):
  118. eid = request_dict.get('eid', None)
  119. if eid is None:
  120. return response.json(444, 'eid')
  121. own_permission = ModelService.check_perm(userID=userID, permID=230)
  122. if own_permission is not True:
  123. return response.json(404)
  124. ev = Equipment_Version.objects.filter(eid=eid)
  125. if not ev.exists():
  126. return response.json(10, 'ev none')
  127. status = request_dict.get('status', None)
  128. try:
  129. update_time = timezone.localtime(timezone.now())
  130. ev.update(status=status, update_time=update_time)
  131. except Exception as e:
  132. print(repr(e))
  133. pass
  134. else:
  135. return response.json(0, {'update_time': str(update_time)})
  136. class EquipmentVersionView(View):
  137. def get(self, request, *args, **kwargs):
  138. request.encoding = 'utf-8'
  139. operation = kwargs.get('operation')
  140. return self.validation(request.GET, operation)
  141. def post(self, request, *args, **kwargs):
  142. request.encoding = 'utf-8'
  143. operation = kwargs.get('operation')
  144. return self.validation(request.POST, operation)
  145. def validation(self, request_dict, operation):
  146. response = ResponseObject()
  147. if operation is None:
  148. return response.json(444, 'error path')
  149. elif operation == 'checkVer':
  150. return self.do_check_value(request_dict, response)
  151. # return self.do_check_ver(request_dict, response)
  152. token = request_dict.get('token', None)
  153. # 设备主键uid
  154. tko = TokenObject(token)
  155. response.lang = tko.lang
  156. if tko.code != 0:
  157. return response.json(tko.code)
  158. userID = tko.userID
  159. own_perm = ModelService.check_perm(userID, 240)
  160. if own_perm is False:
  161. return response.json(404)
  162. if operation == 'query':
  163. return self.do_query(request_dict, response)
  164. if operation == 'update':
  165. return self.do_update(request_dict, response)
  166. if operation == 'filter':
  167. return self.do_filter(request_dict, response)
  168. else:
  169. return response.json(444, 'error path')
  170. def do_update(self, request_dict, response):
  171. code = request_dict.get('code', None)
  172. status = request_dict.get('status', None)
  173. lang = request_dict.get('lang', None)
  174. if code is not None:
  175. ev = Equipment_Version.objects.filter(code=code, lang=lang)
  176. if ev.exists():
  177. try:
  178. update_time = timezone.localtime(timezone.now())
  179. ev.update(status=status, update_time=update_time)
  180. except Exception as e:
  181. return response.json(404, repr(e))
  182. else:
  183. return response.json(0, {'update_time': str(update_time)})
  184. else:
  185. return response.json(173)
  186. else:
  187. return response.json(444, 'code')
  188. def do_check_ver(self, request_dict, response):
  189. code = request_dict.get('code', None)
  190. ov = request_dict.get('ov', None)
  191. uid = request_dict.get('uid', '')
  192. if not code:
  193. return response.json(444, 'code')
  194. eqs = Equipment_Version.objects.filter(code=uid, status=1, lang='en').order_by('-data_joined')
  195. if not eqs.exclude():
  196. eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  197. if not eqs.exists():
  198. return response.json(900)
  199. if ov is not None:
  200. # 判断大小
  201. if ov > eqs[0].softwareVersion:
  202. return response.json(0, {'softwareVersion': ov})
  203. file_path = eqs[0].filePath
  204. if file_path.find('static/Upgrade/') != -1:
  205. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  206. url = SERVER_DOMAIN + 'OTA/downloads/' + path + '?time=' + str(time.time())
  207. elif file_path.find('static/otapack') != -1:
  208. url = SERVER_DOMAIN + 'OTA/downloadsPack/' + file_path + '?time=' + str(time.time())
  209. # url = SERVER_DOMAIN + 'dl/otaPack/' + file_path + '?time=' + str(time.time())
  210. else:
  211. return response.json(900, '2')
  212. res = {
  213. "url": url,
  214. "fileSize": eqs[0].fileSize,
  215. "Description": eqs[0].Description,
  216. "softwareVersion": eqs[0].softwareVersion
  217. }
  218. return response.json(0, res)
  219. # 修改加密的路径
  220. def do_check_value(self, request_dict, response):
  221. code = request_dict.get('code', None)
  222. ov = request_dict.get('ov', None)
  223. uid = request_dict.get('uid', '')
  224. if not code:
  225. return response.json(444, 'code')
  226. eqs = Equipment_Version.objects.filter(code=uid, status=1, lang='en').order_by('-data_joined')
  227. if not eqs.exclude():
  228. eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
  229. if not eqs.exists():
  230. return response.json(900)
  231. if ov is not None:
  232. # 判断大小
  233. if ov > eqs[0].softwareVersion:
  234. return response.json(0, {'softwareVersion': ov})
  235. file_path = eqs[0].filePath
  236. if file_path.find('static/Upgrade/') != -1:
  237. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  238. # 创建url的token
  239. tko = UrlTokenObject()
  240. path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  241. url = SERVER_DOMAIN + 'OTA/downloads/' + path
  242. elif file_path.find('static/otapack') != -1:
  243. file_path = file_path
  244. # 创建url的token
  245. tko = UrlTokenObject()
  246. file_path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  247. url = SERVER_DOMAIN + 'dlotapack/' + file_path
  248. else:
  249. return response.json(900, '2')
  250. # http: // 192.168.136.39:8000 / EquipmentVersion / checkVer?code = 20D20410010
  251. res = {
  252. "url": url,
  253. "fileSize": eqs[0].fileSize,
  254. "Description": eqs[0].Description,
  255. "softwareVersion": eqs[0].softwareVersion
  256. }
  257. print(url)
  258. return response.json(0, res)
  259. def do_query(self, request_dict, response):
  260. mci = request_dict.get('mci', None)
  261. page = request_dict.get('page', None)
  262. line = request_dict.get('line', None)
  263. code = request_dict.get('code', None)
  264. if not page or not line:
  265. return response.json(444, 'page,line')
  266. else:
  267. page = int(page)
  268. line = int(line)
  269. cv_qs = Equipment_Version.objects
  270. if mci is not None:
  271. cv_qs = cv_qs.filter(mci=mci)
  272. if code is not None:
  273. cv_qs = cv_qs.filter(code__contains=code)
  274. cv_qs = cv_qs.order_by('code').values_list('code', flat=True).distinct()
  275. print(cv_qs)
  276. count = cv_qs.count()
  277. cv_qs = list(cv_qs[(page - 1) * line:page * line])
  278. # return response.json(0, cv_qs)
  279. ev_qs = Equipment_Version.objects.filter(code__in=list(cv_qs)).values()
  280. ev_list = CommonService.qs_to_list(ev_qs)
  281. datas = {}
  282. # 组装数据
  283. for ev in ev_list:
  284. for code in cv_qs:
  285. if code not in datas.keys():
  286. datas[code] = []
  287. if code == ev['code']:
  288. datas[code].append(ev)
  289. res = {
  290. 'datas': datas,
  291. 'count': count
  292. }
  293. return response.json(0, res)
  294. def do_filter(self, request_dict, response):
  295. mci = request_dict.get('mci', None)
  296. page = request_dict.get('page', None)
  297. line = request_dict.get('line', None)
  298. code = request_dict.get('code', None)
  299. lang = request_dict.get('lang', None)
  300. if not page or not line:
  301. return response.json(444, 'page,line')
  302. else:
  303. page = int(page)
  304. line = int(line)
  305. ev_qs = Equipment_Version.objects
  306. if mci:
  307. ev_qs = ev_qs.filter(mci=mci)
  308. if code:
  309. ev_qs = ev_qs.filter(code__contains=code)
  310. if lang:
  311. ev_qs = ev_qs.filter(lang=lang)
  312. count = ev_qs.count()
  313. ev_qs = ev_qs[(page - 1) * line:page * line].values()
  314. ev_ls = CommonService.qs_to_list(ev_qs)
  315. res = {
  316. 'datas': ev_ls,
  317. 'count': count
  318. }
  319. return response.json(0, res)