EquipmentOTA.py 12 KB

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