import uuid from datetime import datetime from typing import Literal, Optional from pydantic import BaseModel, ConfigDict, Field StudyStatus = Literal["DRAFT", "ACTIVE", "CLOSED"] class StudyCreate(BaseModel): name: str = Field(min_length=1) code: Optional[str] = None protocol_no: Optional[str] = None phase: Optional[str] = None status: StudyStatus = "DRAFT" visit_interval_days: Optional[int] = None visit_total: Optional[int] = None visit_window_start_offset: Optional[int] = None visit_window_end_offset: Optional[int] = None class StudyUpdate(BaseModel): code: Optional[str] = None name: Optional[str] = None protocol_no: Optional[str] = None phase: Optional[str] = None status: Optional[StudyStatus] = None is_locked: Optional[bool] = None visit_interval_days: Optional[int] = None visit_total: Optional[int] = None visit_window_start_offset: Optional[int] = None visit_window_end_offset: Optional[int] = None class StudyRead(BaseModel): id: uuid.UUID code: str name: str protocol_no: Optional[str] phase: Optional[str] status: StudyStatus is_locked: bool visit_interval_days: Optional[int] visit_total: Optional[int] visit_window_start_offset: Optional[int] visit_window_end_offset: Optional[int] created_by: Optional[uuid.UUID] created_at: datetime model_config = ConfigDict(from_attributes=True)