Files
medical_training/apps/user/serializers.py
T

134 lines
5.0 KiB
Python

import re
from rest_framework import serializers
from .models import User, Role, TeacherStudentRelation, Institution, Department
class UserSerializer(serializers.ModelSerializer):
institution_name = serializers.CharField(source='institution.name', read_only=True)
department_name = serializers.CharField(source='department.name', read_only=True)
class Meta:
model = User
fields = [
'id', 'username', 'real_name', 'phone', 'avatar',
'gender', 'role_type', 'institution', 'institution_name',
'department', 'department_name', 'title_name', 'practice_years',
'major', 'training_stage', 'learning_target', 'competency_profile',
'weak_dimensions', 'strong_dimensions', 'ai_preference',
'total_training_count', 'total_case_count', 'current_level',
'status', 'last_login_time', 'created_at', 'updated_at'
]
extra_kwargs = {
'password': {'write_only': True},
}
class UserCreateSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'id', 'username', 'password', 'real_name', 'phone',
'gender', 'role_type', 'institution', 'department',
'title_name', 'major', 'training_stage', 'status'
]
extra_kwargs = {
'password': {'write_only': True},
}
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
return user
class UserUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = [
'real_name', 'phone', 'avatar', 'gender', 'role_type',
'institution', 'department', 'title_name', 'practice_years',
'major', 'training_stage', 'learning_target', 'status'
]
class ProfileUpdateSerializer(serializers.ModelSerializer):
"""个人信息更新(移动端个人中心)——仅允许用户自助修改的字段。
白名单字段:username / real_name / phone / avatar / gender / department /
title_name / major / practice_years / training_stage / learning_target。
机构(institution)、角色(role_type)、is_superuser 等不在字段内,无法被用户修改。
"""
# 显式声明以去掉 ModelSerializer 自动加的 UniqueValidator,改用自定义唯一性校验
username = serializers.CharField(max_length=50)
phone = serializers.CharField(max_length=20, required=False, allow_blank=True)
class Meta:
model = User
fields = [
'username', 'real_name', 'phone', 'avatar', 'gender',
'department', 'title_name', 'major', 'practice_years',
'training_stage', 'learning_target',
]
def validate_username(self, value):
value = (value or '').strip()
if not value:
raise serializers.ValidationError('用户名不能为空')
if User.objects.filter(username=value).exclude(pk=self.instance.pk).exists():
raise serializers.ValidationError('用户名已被占用')
return value
def validate_phone(self, value):
value = (value or '').strip()
if value:
if not re.match(r'^1[3-9]\d{9}$', value):
raise serializers.ValidationError('手机号格式不合法')
if User.objects.filter(phone=value).exclude(pk=self.instance.pk).exists():
raise serializers.ValidationError('手机号已被占用')
return value
class StudentProfileConfigSerializer(serializers.Serializer):
"""医学生信息配置(首次进入系统)——科室、专业职称、执业年限。
科室为全局表,用户可自由选择想学习的科室,不再校验机构归属。
"""
department = serializers.PrimaryKeyRelatedField(
queryset=Department.objects.all(), help_text='科室 ID(全局科室)'
)
title_name = serializers.CharField(max_length=50, help_text='专业职称,如:住院医师')
practice_years = serializers.CharField(max_length=20, help_text='执业年限,如:1-3年')
class UserPasswordSerializer(serializers.Serializer):
"""密码修改序列化器"""
old_password = serializers.CharField(required=True, write_only=True)
new_password = serializers.CharField(required=True, write_only=True, min_length=6)
class RoleSerializer(serializers.ModelSerializer):
class Meta:
model = Role
fields = '__all__'
class TeacherStudentRelationSerializer(serializers.ModelSerializer):
teacher_name = serializers.CharField(source='teacher.real_name', read_only=True)
student_name = serializers.CharField(source='student.real_name', read_only=True)
class Meta:
model = TeacherStudentRelation
fields = '__all__'
class InstitutionSerializer(serializers.ModelSerializer):
class Meta:
model = Institution
fields = '__all__'
class DepartmentSerializer(serializers.ModelSerializer):
class Meta:
model = Department
fields = '__all__'