| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402 | 
							- #!/usr/bin/env python3
 
- # -*- coding: utf-8 -*-
 
- import json
 
- import logging
 
- import time
 
- from django.db import transaction
 
- from django.http import StreamingHttpResponse
 
- from django.utils.decorators import method_decorator
 
- from django.views import View
 
- from django.views.decorators.csrf import csrf_exempt
 
- from django.db.models import Avg,Max,Min,Count,Sum, Q  #   引入函数
 
- from Model.models import UIDModel, UserModel, UserUIDModel, HistoryUIDModel
 
- from Object.RedisObject import RedisObject
 
- from Object.uidManageResponseObject import uidManageResponseObject
 
- from Object.TokenObject import TokenObject
 
- from Service.ModelService import ModelService
 
- class HistoryUIDView(View):
 
-     @method_decorator(csrf_exempt)
 
-     def dispatch(self, request, *args, **kwargs):
 
-         return super(HistoryUIDView, self).dispatch(request, *args, **kwargs)
 
-     def get(self, request, *args, **kwargs):
 
-         request.encoding = 'utf-8'
 
-         request_dict = request.GET
 
-         operation = kwargs.get('operation')
 
-         return self.validate(request_dict, operation)
 
-     def post(self, request, *args, **kwargs):
 
-         request.encoding = 'utf-8'
 
-         request_dict = request.POST
 
-         operation = kwargs.get('operation')
 
-         return self.validate(request_dict, operation)
 
-     def validate(self, request_dict, operation):
 
-         token = request_dict.get('token', None)
 
-         response = uidManageResponseObject()
 
-         token = TokenObject(token)
 
-         if token.code != 0:
 
-             return response.json(token.code)
 
-         if operation == 'quantity':
 
-             return self.do_quantity(request_dict, response)
 
-         elif operation == 'remove':
 
-             return self.do_remove(request_dict, response)
 
-         elif operation == 'download':
 
-             return self.download_txt(token, response)
 
-         elif operation == 'list':
 
-             return self.do_list(request_dict, response)
 
-         elif operation == 'delete':
 
-             return self.do_delete(token.userID, request_dict, response)
 
-         elif operation == 'batchDelete':
 
-             return self.do_batch_delete(token.userID, request_dict, response)
 
-         elif operation == 'adminUpdate':
 
-             return self.do_admin_update(token.userID, request_dict, response)
 
-         else:
 
-             return response.json(309)
 
-     # 查询当前可用的UID的数量
 
-     def do_quantity(self, request_dict, response):
 
-         token = request_dict.get('token', None)
 
-         token = TokenObject(token)
 
-         if token.code != 0:
 
-             return response.json(token.code)
 
-         user_qs = UserModel.objects.filter(id=token.userID)
 
-         if user_qs.exists():
 
-             user = user_qs[0]
 
-             if user.permission == '0':
 
-                 return self.do_admin_quantity(request_dict, response, user.username)
 
-             else:
 
-                 return self.do_not_admin_quantity(request_dict, response, user.username)
 
-         else:
 
-             return response.json(9)
 
-     # 管理员的查询UID数量操作
 
-     def do_admin_quantity(self, request_dict, response, admin):
 
-         datas = []
 
-         domestic = HistoryUIDModel.objects.filter(area=0, status=0).count()
 
-         foreign = HistoryUIDModel.objects.filter(area=1, status=0).count()
 
-         item = {}
 
-         item['isAdmin'] = 1
 
-         item['domestic'] = domestic
 
-         item['foreign'] = foreign
 
-         item['username'] = admin
 
-         datas.append(item)
 
-         user_qs = UserModel.objects.filter(~Q(Q(permission='0')))
 
-         for user in user_qs:
 
-             item = {'isAdmin': 0}
 
-             result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=0).aggregate(num=Count('uid__status'))
 
-             item['domestic'] = result['num']
 
-             result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=1).aggregate(num=Count('uid__status'))
 
-             item['foreign'] = result['num']
 
-             item['username'] = user.username
 
-             datas.append(item)
 
-         return response.json(0, {'data': datas})
 
-     # 非管理员的查询UID数量操作
 
-     def do_not_admin_quantity(self, request_dict, response, username):
 
-         user_qs = UserModel.objects.filter(username=username)
 
-         if user_qs.exists():
 
-             user = user_qs[0]
 
-             datas = []
 
-             item = {'isAdmin': 0}
 
-             result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=0).aggregate(num=Count('uid__status'))
 
-             item['domestic'] = result['num']
 
-             result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=1).aggregate(num=Count('uid__status'))
 
-             item['foreign'] = result['num']
 
-             item['username'] = user.username
 
-             datas.append(item)
 
-             return response.json(0, {'data': datas})
 
-         else:
 
-             return response.json(444)
 
-     # 分配UID
 
-     @transaction.atomic
 
-     def do_allot(self, request_dict, response):
 
-         username = request_dict.get('username', None)
 
-         quantity = int(request_dict.get('quantity', None))
 
-         area = request_dict.get('area', None)
 
-         token = request_dict.get('token', None)
 
-         token = TokenObject(token)
 
-         if token.code != 0:
 
-             return response.json(token.code)
 
-         user = UserModel.objects.get(id=token.userID)
 
-         if not user or '0' not in user.permission:
 
-             return response.json(404)
 
-         # 要分配的对象
 
-         allot_user_qs = UserModel.objects.filter(username=username)
 
-         if not allot_user_qs.exists():
 
-             return response.json(444, 'username')
 
-         # 取出对应区域可用的UID分配给allot_user
 
-         uid_qs = HistoryUIDModel.objects.filter(area=area, status=0)
 
-         count = uid_qs.count()
 
-         if count < quantity:
 
-             return response.json(444, '设备UID不足')
 
-         updates = []
 
-         datas = []
 
-         count = 0
 
-         if uid_qs.exists():
 
-             uid_qs = uid_qs[0:quantity]
 
-             now_time = int(time.time())
 
-             savePoint = transaction.savepoint()
 
-             for item in uid_qs:
 
-                 item.status = 1
 
-                 item.update_time = time.time()
 
-                 user_uid = UserUIDModel()
 
-                 user_uid.uid = item
 
-                 user_uid.user = allot_user_qs[0]
 
-                 user_uid.add_time = now_time
 
-                 user_uid.update_time = now_time
 
-                 datas.append(user_uid)
 
-                 updates.append(item)
 
-                 if len(datas) % 5000 == 0:
 
-                     result = self.do_update(datas, updates, savePoint)
 
-                     if result != 0:
 
-                         return response.json(result)
 
-             if len(datas) > 0:
 
-                 result = self.do_update(datas, updates, savePoint)
 
-                 if result != 0:
 
-                     return response.json(result)
 
-             redisObject = RedisObject()
 
-             values = uid_qs.values('uid')
 
-             print(values)
 
-             redisObject.set_data(key=token.token, val=json.dumps(list(values)), expire=3600)
 
-             del datas
 
-             del updates
 
-             return response.json(0)
 
-         else:
 
-             return response.json(444)
 
-     def do_update(self, datas, updates, savePoint, count=0):
 
-         try:
 
-             try:
 
-                 if count == 2:
 
-                     raise Exception("Invalid level!")
 
-                 UserUIDModel.objects.bulk_create(datas)
 
-                 HistoryUIDModel.objects.bulk_update(updates, fields=['status', 'update_time'])
 
-                 datas.clear()
 
-                 updates.clear()
 
-             except Exception as e:
 
-                 if savePoint:
 
-                     transaction.savepoint_rollback(savePoint)
 
-                 djangoLogger = logging.getLogger('django')
 
-                 djangoLogger.exception(repr(e))
 
-                 return 174
 
-         except Exception as e:
 
-             return 174
 
-         return 0
 
-     # 把UID表中的数据移动到HistoryUID表中
 
-     def do_remove(self, request_dict, response):
 
-         token = TokenObject(request_dict.get('token', None))
 
-         id = request_dict.get('id', None)
 
-         start = request_dict.get('start', None)
 
-         stop = request_dict.get('stop', None)
 
-         if token.code != 0:
 
-             return response.json(token.code)
 
-         # 通过userID查找用户,判断是否是管理员
 
-         user_qs = UserModel.objects.filter(id=token.userID)
 
-         if user_qs.exists():
 
-             user = user_qs[0]
 
-             if user.permission != '0':
 
-                 return response.json(404)
 
-         else:
 
-             return response.json(9)
 
-         if id:
 
-             return self.do_remove_by_id(id, response)
 
-         elif start and stop:
 
-             return self.do_bulk_remove(int(start), int(stop), response)
 
-         else:
 
-             return response.json(444, 'id,start,stop')
 
-     # 移除单条UID记录,id:记录id
 
-     def do_remove_by_id(self, id, response):
 
-         id = int(id)
 
-         uid_qs = HistoryUIDModel.objects.filter(id=id)
 
-         if not uid_qs.exists():
 
-             return response.json(173)
 
-         uid = uid_qs[0]
 
-         if uid:
 
-             data = {
 
-                 'uid': uid.uid,
 
-                 'uid_extra': uid.uid_extra,
 
-                 'status': uid.status,
 
-                 'add_time': uid.add_time,
 
-                 'update_time': uid.update_time,
 
-                 'area': uid.area
 
-             }
 
-             HistoryUIDModel.objects.create(**data)
 
-             uid.delete()
 
-             return response.json(0)
 
-         else:
 
-             return response.json(444, 'id')
 
-     # 批量移除UID记录。start:开始的UID记录的id;stop:结束的UID记录的id
 
-     def do_bulk_remove(self, start, stop, response):
 
-         uid_qs = UIDModel.objects.filter(id__range=(start, stop))
 
-         histories = []
 
-         if uid_qs.exists():
 
-             for item in uid_qs:
 
-                 histories.append(HistoryUIDModel(
 
-                     uid=item.uid,
 
-                     uid_extra=item.uid_extra,
 
-                     status=item.status,
 
-                     add_time=item.add_time,
 
-                     update_time=item.update_time,
 
-                     area=item.area
 
-                 ))
 
-                 if len(histories) % 5000 == 0:
 
-                     HistoryUIDModel.objects.bulk_create(histories)
 
-                     histories.clear()
 
-             if len(histories) > 0:
 
-                 HistoryUIDModel.objects.bulk_create(histories)
 
-                 histories.clear()
 
-             uid_qs.delete()
 
-             return response.json(0)
 
-         else:
 
-             return response.json(173)
 
-     def download_txt(self, token, response):
 
-         redisObject = RedisObject()
 
-         uid_qs = redisObject.get_data(key=token.token)
 
-         if uid_qs is False:
 
-             return response.json(308)
 
-         uid_qs = json.loads(uid_qs)
 
-         content = ''
 
-         for item in uid_qs:
 
-             # print(item)
 
-             content += item['uid']
 
-             content += '\r\n'
 
-         redisObject.del_data(key=token.token)
 
-         content = content[0:len(content) - 1]
 
-         response = StreamingHttpResponse(content)
 
-         response['Content-Type'] = 'application/octet-stream'
 
-         filename = 'uid_need_to_set_up_push.txt'
 
-         response['Content-Disposition'] = 'attachment;filename=' + filename
 
-         return response
 
-     def do_list(self, request_dict, response):
 
-         page = request_dict.get('page', None)
 
-         line = request_dict.get('limit', None)
 
-         status = request_dict.get('status', None)
 
-         area = request_dict.get('area', None)
 
-         start_time = request_dict.get('starttime', None)
 
-         stop_time = request_dict.get('endtime', None)
 
-         uid = request_dict.get('uid', None)
 
-         if page and line:
 
-             uid_qs = HistoryUIDModel.objects.filter()
 
-             res = {
 
-                 'count': 0,
 
-                 'data': []
 
-             }
 
-             if uid_qs.exists():
 
-                 page = int(page)
 
-                 line = int(line)
 
-                 start = (page - 1) * line
 
-                 end = start + line
 
-                 if uid:
 
-                     uid_qs = uid_qs.filter(uid=uid)
 
-                 if status:
 
-                     uid_qs = uid_qs.filter(status=status)
 
-                 if area:
 
-                     uid_qs = uid_qs.filter(area=area)
 
-                 if start_time:
 
-                     uid_qs = uid_qs.filter(update_time__gte=start_time)
 
-                 if stop_time:
 
-                     if stop_time > start:
 
-                         uid_qs = uid_qs.filter(update_time__lte=stop_time)
 
-                 res['count'] = uid_qs.count()
 
-                 uid_qs = uid_qs.values()[start:end]
 
-                 res['data'] = list(uid_qs)
 
-             print(res)
 
-             return response.json(0, res)
 
-         else:
 
-             return response.json(444)
 
-     def do_delete(self, userID, request_dict, response):
 
-         uid = request_dict.get('uid', None)
 
-         user_qs = UserModel.objects.filter(id=userID)
 
-         if user_qs.exists():
 
-             user = user_qs[0]
 
-             if int(user.permission) != 0:
 
-                 return response.json(309)
 
-             HistoryUIDModel.objects.filter(uid=uid).delete()
 
-             return response.json(0)
 
-         else:
 
-             return response.json(309)
 
-     def do_batch_delete(self, userID, request_dict, response):
 
-         # perm = ModelService.check_perm_uid_manage(userID, 0)
 
-         # if not perm:
 
-         #     return response.json(309)
 
-         uids = request_dict.get('uidlist', None)
 
-         if uids:
 
-             uids = json.loads(uids)
 
-             HistoryUIDModel.objects.filter(uid__in=uids).delete()
 
-             return response.json(0)
 
-         else:
 
-             return response.json(444)
 
-     def do_admin_update(self, userID, request_dict, response):
 
-         # perm = ModelService.check_perm_uid_manage(userID, 0)
 
-         # if not perm:
 
-         #     return response.json(309)
 
-         uid = request_dict.get('uid', None)
 
-         content = request_dict.get('content', None)
 
-         if uid and content:
 
-             content = json.loads(content)
 
-             print(content)
 
-             content['update_time'] = int(time.time())
 
-             uid_qs = HistoryUIDModel.objects.filter(uid=uid)
 
-             if uid_qs.exists():
 
-                 uid_qs.update(**content)
 
-                 return response.json(0)
 
-             else:
 
-                 return response.json(173)
 
-         else:
 
-             return response.json(444)
 
 
  |