149 lines
5.0 KiB
Python
149 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
@Remark: 角色管理
|
||
"""
|
||
from rest_framework import serializers
|
||
from rest_framework.permissions import IsAuthenticated
|
||
|
||
from mysystem.models import Role, Menu , RoleMenuDataRange
|
||
from mysystem.views.dept import DeptSerializer
|
||
from mysystem.views.menu import MenuSerializer
|
||
from mysystem.views.menu_button import MenuButtonSerializer
|
||
from utils.jsonResponse import SuccessResponse
|
||
from utils.serializers import CustomModelSerializer
|
||
from utils.validator import CustomUniqueValidator
|
||
from utils.viewset import CustomModelViewSet
|
||
from django.db import transaction
|
||
|
||
class RoleSerializer(CustomModelSerializer):
|
||
"""
|
||
角色-序列化器
|
||
"""
|
||
menuDataRange = serializers.SerializerMethodField()
|
||
|
||
def get_menuDataRange(self,obj):
|
||
data_range = RoleMenuDataRange.objects.filter(role=obj).values("menu_id","data_range")
|
||
return data_range
|
||
|
||
class Meta:
|
||
model = Role
|
||
fields = "__all__"
|
||
read_only_fields = ["id"]
|
||
|
||
class RoleSimpleSerializer(CustomModelSerializer):
|
||
"""
|
||
角色简单-序列化器
|
||
"""
|
||
|
||
class Meta:
|
||
model = Role
|
||
fields = ['id','name','key','create_datetime']
|
||
read_only_fields = ["id"]
|
||
|
||
|
||
class RoleCreateUpdateSerializer(CustomModelSerializer):
|
||
"""
|
||
角色管理 创建/更新时的列化器
|
||
"""
|
||
menu = MenuSerializer(many=True, read_only=True)
|
||
dept = DeptSerializer(many=True, read_only=True)
|
||
permission = MenuButtonSerializer(many=True, read_only=True)
|
||
key = serializers.CharField(max_length=50,
|
||
validators=[CustomUniqueValidator(queryset=Role.objects.all(), message="权限字符必须唯一")])
|
||
name = serializers.CharField(max_length=50, validators=[CustomUniqueValidator(queryset=Role.objects.all())])
|
||
|
||
def validate(self, attrs: dict):
|
||
return super().validate(attrs)
|
||
|
||
@transaction.atomic
|
||
def save(self, **kwargs):
|
||
data = super().save(**kwargs)
|
||
data.dept.set(self.initial_data.get('dept', []))
|
||
data.menu.set(self.initial_data.get('menu', []))
|
||
data.permission.set(self.initial_data.get('permission', []))
|
||
RoleMenuDataRange.objects.filter(role_id=data.id).delete()
|
||
menuDataRange = []
|
||
for i in self.request.data.get('menuDataRange',[]):
|
||
menuDataRange.append(RoleMenuDataRange(creator=self.request.user,menu_id=i['menu_id'],data_range=i['data_range'],role_id=data.id))
|
||
if menuDataRange:
|
||
RoleMenuDataRange.objects.bulk_create(menuDataRange)
|
||
return data
|
||
|
||
class Meta:
|
||
model = Role
|
||
fields = '__all__'
|
||
|
||
|
||
class MenuPermissonSerializer(CustomModelSerializer):
|
||
"""
|
||
菜单的按钮权限
|
||
"""
|
||
menuPermission = MenuButtonSerializer(many=True, read_only=True)
|
||
|
||
class Meta:
|
||
model = Menu
|
||
fields = '__all__'
|
||
|
||
|
||
class RoleViewSet(CustomModelViewSet):
|
||
"""
|
||
角色管理接口
|
||
list:查询
|
||
create:新增
|
||
update:修改
|
||
retrieve:单例
|
||
destroy:删除
|
||
"""
|
||
queryset = Role.objects.all()
|
||
serializer_class = RoleSerializer
|
||
create_serializer_class = RoleCreateUpdateSerializer
|
||
update_serializer_class = RoleCreateUpdateSerializer
|
||
filterset_fields = ['status']
|
||
search_fields = ('name', 'key')
|
||
|
||
def list(self, request, *args, **kwargs):
|
||
"""
|
||
新增simple参数获取少量字段,不传则原来的形式获取
|
||
"""
|
||
queryset = self.filter_queryset(self.get_queryset())
|
||
params = request.query_params
|
||
simple = params.get('simple', None)
|
||
if simple:
|
||
serializer = RoleSimpleSerializer(queryset, many=True, request=request)
|
||
return SuccessResponse(data=serializer.data, msg="获取成功")
|
||
else:
|
||
page = self.paginate_queryset(queryset)
|
||
if page is not None:
|
||
serializer = self.get_serializer(page, many=True, request=request)
|
||
return self.get_paginated_response(serializer.data)
|
||
serializer = self.get_serializer(queryset, many=True, request=request)
|
||
return SuccessResponse(data=serializer.data, msg="获取成功")
|
||
|
||
def roleId_to_menu(self, request, *args, **kwargs):
|
||
"""通过角色id获取该角色用于的菜单"""
|
||
# instance = self.get_object()
|
||
# queryset = instance.menu.all()
|
||
queryset = Menu.objects.filter(status=1).all()
|
||
serializer = MenuPermissonSerializer(queryset, many=True)
|
||
return SuccessResponse(data=serializer.data)
|
||
|
||
def role_data(self,request,*args,**kwargs):
|
||
instance = self.get_object()
|
||
serializer = RoleSerializer(instance)
|
||
return SuccessResponse(data=serializer.data)
|
||
|
||
class PermissionViewSet(CustomModelViewSet):
|
||
"""
|
||
角色管理-权限管理接口
|
||
list:查询
|
||
create:新增
|
||
update:修改
|
||
retrieve:单例
|
||
destroy:删除
|
||
"""
|
||
queryset = Role.objects.all()
|
||
serializer_class = RoleSerializer
|
||
create_serializer_class = RoleCreateUpdateSerializer
|
||
update_serializer_class = RoleCreateUpdateSerializer
|
||
filterset_fields = ['status'] |