150 lines
5.0 KiB
Python
150 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
@author: H0nGzA1
|
|
@contact: QQ:2505811377
|
|
@Remark: 部门管理
|
|
"""
|
|
from rest_framework import serializers
|
|
|
|
from dvadmin.system.models import Dept
|
|
from dvadmin.utils.json_response import DetailResponse, SuccessResponse
|
|
from dvadmin.utils.serializers import CustomModelSerializer
|
|
from dvadmin.utils.viewset import CustomModelViewSet
|
|
|
|
|
|
class DeptSerializer(CustomModelSerializer):
|
|
"""
|
|
部门-序列化器
|
|
"""
|
|
parent_name = serializers.CharField(read_only=True, source='parent.name')
|
|
has_children = serializers.SerializerMethodField()
|
|
status_label = serializers.SerializerMethodField()
|
|
|
|
def get_has_children(self, obj: Dept):
|
|
return Dept.objects.filter(parent_id=obj.id).count()
|
|
|
|
def get_status_label(self, instance):
|
|
status = instance.status
|
|
if status:
|
|
return "启用"
|
|
return "禁用"
|
|
|
|
class Meta:
|
|
model = Dept
|
|
fields = '__all__'
|
|
read_only_fields = ["id"]
|
|
|
|
|
|
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 DeptCreateUpdateSerializer(CustomModelSerializer):
|
|
"""
|
|
部门管理 创建/更新时的列化器
|
|
"""
|
|
|
|
def create(self, validated_data):
|
|
instance = super().create(validated_data)
|
|
instance.dept_belong_id = instance.id
|
|
instance.save()
|
|
return instance
|
|
|
|
class Meta:
|
|
model = Dept
|
|
fields = '__all__'
|
|
|
|
|
|
class DeptViewSet(CustomModelViewSet):
|
|
"""
|
|
部门管理接口
|
|
list:查询
|
|
create:新增
|
|
update:修改
|
|
retrieve:单例
|
|
destroy:删除
|
|
"""
|
|
queryset = Dept.objects.all()
|
|
serializer_class = DeptSerializer
|
|
create_serializer_class = DeptCreateUpdateSerializer
|
|
update_serializer_class = DeptCreateUpdateSerializer
|
|
filter_fields = ['name', 'id', 'parent']
|
|
search_fields = []
|
|
|
|
# extra_filter_backends = []
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
# 如果懒加载,则只返回父级
|
|
queryset = self.filter_queryset(self.get_queryset())
|
|
lazy = self.request.query_params.get('lazy')
|
|
parent = self.request.query_params.get('parent')
|
|
if lazy:
|
|
# 如果懒加载模式,返回全部
|
|
if not parent:
|
|
if self.request.user.is_superuser:
|
|
queryset = queryset.filter(parent__isnull=True)
|
|
else:
|
|
queryset = queryset.filter(id=self.request.user.dept_id)
|
|
serializer = self.get_serializer(queryset, many=True, request=request)
|
|
return SuccessResponse(data=serializer.data, msg="获取成功")
|
|
|
|
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 dept_lazy_tree(self, request, *args, **kwargs):
|
|
parent = self.request.query_params.get('parent')
|
|
queryset = self.filter_queryset(self.get_queryset())
|
|
if not parent:
|
|
if self.request.user.is_superuser:
|
|
queryset = queryset.filter(parent__isnull=True)
|
|
else:
|
|
queryset = queryset.filter(id=self.request.user.dept_id)
|
|
data = queryset.filter(status=True).order_by('sort').values('name', 'id', 'parent')
|
|
return DetailResponse(data=data, msg="获取成功")
|