import uuid from datetime import datetime from pydantic import BaseModel, ConfigDict, model_validator from api.models.decision import DecisionStatus, DecisionType class DecisionCreate(BaseModel): topic_id: uuid.UUID | None = None workstream_id: uuid.UUID | None = None title: str description: str | None = None decision_type: DecisionType = DecisionType.pending status: DecisionStatus = DecisionStatus.open rationale: str | None = None decided_by: str | None = None decided_at: datetime | None = None deadline: datetime | None = None escalation_note: str | None = None @model_validator(mode="after") def topic_or_workstream_required(self) -> "DecisionCreate": if self.topic_id is None and self.workstream_id is None: raise ValueError("At least one of topic_id or workstream_id must be set") return self class DecisionResolve(BaseModel): rationale: str decided_by: str write_log: bool = True # append to DECISIONS.md in the registered project directory class DecisionUpdate(BaseModel): title: str | None = None description: str | None = None decision_type: DecisionType | None = None status: DecisionStatus | None = None rationale: str | None = None decided_by: str | None = None decided_at: datetime | None = None deadline: datetime | None = None escalation_note: str | None = None superseded_by: uuid.UUID | None = None class DecisionRead(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID topic_id: uuid.UUID | None = None workstream_id: uuid.UUID | None = None title: str description: str | None = None decision_type: DecisionType status: DecisionStatus rationale: str | None = None decided_by: str | None = None decided_at: datetime | None = None deadline: datetime | None = None escalation_note: str | None = None superseded_by: uuid.UUID | None = None created_at: datetime updated_at: datetime