|
@@ -0,0 +1,289 @@
|
|
|
+#!/usr/bin/env python3
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+import base64
|
|
|
+import json
|
|
|
+import time
|
|
|
+import xlwt
|
|
|
+
|
|
|
+from django.http import StreamingHttpResponse, HttpResponse, QueryDict
|
|
|
+from django.utils.decorators import method_decorator
|
|
|
+from django.views import View
|
|
|
+from django.views.decorators.csrf import csrf_exempt
|
|
|
+
|
|
|
+from Model.models import UIDModel, UserUIDModel, UserModel, LogModel
|
|
|
+from Object.RedisObject import RedisObject
|
|
|
+from Object.TokenObject import TokenObject
|
|
|
+from Object.ResponseObject import ResponseObject
|
|
|
+from Service.CommonService import CommonService
|
|
|
+
|
|
|
+
|
|
|
+class UploadUIDFileView(View):
|
|
|
+
|
|
|
+ @method_decorator(csrf_exempt)
|
|
|
+ def dispatch(self, request, *args, **kwargs):
|
|
|
+ return super(UploadUIDFileView, self).dispatch(request, *args, **kwargs)
|
|
|
+
|
|
|
+ def get(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ request_dict = request.GET
|
|
|
+ fileName = request.FILES.get('fileName', None)
|
|
|
+ return self.validate(fileName, request_dict, request)
|
|
|
+
|
|
|
+ def post(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ request_dict = request.POST
|
|
|
+ fileName = request.FILES.get('fileName', None)
|
|
|
+ return self.validate(fileName, request_dict, request)
|
|
|
+
|
|
|
+ def validate(self, fileName, request_dict, request):
|
|
|
+ token = request_dict.get('token', None)
|
|
|
+ area = request_dict.get('area', None)
|
|
|
+ isReset = request_dict.get('isReset', 0)
|
|
|
+ content = request_dict.get('fileName', None)
|
|
|
+ print('content')
|
|
|
+ print(content)
|
|
|
+
|
|
|
+ content = base64.b64decode(content).decode().strip()
|
|
|
+ content = content[3:(len(content) - 3)]
|
|
|
+ uids = content.split('\n')
|
|
|
+ print(uids)
|
|
|
+
|
|
|
+ response = ResponseObject()
|
|
|
+
|
|
|
+ tko = TokenObject(token)
|
|
|
+ if tko.code != 0:
|
|
|
+ return response.json(tko.code)
|
|
|
+
|
|
|
+ # if not fileName and not area:
|
|
|
+ # return response.json(444, 'fileName,area')
|
|
|
+
|
|
|
+ data = {}
|
|
|
+ duplicate = []
|
|
|
+ for line in uids:
|
|
|
+
|
|
|
+ if data.__contains__(line):
|
|
|
+ duplicate.append(line)
|
|
|
+ else:
|
|
|
+ data[line] = ''
|
|
|
+
|
|
|
+ if isReset == 0:
|
|
|
+ return self.do_insert(data, duplicate, area, response, request, tko)
|
|
|
+ else:
|
|
|
+ return self.do_reset(data, response, area, request, tko)
|
|
|
+
|
|
|
+ def do_insert(self, data, duplicate, area, response, request, token):
|
|
|
+ bulk = []
|
|
|
+ count = 0
|
|
|
+ add_time = int(time.time())
|
|
|
+ update_time = int(time.time())
|
|
|
+ keys = data.keys()
|
|
|
+ # redisObject = RedisObject(db=3)
|
|
|
+ for item in keys:
|
|
|
+ key = item.strip()
|
|
|
+ # value = redisObject.get_data(key)
|
|
|
+ # if value is False:
|
|
|
+ # # redisObject.set_data(key, '1', 600)
|
|
|
+ # else:
|
|
|
+ # duplicate.append(key)
|
|
|
+ # continue
|
|
|
+ bulk.append(UIDModel(
|
|
|
+ uid=item.strip(),
|
|
|
+ uid_extra='',
|
|
|
+ status=0,
|
|
|
+ add_time=add_time,
|
|
|
+ update_time=update_time,
|
|
|
+ area=area
|
|
|
+ ))
|
|
|
+ try:
|
|
|
+ if (count % 5000) == 0:
|
|
|
+ UIDModel.objects.bulk_create(bulk)
|
|
|
+ bulk.clear()
|
|
|
+ except Exception as e:
|
|
|
+ print(repr(e))
|
|
|
+ return response.json(174, str(e))
|
|
|
+ count += 1
|
|
|
+
|
|
|
+ if len(bulk) > 0:
|
|
|
+ UIDModel.objects.bulk_create(bulk)
|
|
|
+ bulk.clear()
|
|
|
+ del data
|
|
|
+ del bulk
|
|
|
+
|
|
|
+ # print('重复:')
|
|
|
+ # print(duplicate)
|
|
|
+
|
|
|
+ operation = self.formatOperation(operation='上传', quantity=int(count), area=int(area))
|
|
|
+ self.add_log(request, operation, token)
|
|
|
+ return response.json(0, {'count': count, 'duplicate_count': len(duplicate), 'data': duplicate})
|
|
|
+
|
|
|
+ def do_reset(self, data, response, area, request, token):
|
|
|
+ keys = data.keys()
|
|
|
+ uids = []
|
|
|
+ count = 0
|
|
|
+ for key in keys:
|
|
|
+ uids.append(key)
|
|
|
+ if len(uids) % 5000 == 0:
|
|
|
+ count += self.do_update_uid_status(uids, area)
|
|
|
+ uids.clear()
|
|
|
+
|
|
|
+ if len(uids) > 0:
|
|
|
+ count += self.do_update_uid_status(uids, area)
|
|
|
+ uids.clear()
|
|
|
+
|
|
|
+ operation = self.formatOperation('重置', int(count), int(area))
|
|
|
+ self.add_log(request, operation, token)
|
|
|
+ return response.json(0)
|
|
|
+
|
|
|
+ def do_update_uid_status(self, uids, area):
|
|
|
+ uid_qs = UIDModel.objects.filter(uid__in=uids, area=area, status=2)
|
|
|
+ if uid_qs.exists():
|
|
|
+ for uid in uid_qs:
|
|
|
+ if uid.status == 2:
|
|
|
+ uid.status = 1
|
|
|
+ UIDModel.objects.bulk_update(uid_qs, fields=['status'])
|
|
|
+ return uid_qs.count()
|
|
|
+ return 0
|
|
|
+
|
|
|
+ def add_log(self, request, operation, token):
|
|
|
+ ip = CommonService.get_ip_address(request)
|
|
|
+ now_time = time.time()
|
|
|
+ content = json.dumps(request.POST)
|
|
|
+ user_qs = UserModel.objects.filter(id=token.userID)
|
|
|
+
|
|
|
+ log = {
|
|
|
+ 'status': 200,
|
|
|
+ 'content': content,
|
|
|
+ 'ip': ip,
|
|
|
+ 'time': now_time,
|
|
|
+ 'url': 'upload',
|
|
|
+ 'operation': operation,
|
|
|
+ 'user': user_qs[0]
|
|
|
+ }
|
|
|
+
|
|
|
+ try:
|
|
|
+ LogModel.objects.create(**log)
|
|
|
+ except Exception as e:
|
|
|
+ print(repr(e))
|
|
|
+
|
|
|
+ def formatOperation(self, operation, quantity, area):
|
|
|
+ str = '{operation}{quantity}个{area}UID'
|
|
|
+ if area == 0:
|
|
|
+ return str.format(operation=operation, quantity=quantity, area='国内')
|
|
|
+ else:
|
|
|
+ return str.format(operation=operation, quantity=quantity, area='国外')
|
|
|
+
|
|
|
+class DownloadUIDFileView(View):
|
|
|
+
|
|
|
+ @method_decorator(csrf_exempt)
|
|
|
+ def dispatch(self, request, *args, **kwargs):
|
|
|
+ return super(DownloadUIDFileView, self).dispatch(request, *args, **kwargs)
|
|
|
+
|
|
|
+ def get(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ request_dict = request.GET
|
|
|
+ return self.validate(request_dict)
|
|
|
+
|
|
|
+ def post(self, request, *args, **kwargs):
|
|
|
+ request.encoding = 'utf-8'
|
|
|
+ request_dict = request.POST
|
|
|
+ return self.validate(request_dict)
|
|
|
+
|
|
|
+ def validate(self, request_dict):
|
|
|
+ token = request_dict.get('token', None)
|
|
|
+ area = request_dict.get('area', None)
|
|
|
+ quantity = int(request_dict.get('quantity', None))
|
|
|
+ fileType = request_dict.get('fileType', None)
|
|
|
+ response = ResponseObject()
|
|
|
+
|
|
|
+ # print(area)
|
|
|
+ # print(quantity)
|
|
|
+ token = TokenObject(token)
|
|
|
+ if token.code != 0:
|
|
|
+ return response.json(token.code)
|
|
|
+
|
|
|
+ if not area:
|
|
|
+ return response.json(444, 'area')
|
|
|
+
|
|
|
+ area = int(area)
|
|
|
+
|
|
|
+ if area >= 0 and quantity > 0:
|
|
|
+
|
|
|
+ uid_qs = UserUIDModel.objects.filter(user__id=token.userID, uid__status=1, uid__area=area). \
|
|
|
+ values('uid__id', 'uid__uid', 'uid__uid_extra', 'uid__add_time', 'uid__update_time', 'uid__area')
|
|
|
+ count = uid_qs.count()
|
|
|
+ if count < quantity:
|
|
|
+ return response.json(444, '设备UID不足')
|
|
|
+
|
|
|
+ if uid_qs.exists():
|
|
|
+ uid_qs = uid_qs[0:quantity]
|
|
|
+ if fileType == 'txt':
|
|
|
+ return self.download_txt(uid_qs)
|
|
|
+ elif fileType == 'excel':
|
|
|
+ return self.download_excel(uid_qs)
|
|
|
+ else:
|
|
|
+ return response.json(444, 'fileType')
|
|
|
+ else:
|
|
|
+ return response.json(444, '111')
|
|
|
+ else:
|
|
|
+ return response.json(444, '222')
|
|
|
+
|
|
|
+ def download_txt(self, uid_qs):
|
|
|
+ updates = []
|
|
|
+ content = ''
|
|
|
+ for item in uid_qs:
|
|
|
+ content += item['uid__uid']
|
|
|
+ content += '\n'
|
|
|
+ updates.append(UIDModel(
|
|
|
+ id=item['uid__id'],
|
|
|
+ uid=item['uid__uid'],
|
|
|
+ uid_extra=item['uid__uid_extra'],
|
|
|
+ status=2,
|
|
|
+ add_time=item['uid__add_time'],
|
|
|
+ update_time=item['uid__update_time'],
|
|
|
+ area=item['uid__area']
|
|
|
+ ))
|
|
|
+ if len(updates) % 5000 == 0:
|
|
|
+ UIDModel.objects.bulk_update(updates, fields=["status"])
|
|
|
+ updates.clear()
|
|
|
+ # print(item['uid__uid'])
|
|
|
+
|
|
|
+ if len(updates) > 0:
|
|
|
+ UIDModel.objects.bulk_update(updates, fields=["status"])
|
|
|
+ updates.clear()
|
|
|
+
|
|
|
+ del updates
|
|
|
+ content = content[0:len(content) - 1]
|
|
|
+ response = StreamingHttpResponse(content)
|
|
|
+ response['Content-Type'] = 'application/octet-stream'
|
|
|
+ response['Content-Disposition'] = 'attachment;filename=UID'+time.strftime('-%Y-%m-%d-%H-%M-%S', time.localtime()) + '.txt'
|
|
|
+ return response
|
|
|
+
|
|
|
+ def download_excel(self, uid_qs):
|
|
|
+ response = HttpResponse(content_type='application/vnd.ms-excel')
|
|
|
+ response['Content-Disposition'] = 'attachment; filename=UID' + time.strftime('-%Y-%m-%d-%H-%M-%S', time.localtime()) + '.xls'
|
|
|
+ workbook = xlwt.Workbook(encoding='utf-8')
|
|
|
+ sheet1 = workbook.add_sheet('UID')
|
|
|
+ row1 = [u'设备UID']
|
|
|
+ for i in range(0, len(row1)):
|
|
|
+ sheet1.write(0, i, row1[i])
|
|
|
+
|
|
|
+ num = 1
|
|
|
+ updates = []
|
|
|
+ for item in uid_qs:
|
|
|
+ uid = item['uid']
|
|
|
+ sheet1.write(num, 0, uid)
|
|
|
+ num += 1
|
|
|
+ updates.append(UIDModel(
|
|
|
+ id=item['id'],
|
|
|
+ uid=item['uid'],
|
|
|
+ uid_extra=item['uid_extra'],
|
|
|
+ status=1,
|
|
|
+ add_time=item['add_time'],
|
|
|
+ update_time=item['update_time'],
|
|
|
+ area=item['area']
|
|
|
+ ))
|
|
|
+
|
|
|
+ UIDModel.objects.bulk_update(updates, fields=["status"])
|
|
|
+ workbook.save(response)
|
|
|
+ return response
|
|
|
+
|