From 7cbd46f88d80d4773f3a485297cb48397237c7c0 Mon Sep 17 00:00:00 2001 From: Dotty Dotter Date: Sat, 25 Apr 2026 22:34:55 +0200 Subject: [PATCH] feat(v2): Atom-Feed-Konfig-Seite + Eigene-Abos-Verwaltung MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend (Filter sind seit jeher da): - /api/feed.xml?bundesland=&partei=&limit= - /api/subscriptions GET/POST/DELETE UI: - /v2/feed: Form mit BL/Partei/Limit, generiert Feed-URL live, Buttons Oeffnen/ URL-Kopieren/In-Feedly. Default-BL aus Header-Selektor uebernommen - /v2/abos: Liste eigener Abos + Form zum Anlegen/Loeschen, BL-Dropdown, Partei-Freitext, Frequenz daily/weekly - Sidebar 'Daten'-Gruppe um beide Eintraege erweitert (statt Direkt-Link auf /api/feed.xml) - Beide Routen mit Depends(require_auth) — Anonyme bekommen 401-Redirect Co-Authored-By: Claude Opus 4.7 (1M context) --- app/main.py | 20 ++++ app/templates/v2/base.html | 3 +- app/templates/v2/screens/abos.html | 163 +++++++++++++++++++++++++++++ app/templates/v2/screens/feed.html | 122 +++++++++++++++++++++ 4 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 app/templates/v2/screens/abos.html create mode 100644 app/templates/v2/screens/feed.html diff --git a/app/main.py b/app/main.py index cda8b91..7296a65 100644 --- a/app/main.py +++ b/app/main.py @@ -2268,6 +2268,26 @@ async def v2_tags(request: Request, current_user: Optional[dict] = Depends(get_c }) +@app.get("/v2/abos", response_class=HTMLResponse) +async def v2_abos(request: Request, current_user: dict = Depends(require_auth)): + """Eigene E-Mail-Abos verwalten — auth-only.""" + return templates.TemplateResponse("v2/screens/abos.html", { + "request": request, + "v2_active_nav": "abos", + **_v2_template_context(current_user), + }) + + +@app.get("/v2/feed", response_class=HTMLResponse) +async def v2_feed(request: Request, current_user: dict = Depends(require_auth)): + """Atom-Feed-Konfigurations-Seite — auth-only.""" + return templates.TemplateResponse("v2/screens/feed.html", { + "request": request, + "v2_active_nav": "feed", + **_v2_template_context(current_user), + }) + + @app.get("/v2/cluster", response_class=HTMLResponse) async def v2_cluster(request: Request, current_user: dict = Depends(require_admin)): """Cluster-Liste — nur für Admins.""" diff --git a/app/templates/v2/base.html b/app/templates/v2/base.html index b9dc829..70717a7 100644 --- a/app/templates/v2/base.html +++ b/app/templates/v2/base.html @@ -57,7 +57,8 @@
— Daten
{{ icon("chart-bar", 14) }} Auswertungen {{ icon("file-csv", 14) }} Export · API - {{ icon("rss", 14) }} Atom-Feed + {{ icon("rss", 14) }} Atom-Feed + {{ icon("envelope-simple", 14) }} Meine Abos {% endif %} diff --git a/app/templates/v2/screens/abos.html b/app/templates/v2/screens/abos.html new file mode 100644 index 0000000..47227c5 --- /dev/null +++ b/app/templates/v2/screens/abos.html @@ -0,0 +1,163 @@ +{% extends "v2/base.html" %} + +{% block title %}Meine Abos — GWÖ-Antragsprüfer{% endblock %} + +{% set v2_active_nav = "abos" %} + +{% block head_extra %} + +{% endblock %} + +{% block main %} +
+

Meine E-Mail-Abos

+

+ Tägliche Zusammenfassung neuer Bewertungen — gefiltert nach Bundesland und/oder Partei. +

+
+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+
Lade …
+ +{% endblock %} + +{% block body_scripts %} + +{% endblock %} diff --git a/app/templates/v2/screens/feed.html b/app/templates/v2/screens/feed.html new file mode 100644 index 0000000..ef1c341 --- /dev/null +++ b/app/templates/v2/screens/feed.html @@ -0,0 +1,122 @@ +{% extends "v2/base.html" %} + +{% block title %}Atom-Feed — GWÖ-Antragsprüfer{% endblock %} + +{% set v2_active_nav = "feed" %} + +{% block head_extra %} + +{% endblock %} + +{% block main %} +
+

Atom-Feed

+

+ Konfigurierbarer Feed der neuesten Bewertungen — abonnierbar mit jedem RSS/Atom-Reader. +

+
+ +
+ + + + + + + + +
+ +
+
Feed-URL
+ /api/feed.xml +
+ 📰 Öffnen + + In Feedly +
+
+ +
+

Hinweis: Du kannst die Feed-URL in jedem RSS-Reader (z.B. Feedly, NewsBlur, Inoreader, NetNewsWire, Thunderbird) abonnieren. Der Feed ist Atom 1.0 und liefert die letzten Bewertungen mit Score, Empfehlung und Kurzbegründung.

+

Wenn du regelmäßige Mails statt Pull-Feed willst, lege ein E-Mail-Abo an.

+
+ +{% endblock %} + +{% block body_scripts %} + +{% endblock %}