From d74e94e6a463291fafa688c04f734876d8a86d16 Mon Sep 17 00:00:00 2001 From: dschlueter Date: Tue, 30 Jun 2026 09:51:29 +0200 Subject: [PATCH] feat(admin): Nutzungsstatistik um "mit Websuche" je Nutzer get_all_usage liefert total_web_searches (Summe aus web_search_usage); Statistik-Tabelle + Gesamtzeile zeigen die neue Spalte "mit Websuche". Co-Authored-By: Claude Opus 4.8 --- app/store.py | 4 +++- app/web/app.js | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/store.py b/app/store.py index 4a6b35d..4653dab 100644 --- a/app/store.py +++ b/app/store.py @@ -643,7 +643,9 @@ class SQLiteStore(Store): rows = conn.execute( "SELECT u.user_id, COALESCE(usr.display_name, u.user_id) AS display_name," " SUM(u.requests) AS total_requests, SUM(u.units) AS total_units," - " MAX(u.day) AS last_active" + " MAX(u.day) AS last_active," + " COALESCE((SELECT SUM(w.count) FROM web_search_usage w" + " WHERE w.user_id = u.user_id), 0) AS total_web_searches" " FROM usage u LEFT JOIN users usr ON usr.id = u.user_id" " GROUP BY u.user_id ORDER BY total_requests DESC", ).fetchall() diff --git a/app/web/app.js b/app/web/app.js index eff7acd..e8d2362 100644 --- a/app/web/app.js +++ b/app/web/app.js @@ -1826,6 +1826,7 @@ async function loadMetrics() { if (!data.length) { container.innerHTML = '

Noch keine Nutzungsdaten vorhanden.

'; return; } const totalReq = data.reduce((s, u) => s + (u.total_requests || 0), 0); + const totalWS = data.reduce((s, u) => s + (u.total_web_searches || 0), 0); const maxReq = Math.max(...data.map((u) => u.total_requests || 0), 1); const bars = data.map((u) => { @@ -1847,6 +1848,7 @@ async function loadMetrics() { Nutzer Anfragen gesamt + mit Websuche Einheiten Letzte Aktivität @@ -1856,6 +1858,7 @@ async function loadMetrics() { ${escHtml(u.display_name)} ${u.total_requests ?? 0} + ${u.total_web_searches ?? 0} ${u.total_units ?? 0} ${u.last_active || "—"} `).join("")} @@ -1864,6 +1867,7 @@ async function loadMetrics() { Gesamt ${totalReq} + ${totalWS}