from rest_framework_simplejwt.tokens import RefreshToken from config.exceptions import AppError ALLOWED_ROLE_TYPES = ('student', 'doctor', 'teacher') # CMS 端可登录的角色(U3 密码登录):超级管理员 / 医院管理员 / 内容管理员 / 医生(带教老师) CMS_ROLE_TYPES = ('super_admin', 'hospital_admin', 'content_admin', 'doctor') # U2 代注册:仅以下角色可代注册 REGISTER_ADMIN_ROLES = ('super_admin', 'hospital_admin') # 各管理员可代注册创建的目标角色(超管可建所有角色;医院管理员可建内容管理员/医生/学生) REGISTERABLE_ROLES = { 'super_admin': ('super_admin', 'hospital_admin', 'content_admin', 'doctor', 'student'), 'hospital_admin': ('content_admin', 'doctor', 'student'), } # 预留试用机构:移动端选择该机构时手机号+验证码首次即注册、后续即登录。识别以名称为准。 TRIAL_INSTITUTION_NAME = '北大医学部(实验室)试用' TRIAL_INSTITUTION_CODE = 'PKU_LAB_TRIAL' def get_tokens_for_user(user): refresh = RefreshToken.for_user(user) return {'access': str(refresh.access_token), 'refresh': str(refresh)} def build_user_response(user): inst = user.institution if user.institution_id else None return { 'id': user.id, 'username': user.username, 'phone': user.phone, 'real_name': user.real_name, 'role_type': user.role_type, 'institution_code': inst.code if inst else None, 'institution_name': inst.name if inst else None, 'department': user.department.name if user.department_id else None, } def resolve_or_create_institution(code, name): """按机构编码查找,不存在则自动创建。 Args: code: 机构编码(必填,唯一标识) name: 机构名称(必填,创建时使用) Returns: Institution 实例 """ from apps.user.models import Institution if not code: raise AppError('USER_INSTITUTION_CODE_REQUIRED', '机构编码不能为空') if not name: raise AppError('USER_INSTITUTION_REQUIRED', '机构名称不能为空') institution, _ = Institution.objects.get_or_create( code=code, defaults={'name': name, 'type': 'hospital'}, ) return institution def get_client_ip(request): xff = request.META.get('HTTP_X_FORWARDED_FOR') if xff: return xff.split(',')[0].strip() return request.META.get('REMOTE_ADDR') def get_user_agent(request): return request.META.get('HTTP_USER_AGENT', '')