EquipmentOTA.py 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  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, EquipmentVersionLimitModel, CountryIPModel
  10. from Object.RedisObject import RedisObject
  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 django.db.models import Q
  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. equipment = eqs[0]
  269. redisObject = RedisObject()
  270. key = 'limit_{eid}'.format(eid=equipment.eid)
  271. evl_qs = redisObject.get_data(key=key)
  272. if evl_qs:
  273. evl_qs = json.loads(evl_qs)
  274. else:
  275. evl_qs = EquipmentVersionLimitModel.objects.filter(equipment_version_id=equipment.eid, status=1).values()
  276. if evl_qs.exists():
  277. redisObject.set_data(key=key, val=json.dumps(list(evl_qs.values())), expire=600)
  278. if evl_qs and len(evl_qs) > 0:
  279. evl = evl_qs[0]
  280. if evl['type'] == 1: # uid限制
  281. uids = json.loads(evl['content'])
  282. if not uids.__contains__(uid):
  283. return response.json(902)
  284. file_path = eqs[0].filePath
  285. if file_path.find('static/Upgrade/') != -1:
  286. path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
  287. # 创建url的token
  288. tko = UrlTokenObject()
  289. path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  290. url = SERVER_DOMAIN + 'OTA/downloads/' + path
  291. elif file_path.find('static/otapack') != -1:
  292. file_path = file_path
  293. # 创建url的token
  294. tko = UrlTokenObject()
  295. file_path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
  296. url = SERVER_DOMAIN + 'dlotapack/' + file_path
  297. else:
  298. return response.json(900, '2')
  299. # http: // 192.168.136.39:8000 / EquipmentVersion / checkVer?code = 20D20410010
  300. res = {
  301. "url": url,
  302. "fileSize": eqs[0].fileSize,
  303. "Description": eqs[0].Description,
  304. "softwareVersion": eqs[0].softwareVersion
  305. }
  306. print(url)
  307. return response.json(0, res)
  308. def do_query(self, request_dict, response):
  309. mci = request_dict.get('mci', None)
  310. page = request_dict.get('page', None)
  311. line = request_dict.get('line', None)
  312. code = request_dict.get('code', None)
  313. if not page or not line:
  314. return response.json(444, 'page,line')
  315. else:
  316. page = int(page)
  317. line = int(line)
  318. cv_qs = Equipment_Version.objects
  319. if mci is not None:
  320. cv_qs = cv_qs.filter(mci=mci)
  321. if code is not None:
  322. cv_qs = cv_qs.filter(code__contains=code)
  323. cv_qs = cv_qs.order_by('code').values_list('code', flat=True).distinct()
  324. print(cv_qs)
  325. count = cv_qs.count()
  326. cv_qs = list(cv_qs[(page - 1) * line:page * line])
  327. # return response.json(0, cv_qs)
  328. ev_qs = Equipment_Version.objects.filter(code__in=list(cv_qs)).values()
  329. ev_list = CommonService.qs_to_list(ev_qs)
  330. datas = {}
  331. # 组装数据
  332. for ev in ev_list:
  333. for code in cv_qs:
  334. if code not in datas.keys():
  335. datas[code] = []
  336. if code == ev['code']:
  337. datas[code].append(ev)
  338. res = {
  339. 'datas': datas,
  340. 'count': count
  341. }
  342. return response.json(0, res)
  343. def do_filter(self, request_dict, response):
  344. mci = request_dict.get('mci', None)
  345. page = request_dict.get('page', None)
  346. line = request_dict.get('line', None)
  347. code = request_dict.get('code', None)
  348. lang = request_dict.get('lang', None)
  349. if not page or not line:
  350. return response.json(444, 'page,line')
  351. else:
  352. page = int(page)
  353. line = int(line)
  354. ev_qs = Equipment_Version.objects
  355. if mci:
  356. ev_qs = ev_qs.filter(mci=mci)
  357. if code:
  358. ev_qs = ev_qs.filter(code__contains=code)
  359. if lang:
  360. if lang == 'cn' or lang == 'zh-Hans':
  361. ev_qs = ev_qs.filter(Q(lang='cn') | Q(lang='zh-Hans'))
  362. else:
  363. ev_qs = ev_qs.filter(lang=lang)
  364. count = ev_qs.count()
  365. ev_qs = ev_qs[(page - 1) * line:page * line].values()
  366. ev_ls = CommonService.qs_to_list(ev_qs)
  367. res = {
  368. 'datas': ev_ls,
  369. 'count': count
  370. }
  371. return response.json(0, res)