from __future__ import annotations from datetime import datetime from typing import Literal, Self from uuid import UUID from pydantic import Field, model_validator from sqlmodel import SQLModel from app.schemas.common import NonEmptyStr class BoardOnboardingStart(SQLModel): pass class BoardOnboardingAnswer(SQLModel): answer: NonEmptyStr other_text: str | None = None class BoardOnboardingConfirm(SQLModel): board_type: str objective: str | None = None success_metrics: dict[str, object] | None = None target_date: datetime | None = None @model_validator(mode="after") def validate_goal_fields(self) -> Self: if self.board_type == "goal": if not self.objective or not self.success_metrics: raise ValueError("Confirmed goal boards require objective and success_metrics") return self class BoardOnboardingQuestionOption(SQLModel): id: NonEmptyStr label: NonEmptyStr class BoardOnboardingAgentQuestion(SQLModel): question: NonEmptyStr options: list[BoardOnboardingQuestionOption] = Field(min_length=1) class BoardOnboardingAgentComplete(BoardOnboardingConfirm): status: Literal["complete"] BoardOnboardingAgentUpdate = BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion class BoardOnboardingRead(SQLModel): id: UUID board_id: UUID session_key: str status: str messages: list[dict[str, object]] | None = None draft_goal: dict[str, object] | None = None created_at: datetime updated_at: datetime