Add dashboard summary tiles

Shows rider count, activities imported in the last 7 days, 7-day
sync success rate, and how many riders currently need attention,
right above the rider list where an admin looks first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Bastian Wagner
2026-08-16 12:48:44 +02:00
parent 9df6a619d2
commit a0890126bc
6 changed files with 232 additions and 5 deletions

View File

@@ -1,3 +1,4 @@
from datetime import timedelta
from pathlib import Path
from fastapi import APIRouter, Form, HTTPException, Request, status
@@ -6,11 +7,13 @@ from fastapi.templating import Jinja2Templates
from app.auth.admin import password_matches, require_admin
from app.auth.csrf import ensure_csrf_token, validate_csrf
from app.db.models import SyncUser
from app.db.models import SyncUser, utcnow
from app.db.repositories import ActivityRepository, SyncRunRepository, UserRepository
from app.security.credentials import CredentialCipher
from app.web.forms import UserFormData
DASHBOARD_SUMMARY_WINDOW = timedelta(days=7)
router = APIRouter()
templates = Jinja2Templates(directory=str(Path(__file__).resolve().parent / "templates"))
@@ -70,11 +73,13 @@ def login(
def dashboard(request: Request):
require_admin(request)
with request.app.state.session_factory() as session:
rows = UserRepository(session).dashboard_rows()
repository = UserRepository(session)
rows = repository.dashboard_rows()
summary = repository.dashboard_summary(since=utcnow() - DASHBOARD_SUMMARY_WINDOW)
return templates.TemplateResponse(
request,
"dashboard.html",
{"rows": rows, "csrf_token": ensure_csrf_token(request)},
{"rows": rows, "summary": summary, "csrf_token": ensure_csrf_token(request)},
)