HistoryUIDController.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  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. from Service.ModelService import ModelService
  17. class HistoryUIDView(View):
  18. @method_decorator(csrf_exempt)
  19. def dispatch(self, request, *args, **kwargs):
  20. return super(HistoryUIDView, self).dispatch(request, *args, **kwargs)
  21. def get(self, request, *args, **kwargs):
  22. request.encoding = 'utf-8'
  23. request_dict = request.GET
  24. operation = kwargs.get('operation')
  25. return self.validate(request_dict, operation)
  26. def post(self, request, *args, **kwargs):
  27. request.encoding = 'utf-8'
  28. request_dict = request.POST
  29. operation = kwargs.get('operation')
  30. return self.validate(request_dict, operation)
  31. def validate(self, request_dict, operation):
  32. token = request_dict.get('token', None)
  33. response = ResponseObject()
  34. token = TokenObject(token)
  35. if token.code != 0:
  36. return response.json(token.code)
  37. if operation == 'quantity':
  38. return self.do_quantity(request_dict, response)
  39. elif operation == 'remove':
  40. return self.do_remove(request_dict, response)
  41. elif operation == 'download':
  42. return self.download_txt(token, response)
  43. elif operation == 'list':
  44. return self.do_list(request_dict, response)
  45. elif operation == 'delete':
  46. return self.do_delete(token.userID, request_dict, response)
  47. elif operation == 'batchDelete':
  48. return self.do_batch_delete(token.userID, request_dict, response)
  49. elif operation == 'adminUpdate':
  50. return self.do_admin_update(token.userID, request_dict, response)
  51. else:
  52. return response.json(309)
  53. # 查询当前可用的UID的数量
  54. def do_quantity(self, request_dict, response):
  55. token = request_dict.get('token', None)
  56. token = TokenObject(token)
  57. if token.code != 0:
  58. return response.json(token.code)
  59. user_qs = UserModel.objects.filter(id=token.userID)
  60. if user_qs.exists():
  61. user = user_qs[0]
  62. if user.permission == '0':
  63. return self.do_admin_quantity(request_dict, response, user.username)
  64. else:
  65. return self.do_not_admin_quantity(request_dict, response, user.username)
  66. else:
  67. return response.json(9)
  68. # 管理员的查询UID数量操作
  69. def do_admin_quantity(self, request_dict, response, admin):
  70. datas = []
  71. domestic = HistoryUIDModel.objects.filter(area=0, status=0).count()
  72. foreign = HistoryUIDModel.objects.filter(area=1, status=0).count()
  73. item = {}
  74. item['isAdmin'] = 1
  75. item['domestic'] = domestic
  76. item['foreign'] = foreign
  77. item['username'] = admin
  78. datas.append(item)
  79. user_qs = UserModel.objects.filter(~Q(Q(permission='0')))
  80. for user in user_qs:
  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. # 非管理员的查询UID数量操作
  90. def do_not_admin_quantity(self, request_dict, response, username):
  91. user_qs = UserModel.objects.filter(username=username)
  92. if user_qs.exists():
  93. user = user_qs[0]
  94. datas = []
  95. item = {'isAdmin': 0}
  96. result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=0).aggregate(num=Count('uid__status'))
  97. item['domestic'] = result['num']
  98. result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=1).aggregate(num=Count('uid__status'))
  99. item['foreign'] = result['num']
  100. item['username'] = user.username
  101. datas.append(item)
  102. return response.json(0, {'data': datas})
  103. else:
  104. return response.json(444)
  105. # 分配UID
  106. @transaction.atomic
  107. def do_allot(self, request_dict, response):
  108. username = request_dict.get('username', None)
  109. quantity = int(request_dict.get('quantity', None))
  110. area = request_dict.get('area', None)
  111. token = request_dict.get('token', None)
  112. token = TokenObject(token)
  113. if token.code != 0:
  114. return response.json(token.code)
  115. user = UserModel.objects.get(id=token.userID)
  116. if not user or '0' not in user.permission:
  117. return response.json(404)
  118. # 要分配的对象
  119. allot_user_qs = UserModel.objects.filter(username=username)
  120. if not allot_user_qs.exists():
  121. return response.json(444, 'username')
  122. # 取出对应区域可用的UID分配给allot_user
  123. uid_qs = HistoryUIDModel.objects.filter(area=area, status=0)
  124. count = uid_qs.count()
  125. if count < quantity:
  126. return response.json(444, '设备UID不足')
  127. updates = []
  128. datas = []
  129. count = 0
  130. if uid_qs.exists():
  131. uid_qs = uid_qs[0:quantity]
  132. now_time = int(time.time())
  133. savePoint = transaction.savepoint()
  134. for item in uid_qs:
  135. item.status = 1
  136. item.update_time = time.time()
  137. user_uid = UserUIDModel()
  138. user_uid.uid = item
  139. user_uid.user = allot_user_qs[0]
  140. user_uid.add_time = now_time
  141. user_uid.update_time = now_time
  142. datas.append(user_uid)
  143. updates.append(item)
  144. if len(datas) % 5000 == 0:
  145. result = self.do_update(datas, updates, savePoint)
  146. if result != 0:
  147. return response.json(result)
  148. if len(datas) > 0:
  149. result = self.do_update(datas, updates, savePoint)
  150. if result != 0:
  151. return response.json(result)
  152. redisObject = RedisObject()
  153. values = uid_qs.values('uid')
  154. print(values)
  155. redisObject.set_data(key=token.token, val=json.dumps(list(values)), expire=3600)
  156. del datas
  157. del updates
  158. return response.json(0)
  159. else:
  160. return response.json(444)
  161. def do_update(self, datas, updates, savePoint, count=0):
  162. try:
  163. try:
  164. if count == 2:
  165. raise Exception("Invalid level!")
  166. UserUIDModel.objects.bulk_create(datas)
  167. HistoryUIDModel.objects.bulk_update(updates, fields=['status', 'update_time'])
  168. datas.clear()
  169. updates.clear()
  170. except Exception as e:
  171. if savePoint:
  172. transaction.savepoint_rollback(savePoint)
  173. djangoLogger = logging.getLogger('django')
  174. djangoLogger.exception(repr(e))
  175. return 174
  176. except Exception as e:
  177. return 174
  178. return 0
  179. # 把UID表中的数据移动到HistoryUID表中
  180. def do_remove(self, request_dict, response):
  181. token = TokenObject(request_dict.get('token', None))
  182. id = request_dict.get('id', None)
  183. start = request_dict.get('start', None)
  184. stop = request_dict.get('stop', None)
  185. if token.code != 0:
  186. return response.json(token.code)
  187. # 通过userID查找用户,判断是否是管理员
  188. user_qs = UserModel.objects.filter(id=token.userID)
  189. if user_qs.exists():
  190. user = user_qs[0]
  191. if user.permission != '0':
  192. return response.json(404)
  193. else:
  194. return response.json(9)
  195. if id:
  196. return self.do_remove_by_id(id, response)
  197. elif start and stop:
  198. return self.do_bulk_remove(int(start), int(stop), response)
  199. else:
  200. return response.json(444, 'id,start,stop')
  201. # 移除单条UID记录,id:记录id
  202. def do_remove_by_id(self, id, response):
  203. id = int(id)
  204. uid_qs = HistoryUIDModel.objects.filter(id=id)
  205. if not uid_qs.exists():
  206. return response.json(173)
  207. uid = uid_qs[0]
  208. if uid:
  209. data = {
  210. 'uid': uid.uid,
  211. 'uid_extra': uid.uid_extra,
  212. 'status': uid.status,
  213. 'add_time': uid.add_time,
  214. 'update_time': uid.update_time,
  215. 'area': uid.area
  216. }
  217. HistoryUIDModel.objects.create(**data)
  218. uid.delete()
  219. return response.json(0)
  220. else:
  221. return response.json(444, 'id')
  222. # 批量移除UID记录。start:开始的UID记录的id;stop:结束的UID记录的id
  223. def do_bulk_remove(self, start, stop, response):
  224. uid_qs = UIDModel.objects.filter(id__range=(start, stop))
  225. histories = []
  226. if uid_qs.exists():
  227. for item in uid_qs:
  228. histories.append(HistoryUIDModel(
  229. uid=item.uid,
  230. uid_extra=item.uid_extra,
  231. status=item.status,
  232. add_time=item.add_time,
  233. update_time=item.update_time,
  234. area=item.area
  235. ))
  236. if len(histories) % 5000 == 0:
  237. HistoryUIDModel.objects.bulk_create(histories)
  238. histories.clear()
  239. if len(histories) > 0:
  240. HistoryUIDModel.objects.bulk_create(histories)
  241. histories.clear()
  242. uid_qs.delete()
  243. return response.json(0)
  244. else:
  245. return response.json(173)
  246. def download_txt(self, token, response):
  247. redisObject = RedisObject()
  248. uid_qs = redisObject.get_data(key=token.token)
  249. if uid_qs is False:
  250. return response.json(308)
  251. uid_qs = json.loads(uid_qs)
  252. content = ''
  253. for item in uid_qs:
  254. # print(item)
  255. content += item['uid']
  256. content += '\r\n'
  257. redisObject.del_data(key=token.token)
  258. content = content[0:len(content) - 1]
  259. response = StreamingHttpResponse(content)
  260. response['Content-Type'] = 'application/octet-stream'
  261. filename = 'uid_need_to_set_up_push.txt'
  262. response['Content-Disposition'] = 'attachment;filename=' + filename
  263. return response
  264. def do_list(self, request_dict, response):
  265. page = request_dict.get('page', None)
  266. line = request_dict.get('limit', None)
  267. status = request_dict.get('status', None)
  268. area = request_dict.get('area', None)
  269. start_time = request_dict.get('starttime', None)
  270. stop_time = request_dict.get('endtime', None)
  271. uid = request_dict.get('uid', None)
  272. if page and line:
  273. uid_qs = HistoryUIDModel.objects.filter()
  274. res = {
  275. 'count': 0,
  276. 'data': []
  277. }
  278. if uid_qs.exists():
  279. page = int(page)
  280. line = int(line)
  281. start = (page - 1) * line
  282. end = start + line
  283. if uid:
  284. uid_qs = uid_qs.filter(uid=uid)
  285. if status:
  286. uid_qs = uid_qs.filter(status=status)
  287. if area:
  288. uid_qs = uid_qs.filter(area=area)
  289. if start_time:
  290. uid_qs = uid_qs.filter(update_time__gte=start_time)
  291. if stop_time:
  292. if stop_time > start:
  293. uid_qs = uid_qs.filter(update_time__lte=stop_time)
  294. res['count'] = uid_qs.count()
  295. uid_qs = uid_qs.values()[start:end]
  296. res['data'] = list(uid_qs)
  297. print(res)
  298. return response.json(0, res)
  299. else:
  300. return response.json(444)
  301. def do_delete(self, userID, request_dict, response):
  302. uid = request_dict.get('uid', None)
  303. user_qs = UserModel.objects.filter(id=userID)
  304. if user_qs.exists():
  305. user = user_qs[0]
  306. if int(user.permission) != 0:
  307. return response.json(309)
  308. HistoryUIDModel.objects.filter(uid=uid).delete()
  309. return response.json(0)
  310. else:
  311. return response.json(309)
  312. def do_batch_delete(self, userID, request_dict, response):
  313. perm = ModelService.check_perm(userID, 0)
  314. if not perm:
  315. return response.json(309)
  316. uids = request_dict.get('uidlist', None)
  317. if uids:
  318. uids = json.loads(uids)
  319. HistoryUIDModel.objects.filter(uid__in=uids).delete()
  320. return response.json(0)
  321. else:
  322. return response.json(444)
  323. def do_admin_update(self, userID, request_dict, response):
  324. perm = ModelService.check_perm(userID, 0)
  325. if not perm:
  326. return response.json(309)
  327. uid = request_dict.get('uid', None)
  328. content = request_dict.get('content', None)
  329. if uid and content:
  330. content = json.loads(content)
  331. print(content)
  332. content['update_time'] = int(time.time())
  333. uid_qs = HistoryUIDModel.objects.filter(uid=uid)
  334. if uid_qs.exists():
  335. uid_qs.update(**content)
  336. return response.json(0)
  337. else:
  338. return response.json(173)
  339. else:
  340. return response.json(444)