""" Seismograph Dashboard API Router Provides endpoints for the seismograph-specific dashboard """ from fastapi import APIRouter, Request, Depends, Query from fastapi.responses import HTMLResponse from sqlalchemy.orm import Session from backend.database import get_db from backend.models import RosterUnit from backend.templates_config import templates router = APIRouter(prefix="/api/seismo-dashboard", tags=["seismo-dashboard"]) @router.get("/stats", response_class=HTMLResponse) async def get_seismo_stats(request: Request, db: Session = Depends(get_db)): """ Returns HTML partial with seismograph statistics summary """ # Get all seismograph units seismos = db.query(RosterUnit).filter_by( device_type="seismograph", retired=False ).all() total = len(seismos) deployed = sum(1 for s in seismos if s.deployed) benched = sum(1 for s in seismos if not s.deployed) # Count modems assigned to deployed seismographs with_modem = sum(1 for s in seismos if s.deployed and s.deployed_with_modem_id) without_modem = deployed - with_modem return templates.TemplateResponse( "partials/seismo_stats.html", { "request": request, "total": total, "deployed": deployed, "benched": benched, "with_modem": with_modem, "without_modem": without_modem } ) @router.get("/units", response_class=HTMLResponse) async def get_seismo_units( request: Request, db: Session = Depends(get_db), search: str = Query(None) ): """ Returns HTML partial with filterable seismograph unit list """ query = db.query(RosterUnit).filter_by( device_type="seismograph", retired=False ) # Apply search filter if search: search_lower = search.lower() query = query.filter( (RosterUnit.id.ilike(f"%{search}%")) | (RosterUnit.note.ilike(f"%{search}%")) | (RosterUnit.address.ilike(f"%{search}%")) ) seismos = query.order_by(RosterUnit.id).all() return templates.TemplateResponse( "partials/seismo_unit_list.html", { "request": request, "units": seismos, "search": search or "" } )