|
@@ -0,0 +1,274 @@
|
|
|
+#!/usr/bin/env python3
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+import hashlib
|
|
|
+import json
|
|
|
+import os
|
|
|
+import time
|
|
|
+import urllib
|
|
|
+import uuid
|
|
|
+import boto3
|
|
|
+import threading
|
|
|
+import logging
|
|
|
+
|
|
|
+import xlwt
|
|
|
+from boto3.session import Session
|
|
|
+from django.http import JsonResponse, HttpResponseRedirect, HttpResponse, StreamingHttpResponse
|
|
|
+from django.views.generic.base import View
|
|
|
+
|
|
|
+from Ansjer.config import BASE_DIR, SERVER_DOMAIN
|
|
|
+from Model.models import Device_Info, Role, MenuModel, VodBucketModel, CDKcontextModel, Store_Meal, Order_Model, \
|
|
|
+ UID_Bucket, ExperienceContextModel, Lang, Device_User, CloudLogModel, UidSetModel, Equipment_Version, \
|
|
|
+ EquipmentVersionLimitModel
|
|
|
+from Object.RedisObject import RedisObject
|
|
|
+from Object.ResponseObject import ResponseObject
|
|
|
+from Object.TokenObject import TokenObject
|
|
|
+from Object.UidTokenObject import UidTokenObject
|
|
|
+from Object.UrlTokenObject import UrlTokenObject
|
|
|
+from Service.CommonService import CommonService
|
|
|
+from django.db.models import Q, F
|
|
|
+from time import strftime
|
|
|
+
|
|
|
+
|
|
|
+class NewVersionManagement(View):
|
|
|
+ def get(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ operation = kwargs.get('operation')
|
|
|
+ return self.validation(request.GET, request, operation)
|
|
|
+
|
|
|
+ def post(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ operation = kwargs.get('operation')
|
|
|
+ return self.validation(request.POST, request, operation)
|
|
|
+
|
|
|
+ def validation(self, request_dict, request, operation):
|
|
|
+ language = request_dict.get('language', 'en')
|
|
|
+ response = ResponseObject(language, 'pc')
|
|
|
+ tko = TokenObject(
|
|
|
+ request.META.get('HTTP_AUTHORIZATION'),
|
|
|
+ returntpye='pc')
|
|
|
+ if tko.code != 0:
|
|
|
+ return response.json(tko.code)
|
|
|
+ response.lang = tko.lang
|
|
|
+ userID = tko.userID
|
|
|
+ if operation == 'query':
|
|
|
+ return self.do_query(request_dict, response)
|
|
|
+ if operation == 'update':
|
|
|
+ return self.do_update(request_dict, response, request)
|
|
|
+ if operation == 'filter':
|
|
|
+ return self.do_filter(request_dict, response)
|
|
|
+ else:
|
|
|
+ return response.json(404)
|
|
|
+
|
|
|
+
|
|
|
+ def do_update(self, request_dict, response, request):
|
|
|
+ code = request_dict.get('code', None)
|
|
|
+ status = request_dict.get('status', None)
|
|
|
+ lang = request_dict.get('lang', None)
|
|
|
+ max_ver = request_dict.get('max_ver', None)
|
|
|
+ file_s = request.FILES.get('file', None)
|
|
|
+ paths = 'static/versions/image'
|
|
|
+ if not os.path.exists(paths):
|
|
|
+ os.makedirs(paths) # makedirs 创建文件时如果路径不存在会创建这个路径
|
|
|
+ # print ('该文件不存在')
|
|
|
+ else:
|
|
|
+ print('该文件存在')
|
|
|
+ ev = Equipment_Version.objects.filter(code=code, lang=lang)
|
|
|
+ if file_s is None:
|
|
|
+ rv_path = 'static/versions/image/' + code + '.png'
|
|
|
+ img = SERVER_DOMAIN + 'sysfile/' + rv_path
|
|
|
+ else:
|
|
|
+ rv_path = 'static/versions/image/' + code + '.png'
|
|
|
+ try:
|
|
|
+ as_path = os.path.join(BASE_DIR, rv_path)
|
|
|
+ if os.path.exists(as_path):
|
|
|
+ os.remove(as_path)
|
|
|
+ with open(as_path, 'wb+') as destination:
|
|
|
+ for chunk in file_s.chunks():
|
|
|
+ destination.write(chunk)
|
|
|
+ except Exception as e:
|
|
|
+ pass
|
|
|
+ else:
|
|
|
+ img = SERVER_DOMAIN + 'sysfile/' + rv_path
|
|
|
+ if code is not None:
|
|
|
+
|
|
|
+ if ev.exists():
|
|
|
+ try:
|
|
|
+ update_time = time.timezone.localtime(time.timezone.now())
|
|
|
+ update_dict = {
|
|
|
+ 'status': status,
|
|
|
+ 'img': img,
|
|
|
+ 'update_time': update_time
|
|
|
+ }
|
|
|
+ if max_ver:
|
|
|
+ update_dict['max_ver'] = max_ver
|
|
|
+ ev.update(**update_dict)
|
|
|
+ except Exception as e:
|
|
|
+ return response.json(404, repr(e))
|
|
|
+ else:
|
|
|
+ return response.json(0, {'update_time': str(update_time), 'img': img})
|
|
|
+ else:
|
|
|
+ return response.json(173)
|
|
|
+ else:
|
|
|
+ return response.json(444, 'code')
|
|
|
+
|
|
|
+ def do_check_ver(self, request_dict, response):
|
|
|
+ code = request_dict.get('code', None)
|
|
|
+ ov = request_dict.get('ov', None)
|
|
|
+ uid = request_dict.get('uid', '')
|
|
|
+ if not code:
|
|
|
+ return response.json(444, 'code')
|
|
|
+ eqs = Equipment_Version.objects.filter(code=uid, status=1, lang='en').order_by('-data_joined')
|
|
|
+ if not eqs.exclude():
|
|
|
+ eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
|
|
|
+ if not eqs.exists():
|
|
|
+ return response.json(900)
|
|
|
+ if ov is not None:
|
|
|
+ # 判断大小
|
|
|
+ if ov > eqs[0].softwareVersion:
|
|
|
+ return response.json(0, {'softwareVersion': ov})
|
|
|
+ file_path = eqs[0].filePath
|
|
|
+ if file_path.find('static/Upgrade/') != -1:
|
|
|
+ path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
|
|
|
+ url = SERVER_DOMAIN + 'OTA/downloads/' + path + '?time=' + str(time.time())
|
|
|
+ elif file_path.find('static/otapack') != -1:
|
|
|
+ url = SERVER_DOMAIN + 'OTA/downloadsPack/' + file_path + '?time=' + str(time.time())
|
|
|
+ # url = SERVER_DOMAIN + 'dl/otaPack/' + file_path + '?time=' + str(time.time())
|
|
|
+ else:
|
|
|
+ return response.json(900, '2')
|
|
|
+ res = {
|
|
|
+ "url": url,
|
|
|
+ "fileSize": eqs[0].fileSize,
|
|
|
+ "Description": eqs[0].Description,
|
|
|
+ "softwareVersion": eqs[0].softwareVersion
|
|
|
+ }
|
|
|
+ return response.json(0, res)
|
|
|
+
|
|
|
+ # 修改加密的路径
|
|
|
+ def do_check_value(self, request_dict, response):
|
|
|
+ code = request_dict.get('code', None)
|
|
|
+ ov = request_dict.get('ov', None)
|
|
|
+ uid = request_dict.get('uid', '')
|
|
|
+ if not code:
|
|
|
+ return response.json(444, 'code')
|
|
|
+ eqs = Equipment_Version.objects.filter(code=uid, status=1, lang='en').order_by('-data_joined')
|
|
|
+
|
|
|
+ if not eqs.exclude():
|
|
|
+ eqs = Equipment_Version.objects.filter(code=code, status=1, lang='en').order_by('-data_joined')
|
|
|
+ if not eqs.exists():
|
|
|
+ return response.json(900)
|
|
|
+ if ov is not None:
|
|
|
+ # 判断大小
|
|
|
+ if ov > eqs[0].softwareVersion:
|
|
|
+ return response.json(0, {'softwareVersion': ov})
|
|
|
+ equipment = eqs[0]
|
|
|
+ redisObject = RedisObject()
|
|
|
+ key = 'limit_{eid}'.format(eid=equipment.eid)
|
|
|
+
|
|
|
+ evl_qs = redisObject.get_data(key=key)
|
|
|
+ if evl_qs:
|
|
|
+ evl_qs = json.loads(evl_qs)
|
|
|
+ else:
|
|
|
+ evl_qs = EquipmentVersionLimitModel.objects.filter(equipment_version_id=equipment.eid,
|
|
|
+ status=1).values()
|
|
|
+ if evl_qs.exists():
|
|
|
+ redisObject.set_data(key=key, val=json.dumps(list(evl_qs.values())), expire=600)
|
|
|
+ if evl_qs and len(evl_qs) > 0:
|
|
|
+ evl = evl_qs[0]
|
|
|
+ if evl['type'] == 1: # uid限制
|
|
|
+ uids = json.loads(evl['content'])
|
|
|
+ if not uids.__contains__(uid):
|
|
|
+ return response.json(902)
|
|
|
+ file_path = eqs[0].filePath
|
|
|
+ if file_path.find('static/Upgrade/') != -1:
|
|
|
+ path = file_path.replace('static/Upgrade/', '').replace('\\', '/')
|
|
|
+ # 创建url的token
|
|
|
+ tko = UrlTokenObject()
|
|
|
+ path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
|
|
|
+
|
|
|
+ url = SERVER_DOMAIN + 'OTA/downloads/' + path
|
|
|
+ elif file_path.find('static/otapack') != -1:
|
|
|
+ file_path = file_path
|
|
|
+ # 创建url的token
|
|
|
+ tko = UrlTokenObject()
|
|
|
+ file_path = tko.generate(data={'Url': "ansjer/" + CommonService.RandomStr(6) + "/" + file_path})
|
|
|
+
|
|
|
+ url = SERVER_DOMAIN + 'dlotapack/' + file_path
|
|
|
+ else:
|
|
|
+ return response.json(900, '2')
|
|
|
+ # http: // 192.168.136.39:8000 / EquipmentVersion / checkVer?code = 20D20410010
|
|
|
+
|
|
|
+ res = {
|
|
|
+ "url": url,
|
|
|
+ "fileSize": eqs[0].fileSize,
|
|
|
+ "Description": eqs[0].Description,
|
|
|
+ "softwareVersion": eqs[0].softwareVersion
|
|
|
+ }
|
|
|
+ print(url)
|
|
|
+ return response.json(0, res)
|
|
|
+
|
|
|
+ def do_query(self, request_dict, response):
|
|
|
+ mci = request_dict.get('mci', None)
|
|
|
+ page = request_dict.get('page', None)
|
|
|
+ line = request_dict.get('line', None)
|
|
|
+ code = request_dict.get('code', None)
|
|
|
+ if not page or not line:
|
|
|
+ return response.json(444, 'page,line')
|
|
|
+ else:
|
|
|
+ page = int(page)
|
|
|
+ line = int(line)
|
|
|
+ cv_qs = Equipment_Version.objects
|
|
|
+ if mci is not None:
|
|
|
+ cv_qs = cv_qs.filter(mci=mci)
|
|
|
+ if code is not None:
|
|
|
+ cv_qs = cv_qs.filter(code__contains=code)
|
|
|
+ cv_qs = cv_qs.order_by('code').values_list('code', flat=True).distinct()
|
|
|
+ print(cv_qs)
|
|
|
+ count = cv_qs.count()
|
|
|
+ cv_qs = list(cv_qs[(page - 1) * line:page * line])
|
|
|
+ # return response.json(0, cv_qs)
|
|
|
+ ev_qs = Equipment_Version.objects.filter(code__in=list(cv_qs)).values()
|
|
|
+ ev_list = CommonService.qs_to_list(ev_qs)
|
|
|
+ datas = {}
|
|
|
+ # 组装数据
|
|
|
+ for ev in ev_list:
|
|
|
+ for code in cv_qs:
|
|
|
+ if code not in datas.keys():
|
|
|
+ datas[code] = []
|
|
|
+ if code == ev['code']:
|
|
|
+ datas[code].append(ev)
|
|
|
+ res = {
|
|
|
+ 'datas': datas,
|
|
|
+ 'count': count
|
|
|
+ }
|
|
|
+ return response.json(0, res)
|
|
|
+
|
|
|
+ def do_filter(self, request_dict, response):
|
|
|
+ mci = request_dict.get('mci', None)
|
|
|
+ page = request_dict.get('page', None)
|
|
|
+ line = request_dict.get('line', None)
|
|
|
+ code = request_dict.get('code', None)
|
|
|
+ lang = request_dict.get('lang', None)
|
|
|
+ if not page or not line:
|
|
|
+ return response.json(444, 'page,line')
|
|
|
+ else:
|
|
|
+ page = int(page)
|
|
|
+ line = int(line)
|
|
|
+ ev_qs = Equipment_Version.objects
|
|
|
+ if mci:
|
|
|
+ ev_qs = ev_qs.filter(mci=mci)
|
|
|
+ if code:
|
|
|
+ ev_qs = ev_qs.filter(code__contains=code)
|
|
|
+ if lang:
|
|
|
+ if lang == 'cn' or lang == 'zh-Hans':
|
|
|
+ ev_qs = ev_qs.filter(Q(lang='cn') | Q(lang='zh-Hans'))
|
|
|
+ else:
|
|
|
+ ev_qs = ev_qs.filter(lang=lang)
|
|
|
+
|
|
|
+ count = ev_qs.count()
|
|
|
+ ev_qs = ev_qs[(page - 1) * line:page * line].values()
|
|
|
+ ev_ls = CommonService.qs_to_list(ev_qs)
|
|
|
+ res = {
|
|
|
+ 'datas': ev_ls,
|
|
|
+ 'count': count
|
|
|
+ }
|
|
|
+ return response.json(0, res)
|