UIDController.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import time
  4. from django.utils.decorators import method_decorator
  5. from django.views import View
  6. from django.views.decorators.csrf import csrf_exempt
  7. from django.db.models import Avg,Max,Min,Count,Sum, Q # 引入函数
  8. from Model.models import UIDModel, UserModel, UserUIDModel, HistoryUIDModel
  9. from Object.ResponseObject import ResponseObject
  10. from Object.TokenObject import TokenObject
  11. class UIDView(View):
  12. @method_decorator(csrf_exempt)
  13. def dispatch(self, request, *args, **kwargs):
  14. return super(UIDView, self).dispatch(request, *args, **kwargs)
  15. def get(self, request, *args, **kwargs):
  16. request.encoding = 'utf-8'
  17. request_dict = request.GET
  18. operation = kwargs.get('operation')
  19. return self.validate(request_dict, operation)
  20. def post(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. request_dict = request.POST
  23. operation = kwargs.get('operation')
  24. return self.validate(request_dict, operation)
  25. def validate(self, request_dict, operation):
  26. token = request_dict.get('token', None)
  27. response = ResponseObject()
  28. token = TokenObject(token)
  29. if token.code != 0:
  30. return response.json(token.code)
  31. if operation == 'quantity':
  32. return self.do_quantity(request_dict, response)
  33. elif operation == 'allot':
  34. return self.do_allot(request_dict, response)
  35. elif operation == 'remove':
  36. return self.do_remove(request_dict, response)
  37. else:
  38. return response.json(309)
  39. # 查询当前可用的UID的数量
  40. def do_quantity(self, request_dict, response):
  41. token = request_dict.get('token', None)
  42. token = TokenObject(token)
  43. if token.code != 0:
  44. return response.json(token.code)
  45. user_qs = UserModel.objects.filter(id=token.userID)
  46. if user_qs.exists():
  47. user = user_qs[0]
  48. if user.permission == '0':
  49. return self.do_admin_quantity(request_dict, response, user.username)
  50. else:
  51. return self.do_not_admin_quantity(request_dict, response, user.username)
  52. else:
  53. return response.json(9)
  54. # 管理员的查询UID数量操作
  55. def do_admin_quantity(self, request_dict, response, admin):
  56. datas = []
  57. domestic = UIDModel.objects.filter(area=0, status=0).count()
  58. foreign = UIDModel.objects.filter(area=1, status=0).count()
  59. item = {}
  60. item['isAdmin'] = 1
  61. item['domestic'] = domestic
  62. item['foreign'] = foreign
  63. item['username'] = admin
  64. datas.append(item)
  65. user_qs = UserModel.objects.filter(~Q(Q(permission='0')))
  66. for user in user_qs:
  67. item = {'isAdmin': 0}
  68. result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=0).aggregate(num=Count('uid__status'))
  69. item['domestic'] = result['num']
  70. result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=1).aggregate(num=Count('uid__status'))
  71. item['foreign'] = result['num']
  72. item['username'] = user.username
  73. datas.append(item)
  74. return response.json(0, {'data': datas})
  75. # 非管理员的查询UID数量操作
  76. def do_not_admin_quantity(self, request_dict, response, username):
  77. user_qs = UserModel.objects.filter(username=username)
  78. if user_qs.exists():
  79. user = user_qs[0]
  80. datas = []
  81. item = {'isAdmin': 0}
  82. result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=0).aggregate(num=Count('uid__status'))
  83. item['domestic'] = result['num']
  84. result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=1).aggregate(num=Count('uid__status'))
  85. item['foreign'] = result['num']
  86. item['username'] = user.username
  87. datas.append(item)
  88. return response.json(0, {'data': datas})
  89. else:
  90. return response.json(444)
  91. # 分配UID
  92. def do_allot(self, request_dict, response):
  93. username = request_dict.get('username', None)
  94. quantity = int(request_dict.get('quantity', None))
  95. area = request_dict.get('area', None)
  96. token = request_dict.get('token', None)
  97. token = TokenObject(token)
  98. if token.code != 0:
  99. return response.json(token.code)
  100. user = UserModel.objects.get(id=token.userID)
  101. if not user or '0' not in user.permission:
  102. return response.json(404)
  103. # 要分配的对象
  104. allot_user_qs = UserModel.objects.filter(username=username)
  105. if not allot_user_qs.exists():
  106. return response.json(444, 'username')
  107. # 取出对应区域可用的UID分配给allot_user
  108. uid_qs = UIDModel.objects.filter(area=area, status=0)
  109. count = uid_qs.count()
  110. if count < quantity:
  111. return response.json(444, '设备UID不足')
  112. updates = []
  113. datas = []
  114. if uid_qs.exists():
  115. uid_qs = uid_qs[0:quantity]
  116. for item in uid_qs:
  117. item.status = 1
  118. item.update_time = time.time()
  119. user_uid = UserUIDModel()
  120. user_uid.uid = item
  121. user_uid.user = allot_user_qs[0]
  122. datas.append(user_uid)
  123. updates.append(item)
  124. if len(datas) % 5000 == 0:
  125. UserUIDModel.objects.bulk_create(datas)
  126. UIDModel.objects.bulk_update(updates, fields=['status', 'update_time'])
  127. datas.clear()
  128. updates.clear()
  129. if len(datas) > 0:
  130. UserUIDModel.objects.bulk_create(datas)
  131. UIDModel.objects.bulk_update(updates, fields=['status', 'update_time'])
  132. datas.clear()
  133. updates.clear()
  134. del datas
  135. del updates
  136. return response.json(0)
  137. else:
  138. return response.json(444)
  139. # 把UID表中的数据移动到HistoryUID表中
  140. def do_remove(self, request_dict, response):
  141. token = TokenObject(request_dict.get('token', None))
  142. id = request_dict.get('id', None)
  143. start = request_dict.get('start', None)
  144. stop = request_dict.get('stop', None)
  145. if token.code != 0:
  146. return response.json(token.code)
  147. # 通过userID查找用户,判断是否是管理员
  148. user_qs = UserModel.objects.filter(id=token.userID)
  149. if user_qs.exists():
  150. user = user_qs[0]
  151. if user.permission != '0':
  152. return response.json(404)
  153. else:
  154. return response.json(9)
  155. if id:
  156. return self.do_remove_by_id(id, response)
  157. elif start and stop:
  158. return self.do_bulk_remove(int(start), int(stop), response)
  159. else:
  160. return response.json(444, 'id,start,stop')
  161. # 移除单条UID记录,id:记录id
  162. def do_remove_by_id(self, id, response):
  163. id = int(id)
  164. uid_qs = UIDModel.objects.filter(id=id)
  165. if not uid_qs.exists():
  166. return response.json(173)
  167. uid = uid_qs[0]
  168. if uid:
  169. data = {
  170. 'uid': uid.uid,
  171. 'uid_extra': uid.uid_extra,
  172. 'status': uid.status,
  173. 'add_time': uid.add_time,
  174. 'update_time': uid.update_time,
  175. 'area': uid.area
  176. }
  177. HistoryUIDModel.objects.create(**data)
  178. uid.delete()
  179. return response.json(0)
  180. else:
  181. return response.json(444, 'id')
  182. # 批量移除UID记录。start:开始的UID记录的id;stop:结束的UID记录的id
  183. def do_bulk_remove(self, start, stop, response):
  184. uid_qs = UIDModel.objects.filter(id__range=(start, stop))
  185. histories = []
  186. if uid_qs.exists():
  187. for item in uid_qs:
  188. histories.append(HistoryUIDModel(
  189. uid=item.uid,
  190. uid_extra=item.uid_extra,
  191. status=item.status,
  192. add_time=item.add_time,
  193. update_time=item.update_time,
  194. area=item.area
  195. ))
  196. if len(histories) % 5000 == 0:
  197. HistoryUIDModel.objects.bulk_create(histories)
  198. histories.clear()
  199. if len(histories) > 0:
  200. HistoryUIDModel.objects.bulk_create(histories)
  201. histories.clear()
  202. uid_qs.delete()
  203. return response.json(0)
  204. else:
  205. return response.json(173)