diff --git a/CLAUDE.md b/CLAUDE.md index 96c4363..3350c42 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -48,7 +48,7 @@ src/: organizations.py: "CRUD Mandanten (organizations + Org-Settings + Token-Budget)" licenses.py: "CRUD Lizenzen (Org-Lizenzen, Ablauf, Nutzer-Limit, Module, Credits-Stellwerte inkl. Periode/Übertrag; Helper insert_license_row wird auch vom Org-Anlegen genutzt)" users.py: "CRUD User pro Org, Magic-Link-Einladung an info@aegis-sight.de" - sources.py: "Grundquellen, Tenant-Quellen-Übersicht, Discovery, Health-Check, KI-Vorschläge" + sources.py: "Vereinte Quellenliste (GET /api/sources?scope=all|global|tenant inkl. org_name + health_status), Stats/Languages, Einzelquellen-Health (GET /{id}/health), Aufgaben-Badge (GET /tasks/summary), Promote, Discovery, PDF-Upload, KI-Vorschläge, Klassifikation" dashboard.py: "Aggregat-Endpoints für Übersichts-Tab" token_usage.py: "Token-Verbrauch pro Org/Monat, Credits-Stellwerte je Lizenz (PUT /budget). Laufzeitfelder (credits_used-Reset, credits_carried, credits_period_start, budget_warning_sent) verwaltet der MONITOR, das Portal setzt nur Stellwerte" pricing.py: "Preis-Empfehlung aus Ist-Kosten (GET /cost-basis) und pflegbare Preistabelle billing_tariff (GET/PUT /tariff). Die Tabelle ist die Quelle der Buchung im Monitor, der Rechner kann sie speichern" @@ -61,15 +61,15 @@ src/: static/: index.html: "Login (Passwort)" - dashboard.html: "Hauptdashboard mit Tabs (Dashboard, Orgs, Lizenzen, Quellen, Audit)" + dashboard.html: "Hauptdashboard mit Tabs (Dashboard, Orgs, Quellen, Audit). Quellen hat 3 Unterreiter (Quellenliste, Aufgaben, X-Recherche-Konten)" favicon.svg: "AegisSight Logo" css/: "Stylesheets (Dark Theme)" js/: app.js: "Hauptlogik, Login, Tab-Switching, Dashboard-Render, ThemeManager (Dark/Light, localStorage portal_theme)" a11y.js: "Barrierefreiheits-Panel (Kontrast, Focus, Schrift, Animationen). IDENTISCHE Datei wie im Monitor-Repo, bei Aenderungen dort mitziehen" statistik.js: "Statistik-Tab, selbst-injizierend wie rechner.js. Inline-SVG-Charts (keine Bibliothek), Serienfarben mit dem dataviz-Validator gegen beide Themes geprüft" - sources.js: "Grundquellen + Kundenquellen Management" - source-health.js: "Quellen-Health & KI-Vorschläge" + sources.js: "Vereinte Quellenliste (Grund- + Kundenquellen, Herkunfts-Filter, Health-Ausklapp mit Deaktivieren, Bulk-Promote, Modal, Discovery, PDF-Upload)" + aufgaben.js: "Aufgaben-Posteingang (Health-Vorschläge + Klassifikations-Review + Verlauf, Badge via GET /tasks/summary)" audit.js: "Audit-Log Tab" migrations/: diff --git a/src/routers/sources.py b/src/routers/sources.py index e45cb28..afd5b7a 100644 --- a/src/routers/sources.py +++ b/src/routers/sources.py @@ -112,6 +112,39 @@ async def get_sources_meta(admin: dict = Depends(get_current_admin)): return get_meta() +@router.get("/tasks/summary") +async def tasks_summary( + admin: dict = Depends(get_current_admin), + db: aiosqlite.Connection = Depends(db_dependency), +): + """Billiger Zähler für den Aufgaben-Badge im Quellen-Reiter. + + classification_pending nutzt DIESELBE Bedingung wie /classification/stats, + damit Badge und Review-Karten nie auseinanderlaufen. + """ + suggestions_pending = 0 + cur = await db.execute( + "SELECT name FROM sqlite_master WHERE type='table' AND name='source_suggestions'" + ) + if await cur.fetchone(): + cur = await db.execute( + "SELECT COUNT(*) AS cnt FROM source_suggestions WHERE status = 'pending'" + ) + suggestions_pending = (await cur.fetchone())["cnt"] + + cur = await db.execute( + """SELECT COUNT(*) AS cnt FROM sources + WHERE status = 'active' AND proposed_political_orientation IS NOT NULL""" + ) + classification_pending = (await cur.fetchone())["cnt"] + + return { + "suggestions_pending": suggestions_pending, + "classification_pending": classification_pending, + "total": suggestions_pending + classification_pending, + } + + class GlobalSourceCreate(BaseModel): name: str = Field(min_length=1, max_length=200) diff --git a/src/static/dashboard.html b/src/static/dashboard.html index 3e0a54b..92e3ba3 100644 --- a/src/static/dashboard.html +++ b/src/static/dashboard.html @@ -286,8 +286,7 @@