feat: cms users institution department manager

This commit is contained in:
2026-06-11 10:37:29 +08:00
parent 1dc9141856
commit 32915bc6b4
39 changed files with 2403 additions and 75 deletions
+46 -19
View File
@@ -11,7 +11,7 @@ from .auth import TRIAL_INSTITUTION_NAME
from .models import User, Role, TeacherStudentRelation, Institution, Department
from .serializers import (
UserSerializer, UserCreateSerializer, UserUpdateSerializer,
StudentProfileConfigSerializer,
StudentProfileConfigSerializer, ProfileUpdateSerializer,
RoleSerializer,
TeacherStudentRelationSerializer, InstitutionSerializer, DepartmentSerializer
)
@@ -184,21 +184,13 @@ class InstitutionViewSet(viewsets.ModelViewSet):
filterset_fields = ['type', 'province', 'city']
search_fields = ['name']
@action(detail=True, methods=['get'])
def departments(self, request, pk=None):
"""获取机构下的科室列表"""
institution = self.get_object()
departments = institution.department_set.all()
serializer = DepartmentSerializer(departments, many=True)
return Response(serializer.data)
class DepartmentViewSet(viewsets.ModelViewSet):
"""科室管理"""
"""科室管理(全局科室,与机构无关)"""
queryset = Department.objects.all()
serializer_class = DepartmentSerializer
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_fields = ['institution', 'category']
filterset_fields = ['category']
search_fields = ['name']
@@ -278,20 +270,16 @@ def institution_info(request):
@extend_schema(
summary='所属机构科室列表接口(不分页)',
description='返回当前登录学生所属机构下的全部科室,不分页,供配置页选择执业科室。',
summary='科室列表接口(全局、不分页)',
description='返回全部科室(全局科室表,与机构无关),不分页,供配置页/个人中心选择想学习的科室。',
responses={200: None},
tags=['机构'],
)
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def my_departments(request):
"""所属机构科室列表接口 — 当前用户机构下全部科室、不分页"""
inst = request.user.institution
if inst is None:
raise AppError('USER_INSTITUTION_NOT_FOUND', '当前账号未关联机构', status_code=404)
departments = Department.objects.filter(institution=inst).order_by('name')
"""科室列表接口 — 全部全局科室、不分页(用户可自由选择想学习的科室)"""
departments = Department.objects.all().order_by('name')
data = [
{
'id': dept.id,
@@ -331,3 +319,42 @@ def student_profile_config(request):
'message': '配置成功',
'user': UserSerializer(user).data,
})
@extend_schema(
methods=['GET'],
summary='个人信息获取',
description='获取当前登录用户的全部个人信息(个人中心)。',
responses={200: UserSerializer},
tags=['用户'],
)
@extend_schema(
methods=['PATCH'],
summary='个人信息更新',
description='更新当前登录用户的个人信息。仅允许修改:用户名、真实姓名、手机号、头像、'
'性别、所属科室、职称、专业、执业年限、培训阶段、学习目标。'
'机构、角色、is_superuser 不可由用户自行修改。',
request=ProfileUpdateSerializer,
responses={200: UserSerializer},
tags=['用户'],
)
@api_view(['GET', 'PATCH'])
@permission_classes([IsAuthenticated])
def profile(request):
"""个人信息获取 / 更新(移动端个人中心)"""
user = request.user
if request.method == 'GET':
return Response(UserSerializer(user).data)
# PATCH:局部更新,仅白名单字段生效
serializer = ProfileUpdateSerializer(
user, data=request.data, partial=True, context={'request': request}
)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({
'message': '更新成功',
'user': UserSerializer(user).data,
})