UIDController.py 11 KB

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