UIDController.py 9.8 KB

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