import enum import uuid from datetime import datetime from typing import Optional from pydantic import BaseModel, ConfigDict, Field class DistributionTargetType(str, enum.Enum): SITE = "SITE" ROLE = "ROLE" USER = "USER" class DistributionStatus(str, enum.Enum): ACTIVE = "ACTIVE" CLOSED = "CLOSED" class DistributionTarget(BaseModel): target_type: DistributionTargetType target_id: str class DistributionCreate(BaseModel): targets: list[DistributionTarget] due_at: Optional[datetime] = None class DistributionStats(BaseModel): total: int = 0 received: int = 0 read: int = 0 trained: int = 0 overdue: int = 0 class DistributionRead(BaseModel): id: uuid.UUID document_id: uuid.UUID version_id: uuid.UUID target_type: DistributionTargetType target_id: str status: DistributionStatus due_at: Optional[datetime] = None created_by: Optional[uuid.UUID] = None created_at: datetime stats: DistributionStats = Field(default_factory=DistributionStats) model_config = ConfigDict(from_attributes=True)