django-vue-admin/dvadmin-backend/apps/permission/serializers.py

243 lines
7.5 KiB
Python

from rest_framework import serializers
from rest_framework.validators import UniqueValidator
from apps.op_drf.serializers import CustomModelSerializer
from apps.permission.models import Menu, Dept, Post, Role, UserProfile
# ================================================= #
# ************** 菜单管理 序列化器 ************** #
# ================================================= #
class MenuSerializer(CustomModelSerializer):
"""
简单菜单序列化器
"""
parentId = serializers.IntegerField(source="parentId.id", default=0)
class Meta:
model = Menu
exclude = ('description', 'creator', 'modifier')
class MenuCreateUpdateSerializer(CustomModelSerializer):
"""
菜单管理 创建/更新时的列化器
"""
def validate(self, attrs: dict):
# name = attrs['name']
# role: Role = Role.objects.filter(name=name).first()
# if role and attrs.get('instanceId', '') != role.instanceId:
# raise APIException(message=f'角色名称[{name}]不能重复')
# if getattr(self.instance, 'is_public', False) or attrs.get('is_public', False):
# up = UserPermission(self.request.user)
# if not up.is_manager():
# raise APIException(message=f'仅Manger能创建/更新角色为公共角色')
return super().validate(attrs)
class Meta:
model = Menu
exclude = ('description', 'creator', 'modifier')
read_only_fields = ('update_datetime', 'create_datetime', 'creator', 'modifier')
class MenuTreeSerializer(serializers.ModelSerializer):
"""
菜单树形架构序列化器:递归序列化所有深度的子菜单
"""
label = serializers.CharField(source='name', default='')
parentId = serializers.IntegerField(source="parentId.id", default=0)
class Meta:
model = Menu
fields = ('id', 'label', 'parentId')
# ================================================= #
# ************** 部门管理 序列化器 ************** #
# ================================================= #
class DeptSerializer(CustomModelSerializer):
"""
部门管理 简单序列化器
"""
parentId = serializers.IntegerField(source="parentId.id", default=0)
class Meta:
model = Dept
exclude = ('description', 'creator', 'modifier')
class DeptCreateUpdateSerializer(CustomModelSerializer):
"""
部门管理 创建/更新时的列化器
"""
def validate(self, attrs: dict):
return super().validate(attrs)
class Meta:
model = Dept
exclude = ('description', 'creator', 'modifier')
read_only_fields = ('update_datetime', 'create_datetime', 'creator', 'modifier')
class DeptTreeSerializer(serializers.ModelSerializer):
"""
部门树形架构序列化器:递归序列化所有深度的子部门
"""
label = serializers.CharField(source='deptName', default='')
parentId = serializers.IntegerField(source="parentId.id", default=0)
class Meta:
model = Dept
fields = ('id', 'label', 'parentId')
# ================================================= #
# ************** 岗位管理 序列化器 ************** #
# ================================================= #
class PostSerializer(CustomModelSerializer):
"""
岗位管理 简单序列化器
"""
class Meta:
model = Post
exclude = ('description', 'creator', 'modifier')
class PostSimpleSerializer(CustomModelSerializer):
"""
岗位管理 极简单序列化器
"""
class Meta:
model = Post
fields = ('id', 'postName', 'postCode', 'status')
class PostCreateUpdateSerializer(CustomModelSerializer):
"""
岗位管理 创建/更新时的列化器
"""
def validate(self, attrs: dict):
return super().validate(attrs)
class Meta:
model = Post
exclude = ('description', 'creator', 'modifier')
read_only_fields = ('update_datetime', 'create_datetime', 'creator', 'modifier')
# ================================================= #
# ************** 角色管理 序列化器 ************** #
# ================================================= #
class RoleSerializer(CustomModelSerializer):
"""
角色管理 简单序列化器
"""
class Meta:
model = Role
exclude = ('description', 'creator', 'modifier')
class RoleSimpleSerializer(CustomModelSerializer):
"""
角色管理 极简单序列化器
"""
class Meta:
model = Role
fields = ('id', 'roleName', 'roleKey', 'status')
class RoleCreateUpdateSerializer(CustomModelSerializer):
"""
角色管理 创建/更新时的列化器
"""
menu = MenuSerializer(many=True, read_only=True)
dept = DeptSerializer(many=True, read_only=True)
def validate(self, attrs: dict):
return super().validate(attrs)
def save(self, **kwargs):
data = super().save(**kwargs)
data.dept.set(self.initial_data.get('dept'))
data.menu.set(self.initial_data.get('menu'))
return data
class Meta:
model = Role
exclude = ('description', 'creator', 'modifier')
read_only_fields = ('update_datetime', 'create_datetime', 'creator', 'modifier')
# ================================================= #
# ************** 用户管理 序列化器 ************** #
# ================================================= #
class UserProfileSerializer(CustomModelSerializer):
"""
简单用户序列化器
"""
admin = serializers.SerializerMethodField(read_only=True)
deptId = serializers.IntegerField(source='dept.id', read_only=True)
def get_admin(self, obj: UserProfile):
role_list = obj.role.all().values_list('admin', flat=True)
if True in list(set(role_list)):
return True
return False
class Meta:
model = UserProfile
depth = 1
exclude = ('password', 'secret', 'user_permissions', 'groups', 'is_superuser', 'date_joined')
class UserProfileCreateUpdateSerializer(CustomModelSerializer):
"""
用户管理 创建/更新时的列化器
"""
admin = serializers.SerializerMethodField(read_only=True)
post = PostSerializer(many=True, read_only=True)
role = RoleSerializer(many=True, read_only=True)
username = serializers.CharField(required=True, max_length=150,
validators=[UniqueValidator(queryset=UserProfile.objects.all(), message="用戶已存在")],
error_messages={
"blank": "请输入用户名称",
"required": "用户名称不能为空",
"max_length": "用户名称过长",
})
def get_admin(self, obj: UserProfile):
role_list = obj.role.all().values_list('admin', flat=True)
if True in list(set(role_list)):
return True
return False
def validate(self, attrs: dict):
return super().validate(attrs)
def save(self, **kwargs):
self.validated_data['dept_id'] = self.initial_data.get('deptId', None)
data = super().save(**kwargs)
data.set_password(self.initial_data.get('password', None))
data.save()
data.post.set(self.initial_data.get('postIds'))
data.role.set(self.initial_data.get('roleIds'))
return data
class Meta:
model = UserProfile
exclude = ('password', 'secret', 'user_permissions', 'groups', 'is_superuser', 'date_joined')
read_only_fields = ('dept',)