import enum import uuid from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict, Field from app.schemas.document_version import DocumentVersionRead, DocumentVersionSummary from app.schemas.distribution import DistributionStats from app.schemas.user import UserDisplay class DocumentScopeType(str, enum.Enum): GLOBAL = "GLOBAL" SITE = "SITE" DERIVED = "DERIVED" class DocumentStatus(str, enum.Enum): DRAFT = "DRAFT" ACTIVE = "ACTIVE" ARCHIVED = "ARCHIVED" class DocumentCreate(BaseModel): trial_id: uuid.UUID site_id: Optional[uuid.UUID] = None doc_no: str doc_type: str title: str scope_type: DocumentScopeType = DocumentScopeType.GLOBAL owner_id: Optional[uuid.UUID] = None description: Optional[str] = None class DocumentUpdate(BaseModel): title: Optional[str] = None doc_type: Optional[str] = None scope_type: Optional[DocumentScopeType] = None owner_id: Optional[uuid.UUID] = None site_id: Optional[uuid.UUID] = None status: Optional[DocumentStatus] = None description: Optional[str] = None class DocumentSummary(BaseModel): id: uuid.UUID trial_id: uuid.UUID site_id: Optional[uuid.UUID] = None doc_no: str doc_type: str title: str scope_type: DocumentScopeType owner_id: Optional[uuid.UUID] status: DocumentStatus current_effective_version_id: Optional[uuid.UUID] current_effective_version: Optional[DocumentVersionSummary] = None created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True) class DocumentDetail(DocumentSummary): description: Optional[str] = None owner: Optional[UserDisplay] = None version_timeline: list[DocumentVersionRead] = Field(default_factory=list) distribution_stats: DistributionStats = Field(default_factory=DistributionStats) model_config = ConfigDict(from_attributes=True)