62 lines
1.5 KiB
Python
62 lines
1.5 KiB
Python
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
|