import uuid from datetime import datetime from pydantic import AliasChoices, BaseModel, ConfigDict, Field, computed_field class WorkplanDependencyCreate(BaseModel): to_workplan_id: uuid.UUID | None = Field( default=None, validation_alias=AliasChoices("to_workplan_id", "to_workstream_id"), ) to_task_id: uuid.UUID | None = None relationship_type: str = "blocks" description: str | None = None class WorkplanDependencyRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID from_workplan_id: uuid.UUID to_workplan_id: uuid.UUID | None = None to_task_id: uuid.UUID | None = None relationship_type: str description: str | None = None created_at: datetime updated_at: datetime class WorkplanDepStub(BaseModel): """Minimal projection of the other end of a dependency edge.""" dep_id: uuid.UUID target_type: str = "workplan" relationship_type: str = "blocks" workplan_id: uuid.UUID | None = Field( default=None, validation_alias=AliasChoices("workplan_id", "workstream_id"), ) workplan_slug: str | None = Field( default=None, validation_alias=AliasChoices("workplan_slug", "workstream_slug"), ) workplan_title: str | None = Field( default=None, validation_alias=AliasChoices("workplan_title", "workstream_title"), ) task_id: uuid.UUID | None = None task_title: str | None = None description: str | None = None @computed_field # type: ignore[prop-decorator] @property def workstream_id(self) -> uuid.UUID | None: return self.workplan_id @computed_field # type: ignore[prop-decorator] @property def workstream_slug(self) -> str | None: return self.workplan_slug @computed_field # type: ignore[prop-decorator] @property def workstream_title(self) -> str | None: return self.workplan_title