2025-03-17 18:06:54 +08:00

149 lines
5.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- 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']