feat: update init users
This commit is contained in:
@@ -2,7 +2,10 @@ from rest_framework_simplejwt.tokens import RefreshToken
|
||||
|
||||
from config.exceptions import AppError
|
||||
|
||||
ALLOWED_ROLE_TYPES = ('student', 'doctor', 'teacher')
|
||||
# 系统五类角色:super_admin / hospital_admin / content_admin / doctor(带教医生)/ student
|
||||
ROLE_TYPES = ('super_admin', 'hospital_admin', 'content_admin', 'doctor', 'student')
|
||||
# 移动端可自注册的角色(带教老师即 doctor,不单列 teacher)
|
||||
ALLOWED_ROLE_TYPES = ('student', 'doctor')
|
||||
|
||||
# CMS 端可登录的角色(U3 密码登录):超级管理员 / 医院管理员 / 内容管理员 / 医生(带教老师)
|
||||
CMS_ROLE_TYPES = ('super_admin', 'hospital_admin', 'content_admin', 'doctor')
|
||||
|
||||
@@ -2,6 +2,8 @@ import os
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.contrib.auth import get_user_model
|
||||
|
||||
from apps.user.models import TeacherStudentRelation
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
@@ -24,9 +26,12 @@ class Command(BaseCommand):
|
||||
# 创建超级管理员
|
||||
self._create_superadmin()
|
||||
|
||||
# 创建测试角色用户
|
||||
# 创建测试角色用户(覆盖五类角色:医院管理员/内容管理员/带教医生/学生)
|
||||
self._create_test_users()
|
||||
|
||||
# 师生关系(只在 doctor 与 student 之间)
|
||||
self._create_relation()
|
||||
|
||||
self.stdout.write(self.style.SUCCESS('\n[完成] 用户初始化完成'))
|
||||
|
||||
def _create_superadmin(self):
|
||||
@@ -55,6 +60,13 @@ class Command(BaseCommand):
|
||||
def _create_test_users(self):
|
||||
"""创建测试用户"""
|
||||
test_users = [
|
||||
{
|
||||
'username': 'hospital_admin',
|
||||
'password': 'hospital123',
|
||||
'real_name': '医院管理员',
|
||||
'role_type': 'hospital_admin',
|
||||
'phone': '13800138003',
|
||||
},
|
||||
{
|
||||
'username': 'doctor1',
|
||||
'password': 'doctor123',
|
||||
@@ -103,3 +115,16 @@ class Command(BaseCommand):
|
||||
f'[已存在] 用户: {user_data["username"]} ({user_data["real_name"]})'
|
||||
)
|
||||
)
|
||||
|
||||
def _create_relation(self):
|
||||
"""初始化一条师生关系(带教医生 doctor1 → 学生 student1)。"""
|
||||
teacher = User.objects.filter(username='doctor1', role_type='doctor').first()
|
||||
student = User.objects.filter(username='student1', role_type='student').first()
|
||||
if not teacher or not student:
|
||||
return
|
||||
_, created = TeacherStudentRelation.objects.get_or_create(
|
||||
teacher=teacher, student=student,
|
||||
defaults={'relation_type': '指导', 'status': 1},
|
||||
)
|
||||
msg = '[创建] 师生关系: doctor1 → student1' if created else '[已存在] 师生关系: doctor1 → student1'
|
||||
self.stdout.write((self.style.SUCCESS if created else self.style.WARNING)(msg))
|
||||
|
||||
@@ -16,7 +16,7 @@ class IsUserListPermitted(BasePermission):
|
||||
user = request.user
|
||||
if _is_admin(user):
|
||||
return True
|
||||
if user.role_type == 'teacher':
|
||||
if user.role_type == 'doctor': # 带教医生:可看名下学生
|
||||
return True
|
||||
raise AppError('USER_NO_LIST_PERMISSION', '您没有查看用户列表的权限', status_code=403)
|
||||
|
||||
@@ -32,8 +32,8 @@ class IsUserDetailPermitted(BasePermission):
|
||||
# 本人:可查看自己
|
||||
if user.id == obj.id:
|
||||
return True
|
||||
# 教师:可查看自己名下活跃学生
|
||||
if user.role_type == 'teacher':
|
||||
# 带教医生:可查看自己名下活跃学生
|
||||
if user.role_type == 'doctor':
|
||||
if TeacherStudentRelation.objects.filter(
|
||||
teacher=user, student=obj, status=1
|
||||
).exists():
|
||||
|
||||
@@ -120,6 +120,16 @@ class TeacherStudentRelationSerializer(serializers.ModelSerializer):
|
||||
model = TeacherStudentRelation
|
||||
fields = '__all__'
|
||||
|
||||
def validate(self, attrs):
|
||||
# 师生关系只能在 带教医生(doctor) 与 学生(student) 之间建立
|
||||
teacher = attrs.get('teacher') or getattr(self.instance, 'teacher', None)
|
||||
student = attrs.get('student') or getattr(self.instance, 'student', None)
|
||||
if teacher is not None and teacher.role_type != 'doctor':
|
||||
raise serializers.ValidationError({'teacher': '带教方必须是带教医生(doctor)'})
|
||||
if student is not None and student.role_type != 'student':
|
||||
raise serializers.ValidationError({'student': '学生方必须是学生(student)'})
|
||||
return attrs
|
||||
|
||||
|
||||
class InstitutionSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
|
||||
+2
-2
@@ -67,8 +67,8 @@ class UserViewSet(viewsets.ModelViewSet):
|
||||
if self.action == 'list':
|
||||
if user.role_type in ('super_admin', 'content_admin') or user.is_staff:
|
||||
return qs # 管理员:全员
|
||||
elif user.role_type == 'teacher':
|
||||
# 教师:仅自己名下活跃学生
|
||||
elif user.role_type == 'doctor':
|
||||
# 带教医生:仅自己名下活跃学生
|
||||
student_ids = TeacherStudentRelation.objects.filter(
|
||||
teacher=user, status=1
|
||||
).values_list('student_id', flat=True)
|
||||
|
||||
Reference in New Issue
Block a user