utp_service/backend/app/models/dashboard.py
2026-05-05 11:32:25 +03:00

98 lines
4.5 KiB
Python

from datetime import datetime
from typing import Optional
from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, UniqueConstraint
from sqlalchemy.dialects.postgresql import ARRAY, JSONB
from sqlalchemy.orm import Mapped, mapped_column
from .base import Base, TimestampMixin
CHECK_STATUS_VALUES = (
"online",
"offline",
"unknown",
"ok",
"warn",
"failed",
)
MONITOR_POLICY_MODES = ("inherit", "include", "exclude")
class DashboardCheckDefinition(Base, TimestampMixin):
__tablename__ = "dashboard_check_definitions"
check_key: Mapped[str] = mapped_column(String(64), primary_key=True)
enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
interval_sec_default: Mapped[int] = mapped_column(Integer, nullable=False, default=300)
plugin_action: Mapped[str] = mapped_column(String(128), nullable=False)
categories: Mapped[list[str]] = mapped_column(ARRAY(String), nullable=False, default=list)
timeout_sec: Mapped[int] = mapped_column(Integer, nullable=False, default=30)
concurrency: Mapped[int] = mapped_column(Integer, nullable=False, default=20)
class DashboardObjectCheckOverride(Base, TimestampMixin):
__tablename__ = "dashboard_object_check_overrides"
__table_args__ = (UniqueConstraint("object_id", "check_key", name="uq_dashboard_obj_check"),)
id: Mapped[int] = mapped_column(Integer, primary_key=True)
object_id: Mapped[int] = mapped_column(
Integer, ForeignKey("objects.id", ondelete="CASCADE"), nullable=False, index=True
)
check_key: Mapped[str] = mapped_column(
String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False
)
enabled_override: Mapped[Optional[bool]] = mapped_column(Boolean, nullable=True)
interval_sec_override: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
categories_override: Mapped[Optional[list[str]]] = mapped_column(ARRAY(String), nullable=True)
class DashboardDeviceLiveState(Base):
__tablename__ = "dashboard_device_live_state"
__table_args__ = (UniqueConstraint("device_id", "check_key", name="uq_dashboard_device_check"),)
id: Mapped[int] = mapped_column(Integer, primary_key=True)
device_id: Mapped[int] = mapped_column(
Integer, ForeignKey("devices.id", ondelete="CASCADE"), nullable=False, index=True
)
check_key: Mapped[str] = mapped_column(
String(64), ForeignKey("dashboard_check_definitions.check_key", ondelete="CASCADE"), nullable=False, index=True
)
status: Mapped[str] = mapped_column(String(20), nullable=False, default="unknown")
value_json: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)
error: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
checked_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, index=True)
duration_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
source: Mapped[str] = mapped_column(String(32), nullable=False, default="dashboard_monitor")
class DashboardObjectMonitorPolicy(Base, TimestampMixin):
__tablename__ = "dashboard_object_monitor_policy"
object_id: Mapped[int] = mapped_column(
Integer, ForeignKey("objects.id", ondelete="CASCADE"), primary_key=True
)
mode: Mapped[str] = mapped_column(String(16), nullable=False, default="inherit")
class DashboardTagMonitorPolicy(Base, TimestampMixin):
__tablename__ = "dashboard_tag_monitor_policy"
tag_id: Mapped[int] = mapped_column(
Integer, ForeignKey("tags.id", ondelete="CASCADE"), primary_key=True
)
enabled: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True)
class DashboardMonitorRunState(Base):
__tablename__ = "dashboard_monitor_run_state"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
status: Mapped[str] = mapped_column(String(20), nullable=False, default="idle")
run_type: Mapped[Optional[str]] = mapped_column(String(20), nullable=True)
scope: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)
started_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
finished_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
last_success_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
last_error: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
last_counts: Mapped[Optional[dict]] = mapped_column(JSONB, nullable=True)