#!/usr/bin/env python3 # -*- coding: utf-8 -*- import time 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.ResponseObject import ResponseObject from Object.TokenObject import TokenObject class UIDView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(UIDView, 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 = ResponseObject() token = TokenObject(token) if token.code != 0: return response.json(token.code) if operation == 'quantity': return self.do_quantity(request_dict, response) elif operation == 'allot': return self.do_allot(request_dict, response) elif operation == 'remove': return self.do_remove(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 = UIDModel.objects.filter(area=0, status=0).count() foreign = UIDModel.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 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 = UIDModel.objects.filter(area=area, status=0) count = uid_qs.count() if count < quantity: return response.json(444, '设备UID不足') updates = [] datas = [] if uid_qs.exists(): uid_qs = uid_qs[0:quantity] 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] datas.append(user_uid) updates.append(item) if len(datas) % 5000 == 0: UserUIDModel.objects.bulk_create(datas) UIDModel.objects.bulk_update(updates, fields=['status', 'update_time']) datas.clear() updates.clear() if len(datas) > 0: UserUIDModel.objects.bulk_create(datas) UIDModel.objects.bulk_update(updates, fields=['status', 'update_time']) datas.clear() updates.clear() del datas del updates return response.json(0) else: return response.json(444) # 把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 = UIDModel.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)