416 lines
15 KiB
Python
416 lines
15 KiB
Python
# -*- coding: utf-8 -*-
|
|
import os
|
|
|
|
from rest_framework import serializers
|
|
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
|
|
import django
|
|
|
|
django.setup()
|
|
from dvadmin.system.models import (
|
|
Role, Dept, Users, Menu, MenuButton,
|
|
ApiWhiteList, Dictionary, SystemConfig,
|
|
RoleMenuPermission, RoleMenuButtonPermission, MenuField
|
|
)
|
|
from dvadmin.utils.serializers import CustomModelSerializer
|
|
|
|
|
|
class UsersInitSerializer(CustomModelSerializer):
|
|
"""
|
|
初始化获取数信息(用于生成初始化json文件)
|
|
"""
|
|
role_key = serializers.SerializerMethodField()
|
|
dept_key = serializers.SerializerMethodField()
|
|
|
|
def get_dept_key(self, obj):
|
|
if obj.dept:
|
|
return obj.dept.key
|
|
else:
|
|
return None
|
|
|
|
def get_role_key(self, obj):
|
|
if obj.role.all():
|
|
return [role.key for role in obj.role.all()]
|
|
else:
|
|
return []
|
|
|
|
def save(self, **kwargs):
|
|
instance = super().save(**kwargs)
|
|
role_key = self.initial_data.get('role_key', [])
|
|
role_ids = Role.objects.filter(key__in=role_key).values_list('id', flat=True)
|
|
instance.role.set(role_ids)
|
|
dept_key = self.initial_data.get('dept_key', None)
|
|
dept_id = Dept.objects.filter(key=dept_key).first()
|
|
instance.dept = dept_id
|
|
instance.save()
|
|
return instance
|
|
|
|
class Meta:
|
|
model = Users
|
|
fields = ["username", "email", 'mobile', 'avatar', "name", 'gender', 'user_type', "dept", 'user_type',
|
|
'first_name', 'last_name', 'email', 'is_staff', 'is_active', 'creator', 'dept_belong_id',
|
|
'password', 'last_login', 'is_superuser', 'role_key' ,'dept_key']
|
|
read_only_fields = ['id']
|
|
extra_kwargs = {
|
|
'creator': {'write_only': True},
|
|
'dept_belong_id': {'write_only': True}
|
|
}
|
|
|
|
|
|
class MenuButtonInitSerializer(CustomModelSerializer):
|
|
"""
|
|
初始化菜单按钮-序列化器
|
|
"""
|
|
|
|
class Meta:
|
|
model = MenuButton
|
|
fields = ['id', 'name', 'value', 'api', 'method', 'menu']
|
|
read_only_fields = ["id"]
|
|
|
|
|
|
class MenuFieldInitSerializer(CustomModelSerializer):
|
|
"""
|
|
初始化列权限-序列化器
|
|
"""
|
|
|
|
class Meta:
|
|
model = MenuField
|
|
fields = ['id', 'menu', 'field_name', 'title', 'model']
|
|
read_only_fields = ["id"]
|
|
|
|
|
|
class MenuInitSerializer(CustomModelSerializer):
|
|
"""
|
|
递归深度获取数信息(用于生成初始化json文件)
|
|
"""
|
|
name = serializers.CharField(required=False)
|
|
children = serializers.SerializerMethodField()
|
|
menu_button = serializers.SerializerMethodField()
|
|
menu_field = serializers.SerializerMethodField()
|
|
|
|
def get_children(self, obj: Menu):
|
|
data = []
|
|
instance = Menu.objects.filter(parent_id=obj.id)
|
|
if instance:
|
|
serializer = MenuInitSerializer(instance=instance, many=True)
|
|
data = serializer.data
|
|
return data
|
|
|
|
def get_menu_button(self, obj: Menu):
|
|
data = []
|
|
instance = obj.menuPermission.order_by('method')
|
|
if instance:
|
|
data = list(instance.values('name', 'value', 'api', 'method'))
|
|
return data
|
|
|
|
def get_menu_field(self, obj: Menu):
|
|
data = []
|
|
instance = obj.menufield_set.order_by('field_name')
|
|
if instance:
|
|
data = list(instance.values('field_name', 'title', 'model'))
|
|
return data
|
|
|
|
def save(self, **kwargs):
|
|
instance = super().save(**kwargs)
|
|
children = self.initial_data.get('children')
|
|
menu_button = self.initial_data.get('menu_button')
|
|
menu_field = self.initial_data.get('menu_field')
|
|
# 菜单表
|
|
if children:
|
|
for menu_data in children:
|
|
menu_data['parent'] = instance.id
|
|
filter_data = {
|
|
"name": menu_data['name'],
|
|
"web_path": menu_data['web_path'],
|
|
"component": menu_data['component'],
|
|
"component_name": menu_data['component_name'],
|
|
}
|
|
instance_obj = Menu.objects.filter(**filter_data).first()
|
|
if instance_obj and not self.initial_data.get('reset'):
|
|
continue
|
|
serializer = MenuInitSerializer(instance_obj, data=menu_data, request=self.request)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
# 菜单按钮
|
|
if menu_button:
|
|
for menu_button_data in menu_button:
|
|
menu_button_data['menu'] = instance.id
|
|
filter_data = {
|
|
"menu": menu_button_data['menu'],
|
|
"value": menu_button_data['value']
|
|
}
|
|
instance_obj = MenuButton.objects.filter(**filter_data).first()
|
|
serializer = MenuButtonInitSerializer(instance_obj, data=menu_button_data, request=self.request)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
# 列权限
|
|
if menu_field:
|
|
for field_data in menu_field:
|
|
field_data['menu'] = instance.id
|
|
filter_data = {
|
|
'menu': field_data['menu'],
|
|
'field_name': field_data['field_name'],
|
|
'model': field_data['model']
|
|
}
|
|
instance_obj = MenuField.objects.filter(**filter_data).first()
|
|
serializer = MenuFieldInitSerializer(instance_obj, data=field_data, request=self.request)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
return instance
|
|
|
|
class Meta:
|
|
model = Menu
|
|
fields = ['name', 'icon', 'sort', 'is_link', 'is_catalog', 'web_path', 'component', 'component_name', 'status',
|
|
'cache', 'visible', 'parent', 'children', 'menu_button', 'menu_field', 'creator', 'dept_belong_id']
|
|
extra_kwargs = {
|
|
'creator': {'write_only': True},
|
|
'dept_belong_id': {'write_only': True}
|
|
}
|
|
read_only_fields = ['id', 'children']
|
|
|
|
|
|
class RoleInitSerializer(CustomModelSerializer):
|
|
"""
|
|
初始化获取数信息(用于生成初始化json文件)
|
|
"""
|
|
|
|
class Meta:
|
|
model = Role
|
|
fields = ['name', 'key', 'sort', 'status',
|
|
'creator', 'dept_belong_id']
|
|
read_only_fields = ["id"]
|
|
extra_kwargs = {
|
|
'creator': {'write_only': True},
|
|
'dept_belong_id': {'write_only': True}
|
|
}
|
|
|
|
|
|
class RoleMenuInitSerializer(CustomModelSerializer):
|
|
"""
|
|
初始化角色菜单(用于生成初始化json文件)
|
|
"""
|
|
role__key = serializers.CharField(source='role.key')
|
|
menu__web_path = serializers.CharField(source='menu.web_path')
|
|
menu__component_name = serializers.CharField(source='menu.component_name', allow_blank=True)
|
|
|
|
def update(self, instance, validated_data):
|
|
init_data = self.initial_data
|
|
role_id = Role.objects.filter(key=init_data['role__key']).first()
|
|
menu_id = Menu.objects.filter(web_path=init_data['menu__web_path'], component_name=init_data['menu__component_name']).first()
|
|
validated_data['role'] = role_id
|
|
validated_data['menu'] = menu_id
|
|
return super().update(instance, validated_data)
|
|
|
|
|
|
def create(self, validated_data):
|
|
init_data = self.initial_data
|
|
role_id = Role.objects.filter(key=init_data['role__key']).first()
|
|
menu_id = Menu.objects.filter(web_path=init_data['menu__web_path'], component_name=init_data['menu__component_name']).first()
|
|
validated_data['role'] = role_id
|
|
validated_data['menu'] = menu_id
|
|
return super().create(validated_data)
|
|
|
|
class Meta:
|
|
model = RoleMenuPermission
|
|
fields = ['role__key', 'menu__web_path', 'menu__component_name','creator', 'dept_belong_id']
|
|
read_only_fields = ["id"]
|
|
extra_kwargs = {
|
|
'role': {'required': False},
|
|
'menu': {'required': False},
|
|
'creator': {'write_only': True},
|
|
'dept_belong_id': {'write_only': True}
|
|
}
|
|
|
|
|
|
class RoleMenuButtonInitSerializer(CustomModelSerializer):
|
|
"""
|
|
初始化角色菜单按钮(用于生成初始化json文件)
|
|
"""
|
|
role__key = serializers.CharField(source='role.key')
|
|
menu_button__value = serializers.CharField(source='menu_button.value')
|
|
data_range = serializers.CharField(max_length=100, required=False)
|
|
|
|
def update(self, instance, validated_data):
|
|
init_data = self.initial_data
|
|
role_id = Role.objects.filter(key=init_data['role__key']).first()
|
|
menu_button_id = MenuButton.objects.filter(value=init_data['menu_button__value']).first()
|
|
validated_data['role'] = role_id
|
|
validated_data['menu_button'] = menu_button_id
|
|
instance = super().create(validated_data)
|
|
instance.dept.set([])
|
|
return super().update(instance, validated_data)
|
|
|
|
def create(self, validated_data):
|
|
init_data = self.initial_data
|
|
role_id = Role.objects.filter(key=init_data['role__key']).first()
|
|
menu_button_id = MenuButton.objects.filter(value=init_data['menu_button__value']).first()
|
|
validated_data['role'] = role_id
|
|
validated_data['menu_button'] = menu_button_id
|
|
instance = super().create(validated_data)
|
|
instance.dept.set([])
|
|
return instance
|
|
|
|
def save(self, **kwargs):
|
|
if not self.instance or self.initial_data.get('reset'):
|
|
return super().save(**kwargs)
|
|
return self.instance
|
|
|
|
class Meta:
|
|
model = RoleMenuButtonPermission
|
|
fields = ['role__key', 'menu_button__value', 'data_range', 'dept', 'creator', 'dept_belong_id']
|
|
read_only_fields = ["id"]
|
|
extra_kwargs = {
|
|
'role': {'required': False},
|
|
'menu': {'required': False},
|
|
'creator': {'write_only': True},
|
|
'dept_belong_id': {'write_only': True}
|
|
}
|
|
|
|
|
|
class ApiWhiteListInitSerializer(CustomModelSerializer):
|
|
"""
|
|
初始化获取数信息(用于生成初始化json文件)
|
|
"""
|
|
|
|
class Meta:
|
|
model = ApiWhiteList
|
|
fields = ['url', 'method', 'enable_datasource', 'creator', 'dept_belong_id']
|
|
read_only_fields = ["id"]
|
|
extra_kwargs = {
|
|
'creator': {'write_only': True},
|
|
'dept_belong_id': {'write_only': True}
|
|
}
|
|
|
|
|
|
class DeptInitSerializer(CustomModelSerializer):
|
|
"""
|
|
递归深度获取数信息(用于生成初始化json文件)
|
|
"""
|
|
children = serializers.SerializerMethodField()
|
|
|
|
def get_children(self, obj: Dept):
|
|
data = []
|
|
instance = Dept.objects.filter(parent_id=obj.id)
|
|
if instance:
|
|
serializer = DeptInitSerializer(instance=instance, many=True)
|
|
data = serializer.data
|
|
return data
|
|
|
|
def save(self, **kwargs):
|
|
instance = super().save(**kwargs)
|
|
children = self.initial_data.get('children')
|
|
if children:
|
|
for menu_data in children:
|
|
menu_data['parent'] = instance.id
|
|
filter_data = {
|
|
"name": menu_data['name'],
|
|
"parent": menu_data['parent'],
|
|
"key": menu_data['key']
|
|
}
|
|
instance_obj = Dept.objects.filter(**filter_data).first()
|
|
if instance_obj and not self.initial_data.get('reset'):
|
|
continue
|
|
serializer = DeptInitSerializer(instance_obj, data=menu_data, request=self.request)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
|
|
return instance
|
|
|
|
class Meta:
|
|
model = Dept
|
|
fields = ['name', 'sort', 'owner', 'phone', 'email', 'status', 'parent', 'creator', 'dept_belong_id',
|
|
'children', 'key']
|
|
extra_kwargs = {
|
|
'creator': {'write_only': True},
|
|
'dept_belong_id': {'write_only': True}
|
|
}
|
|
read_only_fields = ['id', 'children']
|
|
|
|
|
|
class DictionaryInitSerializer(CustomModelSerializer):
|
|
"""
|
|
初始化获取数信息(用于生成初始化json文件)
|
|
"""
|
|
children = serializers.SerializerMethodField()
|
|
|
|
def get_children(self, obj: Dictionary):
|
|
data = []
|
|
instance = Dictionary.objects.filter(parent_id=obj.id)
|
|
if instance:
|
|
serializer = DictionaryInitSerializer(instance=instance, many=True)
|
|
data = serializer.data
|
|
return data
|
|
|
|
def save(self, **kwargs):
|
|
instance = super().save(**kwargs)
|
|
children = self.initial_data.get('children')
|
|
# 菜单表
|
|
if children:
|
|
for data in children:
|
|
data['parent'] = instance.id
|
|
filter_data = {
|
|
"value": data['value'],
|
|
"parent": data['parent']
|
|
}
|
|
instance_obj = Dictionary.objects.filter(**filter_data).first()
|
|
if instance_obj and not self.initial_data.get('reset'):
|
|
continue
|
|
serializer = DictionaryInitSerializer(instance_obj, data=data, request=self.request)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
return instance
|
|
|
|
class Meta:
|
|
model = Dictionary
|
|
fields = ['label', 'value', 'parent', 'type', 'color', 'is_value', 'status', 'sort', 'remark', 'creator',
|
|
'dept_belong_id', 'children']
|
|
read_only_fields = ["id"]
|
|
extra_kwargs = {
|
|
'creator': {'write_only': True},
|
|
'dept_belong_id': {'write_only': True}
|
|
}
|
|
|
|
|
|
class SystemConfigInitSerializer(CustomModelSerializer):
|
|
"""
|
|
初始化获取数信息(用于生成初始化json文件)
|
|
"""
|
|
children = serializers.SerializerMethodField()
|
|
|
|
def get_children(self, obj: SystemConfig):
|
|
data = []
|
|
instance = SystemConfig.objects.filter(parent_id=obj.id)
|
|
if instance:
|
|
serializer = SystemConfigInitSerializer(instance=instance, many=True)
|
|
data = serializer.data
|
|
return data
|
|
|
|
def save(self, **kwargs):
|
|
instance = super().save(**kwargs)
|
|
children = self.initial_data.get('children')
|
|
# 菜单表
|
|
if children:
|
|
for data in children:
|
|
data['parent'] = instance.id
|
|
filter_data = {
|
|
"key": data['key'],
|
|
"parent": data['parent']
|
|
}
|
|
instance_obj = SystemConfig.objects.filter(**filter_data).first()
|
|
if instance_obj and not self.initial_data.get('reset'):
|
|
continue
|
|
serializer = SystemConfigInitSerializer(instance_obj, data=data, request=self.request)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
return instance
|
|
|
|
class Meta:
|
|
model = SystemConfig
|
|
fields = ['parent', 'title', 'key', 'value', 'sort', 'status', 'data_options', 'form_item_type', 'rule',
|
|
'placeholder', 'setting', 'creator', 'dept_belong_id', 'children']
|
|
read_only_fields = ["id"]
|
|
extra_kwargs = {
|
|
'creator': {'write_only': True},
|
|
'dept_belong_id': {'write_only': True}
|
|
}
|