UIDController.py 16 KB

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