views.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  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. from .models import Role, Permission # 新增角色和权限模型导入
  20. class APIViewSet(viewsets.ModelViewSet):
  21. """
  22. retrieve:
  23. Response a data list(get)
  24. list:
  25. Response a data list(all)
  26. create:
  27. Create a data line(post)
  28. delete:
  29. Delete a data line(delete)
  30. partial_update:
  31. Partial_update a data(patch:partial_update)
  32. update:
  33. Update a data(put:update)
  34. """
  35. pagination_class = MyPageNumberPagination
  36. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  37. ordering_fields = ['id', "create_time", "update_time", ]
  38. filter_class = Filter
  39. def list(self, request, *args, **kwargs):
  40. # staff_name = str(request.GET.get('staff_name'))
  41. # check_code = request.GET.get('check_code')
  42. # if staff_name == None and check_code == None:
  43. # return super().list(request, *args, **kwargs)
  44. # elif staff_name != None and check_code == None:
  45. # return super().list(request, *args, **kwargs)
  46. # else:
  47. # staff_name_obj = ListModel.objects.filter(openid=self.request.auth.openid, staff_name=staff_name,
  48. # is_delete=False).first()
  49. # if staff_name_obj is None:
  50. # raise APIException({"detail": "用户名不存在"})
  51. # elif staff_name_obj.is_lock is True:
  52. # raise APIException({"detail": "用户已被锁定,请联系管理员"})
  53. # elif staff_name_obj.error_check_code_counter == 3:
  54. # staff_name_obj.is_lock = True
  55. # staff_name_obj.error_check_code_counter = 0
  56. # staff_name_obj.save()
  57. # raise APIException({"detail": "用户已被锁定,请联系管理员"})
  58. # if type(check_code) == str:
  59. # check_code = int(check_code)
  60. # if check_code != None:
  61. # if staff_name_obj.check_code != check_code:
  62. # staff_name_obj.error_check_code_counter = int(staff_name_obj.error_check_code_counter) + 1
  63. # staff_name_obj.save()
  64. # raise APIException({"detail": "验证码错误"})
  65. # else:
  66. # staff_name_obj.error_check_code_counter = 0
  67. # staff_name_obj.save()
  68. # return super().list(request, *args, **kwargs)
  69. # else:
  70. return super().list(request, *args, **kwargs)
  71. def get_project(self):
  72. try:
  73. id = self.kwargs.get('pk')
  74. return id
  75. except:
  76. return None
  77. def get_queryset(self):
  78. id = self.get_project()
  79. if self.request.user:
  80. if id is None:
  81. return ListModel.objects.filter(is_delete=False)
  82. else:
  83. return ListModel.objects.filter(id=id, is_delete=False)
  84. else:
  85. return ListModel.objects.none()
  86. def get_serializer_class(self):
  87. appid = self.request.META.get('HTTP_APPID')
  88. token = self.request.META.get('HTTP_TOKEN')
  89. if appid != token :
  90. if self.action in ['list', 'retrieve', 'destroy']:
  91. return serializers.userStaffGetSerializer
  92. elif self.action in ['create']:
  93. return serializers.userStaffPostSerializer
  94. elif self.action in ['update']:
  95. return serializers.userStaffUpdateSerializer
  96. elif self.action in ['partial_update']:
  97. return serializers.userStaffPartialUpdateSerializer
  98. else:
  99. return self.http_method_not_allowed(request=self.request)
  100. else:
  101. if self.action in ['list', 'retrieve', 'destroy']:
  102. return serializers.StaffGetSerializer
  103. elif self.action in ['create']:
  104. return serializers.StaffPostSerializer
  105. elif self.action in ['update']:
  106. return serializers.StaffUpdateSerializer
  107. elif self.action in ['partial_update']:
  108. return serializers.StaffPartialUpdateSerializer
  109. else:
  110. return self.http_method_not_allowed(request=self.request)
  111. def create(self, request, *args, **kwargs):
  112. data = self.request.data
  113. data['openid'] = self.request.auth.openid
  114. # 检查角色是否存在
  115. role_name = data.get('role')
  116. if role_name:
  117. role, created = Role.objects.get_or_create(name=role_name)
  118. data['role'] = role.id
  119. if ListModel.objects.filter(openid=data['openid'], staff_name=data['staff_name'], is_delete=False).exists():
  120. raise APIException({"detail": "Data exists"})
  121. else:
  122. app_code = Md5.md5(data['staff_name'] + '1')
  123. data['appid'] = app_code
  124. check_code = random.randint(1000, 9999)
  125. data['check_code'] = check_code
  126. # 创建用户
  127. user = User.objects.create_user(
  128. username=str(data['staff_name']),
  129. password=str(check_code)
  130. )
  131. serializer = self.get_serializer(data=data)
  132. serializer.is_valid(raise_exception=True)
  133. serializer.save()
  134. headers = self.get_success_headers(serializer.data)
  135. return Response(serializer.data, status=200, headers=headers)
  136. def update(self, request, pk):
  137. qs = self.get_object()
  138. if qs.openid != self.request.auth.openid:
  139. creator = ListModel.objects.filter(openid=self.request.auth.openid, is_delete=False)
  140. raise APIException({"detail": "该用户不是您创建的,不能修改"})
  141. else:
  142. data = self.request.data
  143. # 更新角色
  144. role_name = data.get('role')
  145. if role_name:
  146. role, created = Role.objects.get_or_create(name=role_name)
  147. data['role'] = role.id
  148. serializer = self.get_serializer(qs, data=data)
  149. serializer.is_valid(raise_exception=True)
  150. serializer.save()
  151. headers = self.get_success_headers(serializer.data)
  152. return Response(serializer.data, status=200, headers=headers)
  153. def partial_update(self, request, pk):
  154. qs = self.get_object()
  155. if qs.openid != self.request.auth.openid:
  156. raise APIException({"detail": "Cannot Update Data Which Not Yours"})
  157. else:
  158. data = self.request.data
  159. # 更新角色
  160. role_name = data.get('role')
  161. if role_name:
  162. role, created = Role.objects.get_or_create(name=role_name)
  163. data['role'] = role.id
  164. serializer = self.get_serializer(qs, data=data, partial=True)
  165. serializer.is_valid(raise_exception=True)
  166. serializer.save()
  167. headers = self.get_success_headers(serializer.data)
  168. return Response(serializer.data, status=200, headers=headers)
  169. def destroy(self, request, pk):
  170. qs = self.get_object()
  171. if qs.openid != self.request.auth.openid:
  172. raise APIException({"detail": "Cannot Delete Data Which Not Yours"})
  173. else:
  174. qs.is_delete = True
  175. qs.save()
  176. serializer = self.get_serializer(qs, many=False)
  177. headers = self.get_success_headers(serializer.data)
  178. return Response(serializer.data, status=200, headers=headers)
  179. class RoleViewSet(viewsets.ModelViewSet):
  180. """角色管理API"""
  181. queryset = Role.objects.all()
  182. serializer_class = serializers.RoleSerializer
  183. pagination_class = MyPageNumberPagination
  184. filter_backends = [DjangoFilterBackend, OrderingFilter]
  185. ordering_fields = ['id', "name"]
  186. def get_queryset(self):
  187. return Role.objects.all()
  188. class PermissionViewSet(viewsets.ModelViewSet):
  189. """权限管理API"""
  190. queryset = Permission.objects.all()
  191. serializer_class = serializers.PermissionSerializer
  192. # pagination_class = MyPageNumberPagination
  193. filter_backends = [DjangoFilterBackend, OrderingFilter]
  194. ordering_fields = ['id', "page"]
  195. def get_queryset(self):
  196. role = self.request.query_params.get('role')
  197. if role:
  198. return Permission.objects.filter(role__name=role)
  199. return Permission.objects.all()
  200. class RolePermissionViewSet(viewsets.ViewSet):
  201. """角色权限配置API"""
  202. def list(self, request):
  203. """获取所有角色类型"""
  204. roles = Role.objects.values_list('name', flat=True).distinct()
  205. return Response(list(roles))
  206. def retrieve(self, request, pk=None):
  207. """获取特定角色的权限配置"""
  208. try:
  209. role = Role.objects.get(name=pk)
  210. serializer = serializers.RoleGETSerializer(role)
  211. return Response(serializer.data)
  212. except Role.DoesNotExist:
  213. return Response({"error": "Role not found"}, status=404)
  214. def update(self, request, pk=None):
  215. """更新角色权限"""
  216. try:
  217. role = Role.objects.get(name=pk)
  218. permissions_data = request.data.get('permissions', [])
  219. # 清除现有权限
  220. role.permissions.clear()
  221. # 添加新权限
  222. for perm_data in permissions_data:
  223. perm, created = Permission.objects.get_or_create(
  224. page=perm_data['page'],
  225. component=perm_data.get('component'),
  226. defaults={'enabled': perm_data['enabled']}
  227. )
  228. role.permissions.add(perm)
  229. return Response({"message": "Permissions updated successfully"})
  230. except Role.DoesNotExist:
  231. return Response({"error": "Role not found"}, status=404)
  232. class RolePagePermissionViewSet(viewsets.ViewSet):
  233. """角色权限配置API"""
  234. def list(self, request):
  235. """获取所有角色类型"""
  236. roles = Role.objects.values_list('name', flat=True).distinct()
  237. return Response(list(roles))
  238. def retrieve(self, request, pk=None):
  239. """获取特定角色的权限配置"""
  240. try:
  241. role = Role.objects.get(name=pk)
  242. serializer = serializers.RolePageGETSerializer(role)
  243. return Response(serializer.data)
  244. except Role.DoesNotExist:
  245. return Response({"error": "Role not found"}, status=404)
  246. def get_page_permissions(self, request, pk=None):
  247. """获取特定角色的页面访问权限配置"""
  248. try:
  249. role = Role.objects.get(name=pk)
  250. primary_page = request.data.get('primary_page')
  251. if primary_page:
  252. fliterpermissions= role.permissions.filter(primary_page=primary_page)
  253. serializer = self.get_permissions_group(fliterpermissions)
  254. return Response(serializer)
  255. serializer = self.get_permissions_group(role.permissions.all())
  256. return Response(serializer)
  257. except Role.DoesNotExist:
  258. return Response({"error": "Role not found"}, status=404)
  259. def get_permissions_group(self, permissions):
  260. # 获取角色关联的所有权限并预取数据
  261. # 按page字段分组,只处理component为null的权限
  262. page_access = {}
  263. for perm in permissions:
  264. # 只处理页面访问权限(component为null)
  265. if perm.component is None:
  266. page_access[perm.page] = perm.enabled
  267. # 转换为前端需要的格式
  268. return [{"page": page, "enabled": enabled} for page, enabled in page_access.items()]
  269. class TypeAPIViewSet(viewsets.ModelViewSet):
  270. """
  271. list:
  272. Response a data list(all)
  273. """
  274. pagination_class = MyPageNumberPagination
  275. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  276. ordering_fields = ['id', "create_time", "update_time", ]
  277. filter_class = TypeFilter
  278. def get_queryset(self):
  279. if self.request.user:
  280. return TypeListModel.objects.filter(openid='init_data')
  281. else:
  282. return TypeListModel.objects.none()
  283. def get_serializer_class(self):
  284. if self.action in ['list']:
  285. return serializers.StaffTypeGetSerializer
  286. else:
  287. return self.http_method_not_allowed(request=self.request)
  288. class FileDownloadView(viewsets.ModelViewSet):
  289. renderer_classes = (FileRenderCN,) + tuple(api_settings.DEFAULT_RENDERER_CLASSES)
  290. filter_backends = [DjangoFilterBackend, OrderingFilter, ]
  291. ordering_fields = ['id', "create_time", "update_time", ]
  292. filter_class = Filter
  293. def get_project(self):
  294. try:
  295. id = self.kwargs.get('pk')
  296. return id
  297. except:
  298. return None
  299. def get_queryset(self):
  300. id = self.get_project()
  301. if self.request.user:
  302. if id is None:
  303. return ListModel.objects.filter(openid=self.request.auth.openid, is_delete=False)
  304. else:
  305. return ListModel.objects.filter(openid=self.request.auth.openid, id=id, is_delete=False)
  306. else:
  307. return ListModel.objects.none()
  308. def get_serializer_class(self):
  309. if self.action in ['list']:
  310. return serializers.FileRenderSerializer
  311. else:
  312. return self.http_method_not_allowed(request=self.request)
  313. def get_lang(self, data):
  314. lang = self.request.META.get('HTTP_LANGUAGE')
  315. if lang:
  316. if lang == 'zh-hans':
  317. return FileRenderCN().render(data)
  318. else:
  319. return FileRenderEN().render(data)
  320. else:
  321. return FileRenderEN().render(data)
  322. def list(self, request, *args, **kwargs):
  323. from datetime import datetime
  324. dt = datetime.now()
  325. data = (
  326. FileRenderSerializer(instance).data
  327. for instance in self.filter_queryset(self.get_queryset())
  328. )
  329. renderer = self.get_lang(data)
  330. response = StreamingHttpResponse(
  331. renderer,
  332. content_type="text/csv"
  333. )
  334. response['Content-Disposition'] = "attachment; filename='staff_{}.csv'".format(
  335. str(dt.strftime('%Y%m%d%H%M%S%f')))
  336. return response