EquipmentOTA.py 15 KB

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