71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
"""Optional project-local schedule, work-order and alert projections."""
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Any
|
|
|
|
from psycopg import AsyncConnection
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class WorkbenchOperationsAvailability:
|
|
work_orders: bool
|
|
alerts: bool
|
|
schedules: bool = False
|
|
|
|
|
|
class WorkbenchOperationsRepository:
|
|
"""Read provisioned workbench records without creating or mutating storage."""
|
|
|
|
@staticmethod
|
|
async def availability(
|
|
conn: AsyncConnection,
|
|
) -> WorkbenchOperationsAvailability:
|
|
async with conn.cursor() as cur:
|
|
await cur.execute(
|
|
"""
|
|
SELECT
|
|
to_regclass('workbench.work_orders') IS NOT NULL AS work_orders,
|
|
to_regclass('workbench.alerts') IS NOT NULL AS alerts
|
|
"""
|
|
)
|
|
row = await cur.fetchone()
|
|
return WorkbenchOperationsAvailability(
|
|
work_orders=bool(row and row["work_orders"]),
|
|
alerts=bool(row and row["alerts"]),
|
|
)
|
|
|
|
@staticmethod
|
|
async def list_work_orders(
|
|
conn: AsyncConnection, project_id: str, *, limit: int = 100
|
|
) -> list[dict[str, Any]]:
|
|
async with conn.cursor() as cur:
|
|
await cur.execute(
|
|
"""
|
|
SELECT document
|
|
FROM workbench.work_orders
|
|
WHERE project_id = %s
|
|
ORDER BY updated_at DESC, work_order_id
|
|
LIMIT %s
|
|
""",
|
|
(project_id, limit),
|
|
)
|
|
return [row["document"] for row in await cur.fetchall()]
|
|
|
|
@staticmethod
|
|
async def list_alerts(
|
|
conn: AsyncConnection, project_id: str, *, limit: int = 100
|
|
) -> list[dict[str, Any]]:
|
|
async with conn.cursor() as cur:
|
|
await cur.execute(
|
|
"""
|
|
SELECT document
|
|
FROM workbench.alerts
|
|
WHERE project_id = %s
|
|
AND status = 'active'
|
|
ORDER BY occurred_at DESC, alert_id
|
|
LIMIT %s
|
|
""",
|
|
(project_id, limit),
|
|
)
|
|
return [row["document"] for row in await cur.fetchall()]
|