role.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. # -*- coding: utf-8 -*-
  2. """
  3. @author: Allen
  4. @Created on: 2023/10/18
  5. @Remark: 角色管理
  6. """
  7. from rest_framework import serializers
  8. from rest_framework.decorators import action
  9. from rest_framework.permissions import IsAuthenticated
  10. from dvadmin.system.models import Role, Menu, MenuButton, Dept
  11. from dvadmin.system.views.dept import DeptSerializer
  12. from dvadmin.system.views.menu import MenuSerializer
  13. from dvadmin.system.views.menu_button import MenuButtonSerializer
  14. from dvadmin.utils.json_response import SuccessResponse, DetailResponse
  15. from dvadmin.utils.serializers import CustomModelSerializer
  16. from dvadmin.utils.validator import CustomUniqueValidator
  17. from dvadmin.utils.viewset import CustomModelViewSet
  18. class RoleSerializer(CustomModelSerializer):
  19. """
  20. 角色-序列化器
  21. """
  22. class Meta:
  23. model = Role
  24. fields = "__all__"
  25. read_only_fields = ["id"]
  26. class RoleInitSerializer(CustomModelSerializer):
  27. """
  28. 初始化获取数信息(用于生成初始化json文件)
  29. """
  30. class Meta:
  31. model = Role
  32. fields = ['name', 'key', 'sort', 'status', 'admin', 'data_range', 'remark',
  33. 'creator', 'dept_belong_id']
  34. read_only_fields = ["id"]
  35. extra_kwargs = {
  36. 'creator': {'write_only': True},
  37. 'dept_belong_id': {'write_only': True}
  38. }
  39. class RoleCreateUpdateSerializer(CustomModelSerializer):
  40. """
  41. 角色管理 创建/更新时的列化器
  42. """
  43. menu = MenuSerializer(many=True, read_only=True)
  44. dept = DeptSerializer(many=True, read_only=True)
  45. permission = MenuButtonSerializer(many=True, read_only=True)
  46. key = serializers.CharField(max_length=50,
  47. validators=[CustomUniqueValidator(queryset=Role.objects.all(), message="权限字符必须唯一")])
  48. name = serializers.CharField(max_length=50, validators=[CustomUniqueValidator(queryset=Role.objects.all())])
  49. def validate(self, attrs: dict):
  50. return super().validate(attrs)
  51. def save(self, **kwargs):
  52. is_superuser = self.request.user.is_superuser
  53. if not is_superuser:
  54. self.validated_data.pop('admin')
  55. data = super().save(**kwargs)
  56. data.dept.set(self.initial_data.get('dept', []))
  57. data.menu.set(self.initial_data.get('menu', []))
  58. data.permission.set(self.initial_data.get('permission', []))
  59. return data
  60. class Meta:
  61. model = Role
  62. fields = '__all__'
  63. class MenuPermissonSerializer(CustomModelSerializer):
  64. """
  65. 菜单的按钮权限
  66. """
  67. menuPermission = serializers.SerializerMethodField()
  68. def get_menuPermission(self, instance):
  69. is_superuser = self.request.user.is_superuser
  70. if is_superuser:
  71. queryset = MenuButton.objects.filter(menu__id=instance.id)
  72. else:
  73. menu_permission_id_list = self.request.user.role.values_list('permission',flat=True)
  74. queryset = MenuButton.objects.filter(id__in=menu_permission_id_list,menu__id=instance.id)
  75. serializer = MenuButtonSerializer(queryset,many=True, read_only=True)
  76. return serializer.data
  77. class Meta:
  78. model = Menu
  79. fields = ['id', 'parent', 'name', 'menuPermission']
  80. class RoleViewSet(CustomModelViewSet):
  81. """
  82. 角色管理接口
  83. list:查询
  84. create:新增
  85. update:修改
  86. retrieve:单例
  87. destroy:删除
  88. """
  89. queryset = Role.objects.all()
  90. serializer_class = RoleSerializer
  91. create_serializer_class = RoleCreateUpdateSerializer
  92. update_serializer_class = RoleCreateUpdateSerializer
  93. search_fields = ['name', 'key']
  94. @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
  95. def role_get_menu(self, request):
  96. """根据当前用户的角色返回角色拥有的菜单"""
  97. is_superuser = request.user.is_superuser
  98. is_admin = request.user.role.values_list('admin',flat=True)
  99. if is_superuser or True in is_admin:
  100. queryset = Menu.objects.filter(status=1).all()
  101. else:
  102. menu_id_list = request.user.role.values_list('menu',flat=True)
  103. queryset = Menu.objects.filter(id__in=menu_id_list)
  104. # queryset = self.filter_queryset(queryset)
  105. serializer = MenuPermissonSerializer(queryset, many=True,request=request)
  106. return DetailResponse(data=serializer.data)
  107. @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
  108. def data_scope(self, request):
  109. is_superuser = request.user.is_superuser
  110. role_queryset = Role.objects.filter(users__id=request.user.id).values_list('data_range', flat=True)
  111. if is_superuser:
  112. data = [
  113. {
  114. "value": 0,
  115. "label": '仅本人数据权限'
  116. },
  117. {
  118. "value": 1,
  119. "label": '本部门及以下数据权限'
  120. },
  121. {
  122. "value": 2,
  123. "label": '本部门数据权限'
  124. },
  125. {
  126. "value": 3,
  127. "label": '全部数据权限'
  128. },
  129. {
  130. "value": 4,
  131. "label": '自定义数据权限'
  132. }
  133. ]
  134. else:
  135. data = []
  136. data_range_list = list(set(role_queryset))
  137. for item in data_range_list:
  138. if item == 0:
  139. data = [{
  140. "value": 0,
  141. "label": '仅本人数据权限'
  142. }]
  143. elif item == 1:
  144. data = [{
  145. "value": 0,
  146. "label": '仅本人数据权限'
  147. }, {
  148. "value": 1,
  149. "label": '本部门及以下数据权限'
  150. },
  151. {
  152. "value": 2,
  153. "label": '本部门数据权限'
  154. }]
  155. elif item == 2:
  156. data = [{
  157. "value": 0,
  158. "label": '仅本人数据权限'
  159. },
  160. {
  161. "value": 2,
  162. "label": '本部门数据权限'
  163. }]
  164. elif item == 3:
  165. data = [{
  166. "value": 0,
  167. "label": '仅本人数据权限'
  168. },
  169. {
  170. "value": 3,
  171. "label": '全部数据权限'
  172. }, ]
  173. elif item == 4:
  174. data = [{
  175. "value": 0,
  176. "label": '仅本人数据权限'
  177. },
  178. {
  179. "value": 4,
  180. "label": '自定义数据权限'
  181. }]
  182. else:
  183. data = []
  184. return DetailResponse(data=data)
  185. @action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])
  186. def data_scope_dept(self,request):
  187. """根据当前角色获取部门信息"""
  188. is_superuser = request.user.is_superuser
  189. if is_superuser:
  190. queryset = Dept.objects.values('id','name','parent')
  191. else:
  192. dept_list = request.user.role.values_list('dept',flat=True)
  193. queryset = Dept.objects.filter(id__in=dept_list).values('id','name','parent')
  194. return DetailResponse(data=queryset)