from __future__ import annotations import uuid from typing import Any from sqlalchemy import Index, Integer, JSON, String, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from govoplan_core.db.base import Base, TimestampMixin def new_uuid() -> str: return str(uuid.uuid4()) class DashboardLayout(Base, TimestampMixin): __tablename__ = "dashboard_layouts" __table_args__ = ( UniqueConstraint( "tenant_id", "account_id", "context_key", name="uq_dashboard_layouts_actor_context", ), Index( "ix_dashboard_layouts_actor", "tenant_id", "account_id", ), ) id: Mapped[str] = mapped_column( String(36), primary_key=True, default=new_uuid, ) tenant_id: Mapped[str] = mapped_column( String(36), nullable=False, index=True, ) account_id: Mapped[str] = mapped_column( String(255), nullable=False, index=True, ) context_key: Mapped[str] = mapped_column( String(300), nullable=False, index=True, ) view_id: Mapped[str | None] = mapped_column( String(255), nullable=True, index=True, ) layout_version: Mapped[int] = mapped_column( Integer, default=1, nullable=False, ) revision: Mapped[int] = mapped_column( Integer, default=1, nullable=False, ) placements: Mapped[list[dict[str, Any]]] = mapped_column( JSON, default=list, nullable=False, ) known_widget_ids: Mapped[list[str]] = mapped_column( JSON, default=list, nullable=False, ) __all__ = ["DashboardLayout", "new_uuid"]