Files
openclaw-mission-control/backend/app/schemas/view_models.py

80 lines
2.1 KiB
Python

"""Composite read models assembled for board and board-group views."""
from __future__ import annotations
from datetime import datetime
from uuid import UUID
from sqlmodel import Field, SQLModel
from app.schemas.agents import AgentRead
from app.schemas.approvals import ApprovalRead
from app.schemas.board_groups import BoardGroupRead
from app.schemas.board_memory import BoardMemoryRead
from app.schemas.boards import BoardRead
from app.schemas.tags import TagRef
from app.schemas.tasks import TaskRead
RUNTIME_ANNOTATION_TYPES = (
datetime,
UUID,
AgentRead,
ApprovalRead,
BoardGroupRead,
BoardMemoryRead,
BoardRead,
TagRef,
)
class TaskCardRead(TaskRead):
"""Task read model enriched with assignee and approval counters."""
assignee: str | None = None
approvals_count: int = 0
approvals_pending_count: int = 0
class BoardSnapshot(SQLModel):
"""Aggregated board payload used by board snapshot endpoints."""
board: BoardRead
tasks: list[TaskCardRead]
agents: list[AgentRead]
approvals: list[ApprovalRead]
chat_messages: list[BoardMemoryRead]
pending_approvals_count: int = 0
class BoardGroupTaskSummary(SQLModel):
"""Task summary row used inside board-group snapshot responses."""
id: UUID
board_id: UUID
board_name: str
title: str
status: str
priority: str
assigned_agent_id: UUID | None = None
assignee: str | None = None
due_at: datetime | None = None
in_progress_at: datetime | None = None
tags: list[TagRef] = Field(default_factory=list)
created_at: datetime
updated_at: datetime
class BoardGroupBoardSnapshot(SQLModel):
"""Board-level rollup embedded within a board-group snapshot."""
board: BoardRead
task_counts: dict[str, int] = Field(default_factory=dict)
tasks: list[BoardGroupTaskSummary] = Field(default_factory=list)
class BoardGroupSnapshot(SQLModel):
"""Top-level board-group snapshot response payload."""
group: BoardGroupRead | None = None
boards: list[BoardGroupBoardSnapshot] = Field(default_factory=list)