213 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			213 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- coding: utf-8 -*-
 | 
						|
 | 
						|
"""
 | 
						|
@author: H0nGzA1
 | 
						|
@contact: QQ:2505811377
 | 
						|
@Remark: 部门管理
 | 
						|
"""
 | 
						|
from rest_framework import serializers
 | 
						|
from rest_framework.decorators import action
 | 
						|
from rest_framework.permissions import IsAuthenticated
 | 
						|
 | 
						|
from dvadmin.system.models import Dept, RoleMenuButtonPermission, Users
 | 
						|
from dvadmin.utils.filters import DataLevelPermissionsFilter
 | 
						|
from dvadmin.utils.json_response import DetailResponse, SuccessResponse, ErrorResponse
 | 
						|
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')
 | 
						|
    status_label = serializers.SerializerMethodField()
 | 
						|
    has_children = serializers.SerializerMethodField()
 | 
						|
    hasChild = serializers.SerializerMethodField()
 | 
						|
 | 
						|
    dept_user_count = serializers.SerializerMethodField()
 | 
						|
 | 
						|
    def get_dept_user_count(self, obj: Dept):
 | 
						|
        return Users.objects.filter(dept=obj).count()
 | 
						|
 | 
						|
    def get_hasChild(self, instance):
 | 
						|
        hasChild = Dept.objects.filter(parent=instance.id)
 | 
						|
        if hasChild:
 | 
						|
            return True
 | 
						|
        return False
 | 
						|
 | 
						|
    def get_status_label(self, obj: Dept):
 | 
						|
        if obj.status:
 | 
						|
            return "启用"
 | 
						|
        return "禁用"
 | 
						|
 | 
						|
    def get_has_children(self, obj: Dept):
 | 
						|
        return Dept.objects.filter(parent_id=obj.id).count()
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Dept
 | 
						|
        fields = '__all__'
 | 
						|
        read_only_fields = ["id"]
 | 
						|
 | 
						|
 | 
						|
class DeptImportSerializer(CustomModelSerializer):
 | 
						|
    """
 | 
						|
    部门-导入-序列化器
 | 
						|
    """
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        model = Dept
 | 
						|
        fields = '__all__'
 | 
						|
        read_only_fields = ["id"]
 | 
						|
 | 
						|
 | 
						|
class DeptCreateUpdateSerializer(CustomModelSerializer):
 | 
						|
    """
 | 
						|
    部门管理 创建/更新时的列化器
 | 
						|
    """
 | 
						|
 | 
						|
    def create(self, validated_data):
 | 
						|
        value = validated_data.get('parent', None)
 | 
						|
        if value is None:
 | 
						|
            validated_data['parent'] = self.request.user.dept
 | 
						|
        dept_obj = Dept.objects.filter(parent=self.request.user.dept).order_by('-sort').first()
 | 
						|
        last_sort = dept_obj.sort if dept_obj else 0
 | 
						|
        validated_data['sort'] = last_sort + 1
 | 
						|
        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_class = []
 | 
						|
    import_serializer_class = DeptImportSerializer
 | 
						|
    import_field_dict = {
 | 
						|
        "name": "部门名称",
 | 
						|
        "key": "部门标识",
 | 
						|
    }
 | 
						|
 | 
						|
    def list(self, request, *args, **kwargs):
 | 
						|
        # 如果懒加载,则只返回父级
 | 
						|
        request.query_params._mutable = True
 | 
						|
        params = request.query_params
 | 
						|
        parent = params.get('parent', None)
 | 
						|
        page = params.get('page', None)
 | 
						|
        limit = params.get('limit', None)
 | 
						|
        if page:
 | 
						|
            del params['page']
 | 
						|
        if limit:
 | 
						|
            del params['limit']
 | 
						|
        if params and parent:
 | 
						|
            queryset = self.queryset.filter(status=True, parent=parent)
 | 
						|
        else:
 | 
						|
            queryset = self.queryset.filter(status=True)
 | 
						|
        queryset = self.filter_queryset(queryset)
 | 
						|
        serializer = DeptSerializer(queryset, many=True, request=request)
 | 
						|
        data = serializer.data
 | 
						|
        return SuccessResponse(data=data)
 | 
						|
 | 
						|
    @action(methods=["GET"], detail=False, permission_classes=[IsAuthenticated])
 | 
						|
    def all_dept(self, request, *args, **kwargs):
 | 
						|
        queryset = self.filter_queryset(self.get_queryset())
 | 
						|
        data = queryset.filter(status=True).order_by('sort').values('name', 'id', 'parent')
 | 
						|
        return DetailResponse(data=data, msg="获取成功")
 | 
						|
 | 
						|
    @action(methods=['POST'], detail=False, permission_classes=[IsAuthenticated])
 | 
						|
    def move_up(self, request):
 | 
						|
        """部门上移"""
 | 
						|
        dept_id = request.data.get('dept_id')
 | 
						|
        try:
 | 
						|
            dept = Dept.objects.get(id=dept_id)
 | 
						|
        except Dept.DoesNotExist:
 | 
						|
            return ErrorResponse(msg="部门不存在")
 | 
						|
        previous_menu = Dept.objects.filter(sort__lt=dept.sort, parent=dept.parent).order_by('-sort').first()
 | 
						|
        if previous_menu:
 | 
						|
            previous_menu.sort, dept.sort = dept.sort, previous_menu.sort
 | 
						|
            previous_menu.save()
 | 
						|
            dept.save()
 | 
						|
        return SuccessResponse(data=[], msg="上移成功")
 | 
						|
 | 
						|
    @action(methods=['POST'], detail=False, permission_classes=[IsAuthenticated])
 | 
						|
    def move_down(self, request):
 | 
						|
        """部门下移"""
 | 
						|
        dept_id = request.data['dept_id']
 | 
						|
        try:
 | 
						|
            dept = Dept.objects.get(id=dept_id)
 | 
						|
        except Dept.DoesNotExist:
 | 
						|
            return ErrorResponse(msg="部门不存在")
 | 
						|
        next_menu = Dept.objects.filter(sort__gt=dept.sort, parent=dept.parent).order_by('sort').first()
 | 
						|
        if next_menu:
 | 
						|
            next_menu.sort, dept.sort = dept.sort, next_menu.sort
 | 
						|
            next_menu.save()
 | 
						|
            dept.save()
 | 
						|
        return SuccessResponse(data=[], msg="下移成功")
 | 
						|
 | 
						|
    @action(methods=['GET'], detail=False, permission_classes=[])
 | 
						|
    def dept_info(self, request):
 | 
						|
        """部门信息"""
 | 
						|
        def inner(did, li):
 | 
						|
            sub = Dept.objects.filter(parent_id=did)
 | 
						|
            if not sub.exists():
 | 
						|
                return li
 | 
						|
            for i in sub:
 | 
						|
                li.append(i.pk)
 | 
						|
                inner(i, li)
 | 
						|
            return li
 | 
						|
        dept_id = request.query_params.get('dept_id')
 | 
						|
        show_all = request.query_params.get('show_all')
 | 
						|
        if dept_id is None:
 | 
						|
            return ErrorResponse(msg="部门不存在")
 | 
						|
        if not show_all:
 | 
						|
            show_all = 0
 | 
						|
        if int(show_all):  # 递归当前部门下的所有部门,查询用户
 | 
						|
            all_did = [dept_id]
 | 
						|
            inner(dept_id, all_did)
 | 
						|
            users = Users.objects.filter(dept_id__in=all_did)
 | 
						|
        else:
 | 
						|
            if dept_id != '':
 | 
						|
                users = Users.objects.filter(dept_id=dept_id)
 | 
						|
            else:
 | 
						|
                users = Users.objects.none()
 | 
						|
        dept_obj = Dept.objects.get(id=dept_id) if dept_id != '' else None
 | 
						|
        sub_dept = Dept.objects.filter(parent_id=dept_obj.pk) if dept_id != '' else []
 | 
						|
        data = {
 | 
						|
            'dept_name': dept_obj and dept_obj.name,
 | 
						|
            'dept_user': users.count(),
 | 
						|
            'owner': dept_obj and dept_obj.owner,
 | 
						|
            'description': dept_obj and dept_obj.description,
 | 
						|
            'gender': {
 | 
						|
                'male': users.filter(gender=1).count(),
 | 
						|
                'female': users.filter(gender=2).count(),
 | 
						|
                'unknown': users.filter(gender=0).count(),
 | 
						|
            },
 | 
						|
            'sub_dept_map': []
 | 
						|
        }
 | 
						|
        for dept in sub_dept:
 | 
						|
            all_did = [dept.pk]
 | 
						|
            inner(dept.pk, all_did)
 | 
						|
            sub_data = {
 | 
						|
                'name': dept.name,
 | 
						|
                'count': Users.objects.filter(dept_id__in=all_did).count()
 | 
						|
            }
 | 
						|
            data['sub_dept_map'].append(sub_data)
 | 
						|
        return SuccessResponse(data)
 |