80 lines
1.8 KiB
Python
80 lines
1.8 KiB
Python
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"]
|