views.py 17 KB

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