gwoe-antragspruefer/app
Dotty Dotter d54ce23e42 feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen
Vollständiges 4-Phasen-Feature:

**Phase 1 — News-Aggregator** (`app/news_aggregator.py`)
- Tagesschau-API (`/api2u/news?ressort=...`) für inland/ausland/wirtschaft/wissen
- Bundestag-RSS für aktuellethemen / pressemitteilungen / hib
- DB-Tabelle `news_articles` (URL-PK, idempotent)
- Embeddings via existierender qwen-v4-Pipeline
- Cron-Script `scripts/auto-fetch-news.sh`
- Bewusst NICHT: RND.de (robots.txt bannt explizit ClaudeBot, GPTBot,
  CCBot, ChatGPT-User, Google-Extended). Nur AI-erlaubende, öffentlich-
  rechtliche/parlamentarische Quellen
- Volltexte werden NICHT persistiert (nur Titel + erster Satz)

**Phase 2 — Themen × Anträge Matching** (`app/themen_matching.py`)
- News-Embedding × Assessment-summary_embedding via Cosine-Similarity
- `find_anträge_for_news`: pro News die Top-K passenden Anträge
- `find_news_for_antrag`: pro Antrag Top-K News mit Datums-Fenster (90d)
- `aggregate_top_themen`: primärer Dashboard-Endpoint
- `aggregate_themen_zeitreihe`: News-Volumen pro Tag × Source

**Phase 3 — Dashboard-View** (`/aktuelle-themen`)
- Neuer linker Nav-Eintrag „Aktuelle Themen"
- Stacked-Area-Chart News-Volumen pro Quelle (30d)
- Pro News-Card: Titel + Summary + Tags + Top-3-Antrags-Match-Liste
  mit GWÖ-Score-Pill, Drucksache-Link, PM-Vorschlag-Button
- Filter: Zeitfenster, Top-N, min_similarity
- Auth-protected (require_auth)

**Phase 4 — Pressemitteilungs-Generator** (`app/presse_generator.py`)
- LLM-Prompt-Template (200-250 Worte, GWÖ-Sicht, JSON-Output)
- Reuse von `QwenBewerter` aus app/adapters/qwen_bewerter.py
- DB-Tabelle `presse_drafts` (Persistenz)
- POST `/api/aktuelle-themen/generate-presse` rate-limited 5/min,
  auth-only (LLM-Kosten)
- GET `/api/aktuelle-themen/drafts` + `/drafts/{id}` für Liste/Detail
- Manueller Trigger via UI-Button, kein Auto-Versand
- Modal-Anzeige des generierten Texts

**Compliance:**
- robots.txt-respektierend (ClaudeBot-Bann von RND vermieden, AI-
  erlaubende Quellen verwendet)
- UI zeigt nur Titel+URL+Datum+erster Satz, keine Volltext-Reproduktion
- Pressemitteilungen sind explizit Drafts, nicht Auto-Versand
- LLM-Calls rate-limited, auth-only

**Tests:** 43 neue Tests (19 news_aggregator + 16 themen_matching +
8 presse_generator). Suite jetzt 1048 grün.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 12:39:36 +02:00
..
adapters refactor(#136): DDD-Lightweight Tag 1-4 (Ports, Adapter, Repositories, Domain-Verhalten) 2026-04-25 20:55:16 +02:00
kontext Activate LSA: Wahlprogramme + ingest + frontend (#2) 2026-04-07 22:12:32 +02:00
ports refactor(#136): DDD-Lightweight Tag 1-4 (Ports, Adapter, Repositories, Domain-Verhalten) 2026-04-25 20:55:16 +02:00
protokoll_parsers feat(#149): BB-Parser produktiv — Brandenburger Plenarprotokolle (Status-Only) 2026-04-29 02:04:21 +02:00
repositories refactor(#136): DDD-Lightweight Tag 1-4 (Ports, Adapter, Repositories, Domain-Verhalten) 2026-04-25 20:55:16 +02:00
routers Initial commit: GWÖ-Antragsprüfer v1.0 2026-03-28 22:30:24 +01:00
static feat(#147): Hover-Tooltips fuer Abkuerzungen auf Antrag-Detail 2026-04-28 08:46:27 +02:00
templates feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen 2026-05-03 12:39:36 +02:00
__init__.py Initial commit: GWÖ-Antragsprüfer v1.0 2026-03-28 22:30:24 +01:00
abgeordnetenwatch.py feat(#106,#135,#128): Monitoring + abgeordnetenwatch + Wahlprogramm-Check 2026-04-25 20:55:16 +02:00
analyzer.py feat(#145): LLM-Prompts auf /methodik als Transparenz-Block 2026-04-28 01:50:25 +02:00
auswertungen.py feat(#168): Über-Zeit-Drift im Stimmverhalten-Tab 2026-04-29 23:03:53 +02:00
auth.py feat(#139,#129,#138,#141): v2-Frontend (ECOnGOOD-CD), Login-Modal, Auto-DL, OG-Cards 2026-04-25 20:55:57 +02:00
bundeslaender.py #31/#34/#35: BY, NI, SL auf aktiv=True — alle 17 Parlamente jetzt im UI 2026-04-10 17:43:32 +02:00
clustering.py feat: 16 BL-Adapter, Drucksache-Typen, Mail-Digest, Clustering, Redline-Parser 2026-04-25 20:54:50 +02:00
config.py feat(feedback): konfigurierbare Issue-Labels via GITEA_FEEDBACK_LABELS 2026-04-28 01:31:25 +02:00
database.py feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen 2026-05-03 12:39:36 +02:00
drucksache_typen.py fix(v2): Topbar harte Hoehe 32px + Kleine-Anfragen-Heuristik in Landtag-Suche 2026-04-25 22:23:22 +02:00
embeddings.py fix: PDF-Link mit #page=N-Hash — Browser-PDF-Viewer landet jetzt direkt auf der richtigen Seite 2026-04-25 22:09:46 +02:00
ingest_votes.py feat(#148): BUND-Parser produktiv — Bundestags-XML-Plenarprotokolle 2026-04-28 23:21:39 +02:00
mail.py feat: 16 BL-Adapter, Drucksache-Typen, Mail-Digest, Clustering, Redline-Parser 2026-04-25 20:54:50 +02:00
main.py feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen 2026-05-03 12:39:36 +02:00
models.py refactor(#136): DDD-Lightweight Tag 1-4 (Ports, Adapter, Repositories, Domain-Verhalten) 2026-04-25 20:55:16 +02:00
monitoring.py feat(#106,#135,#128): Monitoring + abgeordnetenwatch + Wahlprogramm-Check 2026-04-25 20:55:16 +02:00
news_aggregator.py feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen 2026-05-03 12:39:36 +02:00
og_card.py feat(#139,#129,#138,#141): v2-Frontend (ECOnGOOD-CD), Login-Modal, Auto-DL, OG-Cards 2026-04-25 20:55:57 +02:00
parlamente.py fix(#142): SL HTTP 5xx als Fehler raisen statt return [] 2026-04-28 01:46:35 +02:00
parteien.py Phase J: SN EDAS-XML-Adapter (#26/#38) — Sachsen aktiv via XML-Export 2026-04-09 14:39:03 +02:00
presse_generator.py feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen 2026-05-03 12:39:36 +02:00
queue.py feat(#139,#129,#138,#141): v2-Frontend (ECOnGOOD-CD), Login-Modal, Auto-DL, OG-Cards 2026-04-25 20:55:57 +02:00
redline_utils.py fix: PDF-Link mit #page=N-Hash — Browser-PDF-Viewer landet jetzt direkt auf der richtigen Seite 2026-04-25 22:09:46 +02:00
reindex_embeddings.py feat: 16 BL-Adapter, Drucksache-Typen, Mail-Digest, Clustering, Redline-Parser 2026-04-25 20:54:50 +02:00
report.py #57 Security: print() → logger.exception für alle Module 2026-04-10 17:05:12 +02:00
sync_abgeordnetenwatch.py feat(#106,#135,#128): Monitoring + abgeordnetenwatch + Wahlprogramm-Check 2026-04-25 20:55:16 +02:00
themen_matching.py feat(#170): Aktuelle-Themen-Dashboard — News × Anträge × Pressemitteilungen 2026-05-03 12:39:36 +02:00
validators.py feat(#139,#129,#138,#141): v2-Frontend (ECOnGOOD-CD), Login-Modal, Auto-DL, OG-Cards 2026-04-25 20:55:57 +02:00
wahlperioden.py Phase C: Auswertungen-Dashboard #58 + CSV-Export #45 (Roadmap #59) 2026-04-09 11:25:57 +02:00
wahlprogramm_check.py feat(#106,#135,#128): Monitoring + abgeordnetenwatch + Wahlprogramm-Check 2026-04-25 20:55:16 +02:00
wahlprogramm_fetch.py feat(#138): SHA-Lock-File schuetzt vor stillem PDF-Tausch 2026-04-28 01:58:42 +02:00
wahlprogramm-links.yaml feat(#139,#129,#138,#141): v2-Frontend (ECOnGOOD-CD), Login-Modal, Auto-DL, OG-Cards 2026-04-25 20:55:57 +02:00
wahlprogramm-shas.lock.json feat(#138): SHA-Lock-File schuetzt vor stillem PDF-Tausch 2026-04-28 01:58:42 +02:00
wahlprogramme.py Add 30 Wahlprogramme für TH/BB/HH/SH/BW/RP (#37, #39, #40, #32, #41, #42) 2026-04-09 08:03:11 +02:00