from __future__ import annotations import uuid from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict, Field, field_validator from app.schemas.user import UserResponse StudyRole = str class StudyMemberCreate(BaseModel): user_id: uuid.UUID role_in_study: StudyRole = Field(min_length=1, max_length=20) is_active: bool = True @field_validator("role_in_study") @classmethod def validate_project_role(cls, value: str) -> str: role = value.strip() if role == "ADMIN": raise ValueError("ADMIN 不能作为项目角色") return role class StudyMemberUpdate(BaseModel): role_in_study: Optional[StudyRole] = Field(default=None, min_length=1, max_length=20) is_active: Optional[bool] = None @field_validator("role_in_study") @classmethod def validate_project_role(cls, value: str | None) -> str | None: if value is None: return value role = value.strip() if role == "ADMIN": raise ValueError("ADMIN 不能作为项目角色") return role class StudyMemberRead(BaseModel): id: uuid.UUID study_id: uuid.UUID user_id: uuid.UUID role_in_study: StudyRole is_active: bool added_at: datetime model_config = ConfigDict(from_attributes=True) class StudyMemberReadWithUser(StudyMemberRead): user: Optional[UserResponse] = None