52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
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):
|
|
code: str = Field(min_length=1)
|
|
name: str = Field(min_length=1)
|
|
sponsor: 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
|
|
sponsor: Optional[str] = None
|
|
protocol_no: Optional[str] = None
|
|
phase: Optional[str] = None
|
|
status: Optional[StudyStatus] = 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
|
|
sponsor: Optional[str]
|
|
protocol_no: Optional[str]
|
|
phase: Optional[str]
|
|
status: StudyStatus
|
|
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)
|