feat(dashboard): merge top summary strip + Status widget into one Overview
Operator chose a single canonical summary. Repurpose the status_overview widget into 'Overview' (host count + monitor up/down/pending + Alerts link; key kept so existing dashboards upgrade in place) and remove the redundant fixed top strip from the dashboard view. Drops _get_summary_stats and its now-unused PingResult/DnsResult imports (rule 22). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -9,7 +9,6 @@ from sqlalchemy import select, func, update
|
||||
from steward.auth.middleware import require_role, current_user_id
|
||||
from steward.models.users import UserRole
|
||||
from steward.models.hosts import Host
|
||||
from steward.models.monitors import PingResult, DnsResult
|
||||
from steward.models.dashboard import Dashboard, DashboardWidget, DashboardShareToken
|
||||
from steward.core.settings import public_base_url
|
||||
from steward.core.widgets import get_available_widgets, WIDGET_REGISTRY
|
||||
@@ -103,42 +102,6 @@ async def _get_or_create_system_default(db) -> Dashboard:
|
||||
return dash
|
||||
|
||||
|
||||
async def _get_summary_stats(db) -> dict:
|
||||
latest_ping_subq = (
|
||||
select(PingResult.host_id, func.max(PingResult.probed_at).label("max_at"))
|
||||
.group_by(PingResult.host_id).subquery()
|
||||
)
|
||||
pr = await db.execute(
|
||||
select(PingResult).join(
|
||||
latest_ping_subq,
|
||||
(PingResult.host_id == latest_ping_subq.c.host_id)
|
||||
& (PingResult.probed_at == latest_ping_subq.c.max_at),
|
||||
)
|
||||
)
|
||||
pings = list(pr.scalars())
|
||||
ping_up = sum(1 for p in pings if p.status.value == "up")
|
||||
ping_down = sum(1 for p in pings if p.status.value == "down")
|
||||
|
||||
latest_dns_subq = (
|
||||
select(DnsResult.host_id, func.max(DnsResult.resolved_at).label("max_at"))
|
||||
.group_by(DnsResult.host_id).subquery()
|
||||
)
|
||||
dr = await db.execute(
|
||||
select(DnsResult).join(
|
||||
latest_dns_subq,
|
||||
(DnsResult.host_id == latest_dns_subq.c.host_id)
|
||||
& (DnsResult.resolved_at == latest_dns_subq.c.max_at),
|
||||
)
|
||||
)
|
||||
dns = list(dr.scalars())
|
||||
dns_ok = sum(1 for d in dns if d.status.value == "resolved")
|
||||
dns_fail = sum(1 for d in dns if d.status.value != "resolved")
|
||||
total = (await db.execute(select(func.count()).select_from(Host))).scalar()
|
||||
|
||||
return dict(ping_up=ping_up, ping_down=ping_down,
|
||||
dns_ok=dns_ok, dns_fail=dns_fail, total_hosts=total)
|
||||
|
||||
|
||||
def _resolve_widgets(widgets: list[DashboardWidget]) -> list[dict]:
|
||||
plugins_cfg = current_app.config.get("PLUGINS", {})
|
||||
out = []
|
||||
@@ -199,7 +162,6 @@ async def view(dash_id: int):
|
||||
if dash is None or not _can_view(dash, user_id, user_role):
|
||||
abort(404)
|
||||
|
||||
stats = await _get_summary_stats(db)
|
||||
widgets = await _get_widgets(db, dash_id)
|
||||
accessible = await _accessible_dashboards(db, user_id, user_role)
|
||||
can_edit = _can_edit(dash, user_id, user_role)
|
||||
@@ -224,7 +186,6 @@ async def view(dash_id: int):
|
||||
can_edit=can_edit,
|
||||
addable=addable,
|
||||
hosts=hosts,
|
||||
**stats,
|
||||
)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user