FileController.py 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import base64
  4. import json
  5. import time
  6. import xlwt
  7. from django.http import StreamingHttpResponse, HttpResponse, QueryDict
  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 Model.models import UIDModel, UserUIDModel, UserModel, LogModel
  12. from Object.RedisObject import RedisObject
  13. from Object.TokenObject import TokenObject
  14. from Object.ResponseObject import ResponseObject
  15. from Service.CommonService import CommonService
  16. class UploadUIDFileView(View):
  17. @method_decorator(csrf_exempt)
  18. def dispatch(self, request, *args, **kwargs):
  19. return super(UploadUIDFileView, self).dispatch(request, *args, **kwargs)
  20. def get(self, request, *args, **kwargs):
  21. request.encoding = 'utf-8'
  22. request_dict = request.GET
  23. fileName = request.FILES.get('fileName', None)
  24. return self.validate(fileName, request_dict, request)
  25. def post(self, request, *args, **kwargs):
  26. request.encoding = 'utf-8'
  27. request_dict = request.POST
  28. fileName = request.FILES.get('fileName', None)
  29. return self.validate(fileName, request_dict, request)
  30. def validate(self, fileName, request_dict, request):
  31. token = request_dict.get('token', None)
  32. area = request_dict.get('area', None)
  33. isReset = request_dict.get('isReset', 0)
  34. content = request_dict.get('fileName', None)
  35. print('content')
  36. print(content)
  37. content = base64.b64decode(content).decode().strip()
  38. content = content[3:(len(content) - 3)]
  39. uids = content.split('\n')
  40. print(uids)
  41. response = ResponseObject()
  42. tko = TokenObject(token)
  43. if tko.code != 0:
  44. return response.json(tko.code)
  45. # if not fileName and not area:
  46. # return response.json(444, 'fileName,area')
  47. data = {}
  48. duplicate = []
  49. for line in uids:
  50. if data.__contains__(line):
  51. duplicate.append(line)
  52. else:
  53. data[line] = ''
  54. if isReset == 0:
  55. return self.do_insert(data, duplicate, area, response, request, tko)
  56. else:
  57. return self.do_reset(data, response, area, request, tko)
  58. def do_insert(self, data, duplicate, area, response, request, token):
  59. bulk = []
  60. count = 0
  61. add_time = int(time.time())
  62. update_time = int(time.time())
  63. keys = data.keys()
  64. # redisObject = RedisObject(db=3)
  65. for item in keys:
  66. key = item.strip()
  67. # value = redisObject.get_data(key)
  68. # if value is False:
  69. # # redisObject.set_data(key, '1', 600)
  70. # else:
  71. # duplicate.append(key)
  72. # continue
  73. bulk.append(UIDModel(
  74. uid=item.strip(),
  75. uid_extra='',
  76. status=0,
  77. add_time=add_time,
  78. update_time=update_time,
  79. area=area
  80. ))
  81. try:
  82. if (count % 5000) == 0:
  83. UIDModel.objects.bulk_create(bulk)
  84. bulk.clear()
  85. except Exception as e:
  86. print(repr(e))
  87. return response.json(174, str(e))
  88. count += 1
  89. if len(bulk) > 0:
  90. UIDModel.objects.bulk_create(bulk)
  91. bulk.clear()
  92. del data
  93. del bulk
  94. # print('重复:')
  95. # print(duplicate)
  96. operation = self.formatOperation(operation='上传', quantity=int(count), area=int(area))
  97. self.add_log(request, operation, token)
  98. return response.json(0, {'count': count, 'duplicate_count': len(duplicate), 'data': duplicate})
  99. def do_reset(self, data, response, area, request, token):
  100. keys = data.keys()
  101. uids = []
  102. count = 0
  103. for key in keys:
  104. uids.append(key)
  105. if len(uids) % 5000 == 0:
  106. count += self.do_update_uid_status(uids, area)
  107. uids.clear()
  108. if len(uids) > 0:
  109. count += self.do_update_uid_status(uids, area)
  110. uids.clear()
  111. operation = self.formatOperation('重置', int(count), int(area))
  112. self.add_log(request, operation, token)
  113. return response.json(0)
  114. def do_update_uid_status(self, uids, area):
  115. uid_qs = UIDModel.objects.filter(uid__in=uids, area=area, status=2)
  116. if uid_qs.exists():
  117. for uid in uid_qs:
  118. if uid.status == 2:
  119. uid.status = 1
  120. UIDModel.objects.bulk_update(uid_qs, fields=['status'])
  121. return uid_qs.count()
  122. return 0
  123. def add_log(self, request, operation, token):
  124. ip = CommonService.get_ip_address(request)
  125. now_time = time.time()
  126. content = json.dumps(request.POST)
  127. user_qs = UserModel.objects.filter(id=token.userID)
  128. log = {
  129. 'status': 200,
  130. 'content': content,
  131. 'ip': ip,
  132. 'time': now_time,
  133. 'url': 'upload',
  134. 'operation': operation,
  135. 'user': user_qs[0]
  136. }
  137. try:
  138. LogModel.objects.create(**log)
  139. except Exception as e:
  140. print(repr(e))
  141. def formatOperation(self, operation, quantity, area):
  142. str = '{operation}{quantity}个{area}UID'
  143. if area == 0:
  144. return str.format(operation=operation, quantity=quantity, area='国内')
  145. else:
  146. return str.format(operation=operation, quantity=quantity, area='国外')
  147. class DownloadUIDFileView(View):
  148. @method_decorator(csrf_exempt)
  149. def dispatch(self, request, *args, **kwargs):
  150. return super(DownloadUIDFileView, self).dispatch(request, *args, **kwargs)
  151. def get(self, request, *args, **kwargs):
  152. request.encoding = 'utf-8'
  153. request_dict = request.GET
  154. return self.validate(request_dict)
  155. def post(self, request, *args, **kwargs):
  156. request.encoding = 'utf-8'
  157. request_dict = request.POST
  158. return self.validate(request_dict)
  159. def validate(self, request_dict):
  160. token = request_dict.get('token', None)
  161. area = request_dict.get('area', None)
  162. quantity = int(request_dict.get('quantity', None))
  163. fileType = request_dict.get('fileType', None)
  164. response = ResponseObject()
  165. # print(area)
  166. # print(quantity)
  167. token = TokenObject(token)
  168. if token.code != 0:
  169. return response.json(token.code)
  170. if not area:
  171. return response.json(444, 'area')
  172. area = int(area)
  173. if area >= 0 and quantity > 0:
  174. uid_qs = UserUIDModel.objects.filter(user__id=token.userID, uid__status=1, uid__area=area). \
  175. values('uid__id', 'uid__uid', 'uid__uid_extra', 'uid__add_time', 'uid__update_time', 'uid__area')
  176. count = uid_qs.count()
  177. if count < quantity:
  178. return response.json(444, '设备UID不足')
  179. if uid_qs.exists():
  180. uid_qs = uid_qs[0:quantity]
  181. if fileType == 'txt':
  182. return self.download_txt(uid_qs)
  183. elif fileType == 'excel':
  184. return self.download_excel(uid_qs)
  185. else:
  186. return response.json(444, 'fileType')
  187. else:
  188. return response.json(444, '111')
  189. else:
  190. return response.json(444, '222')
  191. def download_txt(self, uid_qs):
  192. updates = []
  193. content = ''
  194. for item in uid_qs:
  195. content += item['uid__uid']
  196. content += '\n'
  197. updates.append(UIDModel(
  198. id=item['uid__id'],
  199. uid=item['uid__uid'],
  200. uid_extra=item['uid__uid_extra'],
  201. status=2,
  202. add_time=item['uid__add_time'],
  203. update_time=item['uid__update_time'],
  204. area=item['uid__area']
  205. ))
  206. if len(updates) % 5000 == 0:
  207. UIDModel.objects.bulk_update(updates, fields=["status"])
  208. updates.clear()
  209. # print(item['uid__uid'])
  210. if len(updates) > 0:
  211. UIDModel.objects.bulk_update(updates, fields=["status"])
  212. updates.clear()
  213. del updates
  214. content = content[0:len(content) - 1]
  215. response = StreamingHttpResponse(content)
  216. response['Content-Type'] = 'application/octet-stream'
  217. response['Content-Disposition'] = 'attachment;filename=UID'+time.strftime('-%Y-%m-%d-%H-%M-%S', time.localtime()) + '.txt'
  218. return response
  219. def download_excel(self, uid_qs):
  220. response = HttpResponse(content_type='application/vnd.ms-excel')
  221. response['Content-Disposition'] = 'attachment; filename=UID' + time.strftime('-%Y-%m-%d-%H-%M-%S', time.localtime()) + '.xls'
  222. workbook = xlwt.Workbook(encoding='utf-8')
  223. sheet1 = workbook.add_sheet('UID')
  224. row1 = [u'设备UID']
  225. for i in range(0, len(row1)):
  226. sheet1.write(0, i, row1[i])
  227. num = 1
  228. updates = []
  229. for item in uid_qs:
  230. uid = item['uid']
  231. sheet1.write(num, 0, uid)
  232. num += 1
  233. updates.append(UIDModel(
  234. id=item['id'],
  235. uid=item['uid'],
  236. uid_extra=item['uid_extra'],
  237. status=1,
  238. add_time=item['add_time'],
  239. update_time=item['update_time'],
  240. area=item['area']
  241. ))
  242. UIDModel.objects.bulk_update(updates, fields=["status"])
  243. workbook.save(response)
  244. return response