views.py 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. from rest_framework import viewsets
  2. from .models import ListModel, TypeListModel
  3. from . import serializers
  4. from utils.page import MyPageNumberPagination
  5. from rest_framework.filters import OrderingFilter
  6. from django_filters.rest_framework import DjangoFilterBackend
  7. from rest_framework.response import Response
  8. from .filter import Filter, TypeFilter
  9. from rest_framework.exceptions import APIException
  10. from .serializers import FileRenderSerializer
  11. from django.http import StreamingHttpResponse
  12. from .files import FileRenderCN, FileRenderEN
  13. from rest_framework.settings import api_settings
  14. from rest_framework import permissions
  15. from staff.models import ListModel as staff
  16. from utils.md5 import Md5
  17. import random
  18. from django.contrib.auth.models import User
  19. class APIViewSet(viewsets.ModelViewSet):
  20. """
  21. retrieve:
  22. Response a data list(get)
  23. list:
  24. Response a data list(all)
  25. create:
  26. Create a data line(post)
  27. delete:
  28. Delete a data line(delete)
  29. partial_update:
  30. Partial_update a data(patch:partial_update)
  31. update:
  32. Update a data(put:update)
  33. """
  34. pagination_class = MyPageNumberPagination
  35. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  36. ordering_fields = ['id', "create_time", "update_time", ]
  37. filter_class = Filter
  38. def list(self, request, *args, **kwargs):
  39. # staff_name = str(request.GET.get('staff_name'))
  40. # check_code = request.GET.get('check_code')
  41. # if staff_name == None and check_code == None:
  42. # return super().list(request, *args, **kwargs)
  43. # elif staff_name != None and check_code == None:
  44. # return super().list(request, *args, **kwargs)
  45. # else:
  46. # staff_name_obj = ListModel.objects.filter(openid=self.request.auth.openid, staff_name=staff_name,
  47. # is_delete=False).first()
  48. # if staff_name_obj is None:
  49. # raise APIException({"detail": "用户名不存在"})
  50. # elif staff_name_obj.is_lock is True:
  51. # raise APIException({"detail": "用户已被锁定,请联系管理员"})
  52. # elif staff_name_obj.error_check_code_counter == 3:
  53. # staff_name_obj.is_lock = True
  54. # staff_name_obj.error_check_code_counter = 0
  55. # staff_name_obj.save()
  56. # raise APIException({"detail": "用户已被锁定,请联系管理员"})
  57. # if type(check_code) == str:
  58. # check_code = int(check_code)
  59. # if check_code != None:
  60. # if staff_name_obj.check_code != check_code:
  61. # staff_name_obj.error_check_code_counter = int(staff_name_obj.error_check_code_counter) + 1
  62. # staff_name_obj.save()
  63. # raise APIException({"detail": "验证码错误"})
  64. # else:
  65. # staff_name_obj.error_check_code_counter = 0
  66. # staff_name_obj.save()
  67. # return super().list(request, *args, **kwargs)
  68. # else:
  69. return super().list(request, *args, **kwargs)
  70. def get_project(self):
  71. try:
  72. id = self.kwargs.get('pk')
  73. return id
  74. except:
  75. return None
  76. def get_queryset(self):
  77. id = self.get_project()
  78. if self.request.user:
  79. if id is None:
  80. return ListModel.objects.filter(is_delete=False)
  81. else:
  82. return ListModel.objects.filter(id=id, is_delete=False)
  83. else:
  84. return ListModel.objects.none()
  85. def get_serializer_class(self):
  86. appid = self.request.META.get('HTTP_APPID')
  87. token = self.request.META.get('HTTP_TOKEN')
  88. if appid != token :
  89. if self.action in ['list', 'retrieve', 'destroy']:
  90. return serializers.userStaffGetSerializer
  91. elif self.action in ['create']:
  92. return serializers.userStaffPostSerializer
  93. elif self.action in ['update']:
  94. return serializers.userStaffUpdateSerializer
  95. elif self.action in ['partial_update']:
  96. return serializers.userStaffPartialUpdateSerializer
  97. else:
  98. return self.http_method_not_allowed(request=self.request)
  99. else:
  100. if self.action in ['list', 'retrieve', 'destroy']:
  101. return serializers.StaffGetSerializer
  102. elif self.action in ['create']:
  103. return serializers.StaffPostSerializer
  104. elif self.action in ['update']:
  105. return serializers.StaffUpdateSerializer
  106. elif self.action in ['partial_update']:
  107. return serializers.StaffPartialUpdateSerializer
  108. else:
  109. return self.http_method_not_allowed(request=self.request)
  110. def create(self, request, *args, **kwargs):
  111. data = self.request.data
  112. data['openid'] = self.request.auth.openid
  113. if ListModel.objects.filter(openid=data['openid'], staff_name=data['staff_name'], is_delete=False).exists():
  114. raise APIException({"detail": "Data exists"})
  115. else:
  116. app_code =Md5.md5(data['staff_name']+ '1')
  117. data['appid'] = app_code
  118. check_code = random.randint(1000, 9999)
  119. data['check_code'] = check_code
  120. user = User.objects.create_user(username=str(data['staff_name']),
  121. password=str(check_code))
  122. serializer = self.get_serializer(data=data)
  123. serializer.is_valid(raise_exception=True)
  124. serializer.save()
  125. headers = self.get_success_headers(serializer.data)
  126. return Response(serializer.data, status=200, headers=headers)
  127. def update(self, request, pk):
  128. qs = self.get_object()
  129. if qs.openid != self.request.auth.openid:
  130. creator = ListModel.objects.filter(openid=self.request.auth.openid, is_delete=False)
  131. raise APIException({"detail": "该用户不是您创建的,不能修改"})
  132. else:
  133. data = self.request.data
  134. serializer = self.get_serializer(qs, data=data)
  135. serializer.is_valid(raise_exception=True)
  136. serializer.save()
  137. headers = self.get_success_headers(serializer.data)
  138. return Response(serializer.data, status=200, headers=headers)
  139. def partial_update(self, request, pk):
  140. qs = self.get_object()
  141. if qs.openid != self.request.auth.openid:
  142. raise APIException({"detail": "Cannot Update Data Which Not Yours"})
  143. else:
  144. data = self.request.data
  145. serializer = self.get_serializer(qs, data=data, partial=True)
  146. serializer.is_valid(raise_exception=True)
  147. serializer.save()
  148. headers = self.get_success_headers(serializer.data)
  149. return Response(serializer.data, status=200, headers=headers)
  150. def destroy(self, request, pk):
  151. qs = self.get_object()
  152. if qs.openid != self.request.auth.openid:
  153. raise APIException({"detail": "Cannot Delete Data Which Not Yours"})
  154. else:
  155. qs.is_delete = True
  156. qs.save()
  157. serializer = self.get_serializer(qs, many=False)
  158. headers = self.get_success_headers(serializer.data)
  159. return Response(serializer.data, status=200, headers=headers)
  160. class TypeAPIViewSet(viewsets.ModelViewSet):
  161. """
  162. list:
  163. Response a data list(all)
  164. """
  165. pagination_class = MyPageNumberPagination
  166. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  167. ordering_fields = ['id', "create_time", "update_time", ]
  168. filter_class = TypeFilter
  169. def get_queryset(self):
  170. if self.request.user:
  171. return TypeListModel.objects.filter(openid='init_data')
  172. else:
  173. return TypeListModel.objects.none()
  174. def get_serializer_class(self):
  175. if self.action in ['list']:
  176. return serializers.StaffTypeGetSerializer
  177. else:
  178. return self.http_method_not_allowed(request=self.request)
  179. class FileDownloadView(viewsets.ModelViewSet):
  180. renderer_classes = (FileRenderCN,) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
  181. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  182. ordering_fields = ['id', "create_time", "update_time", ]
  183. filter_class = Filter
  184. def get_project(self):
  185. try:
  186. id = self.kwargs.get('pk')
  187. return id
  188. except:
  189. return None
  190. def get_queryset(self):
  191. id = self.get_project()
  192. if self.request.user:
  193. if id is None:
  194. return ListModel.objects.filter(openid=self.request.auth.openid, is_delete=False)
  195. else:
  196. return ListModel.objects.filter(openid=self.request.auth.openid, id=id, is_delete=False)
  197. else:
  198. return ListModel.objects.none()
  199. def get_serializer_class(self):
  200. if self.action in ['list']:
  201. return serializers.FileRenderSerializer
  202. else:
  203. return self.http_method_not_allowed(request=self.request)
  204. def get_lang(self, data):
  205. lang = self.request.META.get('HTTP_LANGUAGE')
  206. if lang:
  207. if lang == 'zh-hans':
  208. return FileRenderCN().render(data)
  209. else:
  210. return FileRenderEN().render(data)
  211. else:
  212. return FileRenderEN().render(data)
  213. def list(self, request, *args, **kwargs):
  214. from datetime import datetime
  215. dt = datetime.now()
  216. data = (
  217. FileRenderSerializer(instance).data
  218. for instance in self.filter_queryset(self.get_queryset())
  219. )
  220. renderer = self.get_lang(data)
  221. response = StreamingHttpResponse(
  222. renderer,
  223. content_type="text/csv"
  224. )
  225. response['Content-Disposition'] = "attachment; filename='staff_{}.csv'".format(
  226. str(dt.strftime('%Y%m%d%H%M%S%f')))
  227. return response