| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505 | #!/usr/bin/env python3# -*- coding: utf-8 -*-import jsonimport loggingimport timefrom django.db import transactionfrom django.http import StreamingHttpResponsefrom django.utils.decorators import method_decoratorfrom django.views import Viewfrom django.views.decorators.csrf import csrf_exemptfrom django.db.models import Avg,Max,Min,Count,Sum, Q  #   引入函数from Model.models import UIDModel, UserModel, UserUIDModel, HistoryUIDModel, UIDCompanySerialModelfrom Object.RedisObject import RedisObjectfrom Object.uidManageResponseObject import uidManageResponseObjectfrom Object.TokenObject import TokenObjectfrom Service.ModelService import ModelServiceclass 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 = 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 == 'allot':            return self.do_allot(request_dict, response)        elif operation == 'remove':            return self.do_remove(request_dict, response)        elif operation == 'download':            return self.download_txt(token, response)        elif operation == 'download_1':            return self.download_txt_two(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)        elif operation == 'history':            return self.do_history(token.userID, request_dict, response)        elif operation == 'statistics':            return self.do_admin_statistics(token.userID, request_dict, response)        elif operation == 'queryInitString':            return self.query_init_string(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 = 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    @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 = UIDModel.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:                UserUIDModel.objects.bulk_create(datas)                UIDModel.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 = 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)    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 download_txt_two(self, token, response):        uid_qs = UIDModel.objects.filter(status=1)        if not uid_qs.exists():            return response.json(308)        uid_qs = uid_qs.values()        content = ''        for item in uid_qs:            # print(item)            content += item['uid']            content += '\r\n'        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 = UIDModel.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]                uid_list = []                for uobj in uid_qs:                    uid_list.append(uobj['id'])                serial_uid_qs = UIDCompanySerialModel.objects.filter(uid__id__in=uid_list).values('uid__id','company_serial__serial_number')                res['data'] = []                for uobj in uid_qs:                    list_data = uobj                    for data in list(serial_uid_qs):                            if uobj['id'] == data['uid__id']:                                list_data['serial_number'] = data['company_serial__serial_number']                    res['data'].append(list_data)            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)            UIDModel.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)            UIDModel.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)        print(content)        if uid and content:            content = json.loads(content)            print(content)            content['update_time'] = int(time.time())            uid_qs = UIDModel.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)    def do_history(self, userID, request_dict, response):        # perm = ModelService.check_perm_uid_manage(userID, 0)        # if not perm:        #     return response.json(309)        uid_qs = UIDModel.objects.filter(status=2)        if uid_qs.exists():            uids = []            for uid in uid_qs:                uids.append(uid)                if (len(uids) % 5000) == 0:                    HistoryUIDModel.objects.bulk_create(uids)                    uids.clear()            if len(uids) > 0:                HistoryUIDModel.objects.bulk_create(uids)                uids.clear()        uid_qs.delete()        return response.json(0)    def do_admin_statistics(self, userID, request_dict, response):        # perm = ModelService.check_perm_uid_manage(userID, 0)        # if not perm:        #     return response.json(309)        uid_not_use = UIDModel.objects.filter(status=0).count()        uid_allocated = UIDModel.objects.filter(status=1).count()        uid_has_use = UIDModel.objects.filter(status=2).count()        total = uid_not_use + uid_allocated + uid_has_use        res = {            'uid_not_use': uid_not_use,            'uid_allocated': uid_allocated,            'uid_has_use': uid_has_use,            'total': total        }        return response.json(0, res)    def query_init_string(self, userID, request_dict, response):        uid = request_dict.get('uid', None)        if not uid:            return response.json(444)        uid_qs = UIDModel.objects.filter(uid=uid).values('platform', 'init_string', 'init_string_app')        if not uid_qs.exists():            return response.json(173)        res = {            'platform': uid_qs[0]['platform'],            'initString': uid_qs[0]['init_string'],            'initStringApp': uid_qs[0]['init_string_app'],        }        return response.json(0, res)
 |