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)
|