import uuid from datetime import datetime from typing import Any from pydantic import AliasChoices, BaseModel, ConfigDict, Field, model_validator from api.schemas.compat import OptionalWorkplanIdCompatMixin class ProgressEventCreate(BaseModel): topic_id: uuid.UUID | None = None workplan_id: uuid.UUID | None = Field( default=None, validation_alias=AliasChoices("workplan_id", "workstream_id"), ) used_legacy_workstream_id: bool = Field(default=False, exclude=True) task_id: uuid.UUID | None = None decision_id: uuid.UUID | None = None event_type: str summary: str detail: dict[str, Any] | None = None author: str | None = None session_id: str | None = None @model_validator(mode="before") @classmethod def _detect_legacy_workstream_id(cls, data: Any) -> Any: if isinstance(data, dict): if data.get("workstream_id") is not None and data.get("workplan_id") is None: return {**data, "used_legacy_workstream_id": True} return data class ProgressEventRead(OptionalWorkplanIdCompatMixin, BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID topic_id: uuid.UUID | None = None task_id: uuid.UUID | None = None decision_id: uuid.UUID | None = None event_type: str summary: str detail: dict[str, Any] | None = None author: str | None = None session_id: str | None = None created_at: datetime