Merge wt-export: Export-Plugin (Konflikte aufgelöst)
This commit is contained in:
55
README.md
55
README.md
@@ -4,8 +4,8 @@
|
||||
modularer Plugin-Architektur. Lauffähiger Kern mit Plugin-System,
|
||||
Authentifizierung/Rollen und Migrationen; vollständig implementiert sind
|
||||
bisher **Audit-Log**, **Benachrichtigung**, **Neuheiten (BGG-Sync)**,
|
||||
**Dedup-Prüfung**, **Planungsliste**, **Archiv (12-Monats-Autopilot)** und
|
||||
**Erinnerungen**.
|
||||
**Dedup-Prüfung**, **Planungsliste**, **Archiv (12-Monats-Autopilot)**,
|
||||
**Erinnerungen** und **Export (CSV/PDF)**.
|
||||
|
||||
## Stack
|
||||
|
||||
@@ -15,6 +15,7 @@ bisher **Audit-Log**, **Benachrichtigung**, **Neuheiten (BGG-Sync)**,
|
||||
- **Plugins:** Entry-Points (`importlib.metadata`, Gruppe `spiele_redaktion.plugins`)
|
||||
plus lokales `plugins/`-Verzeichnis
|
||||
- **Hintergrund-Jobs:** APScheduler (BGG-Neuheiten-Sync)
|
||||
- **PDF-Export:** WeasyPrint (System-Bibliotheken: Pango/fontconfig)
|
||||
- **Dependencies/Tests:** [uv](https://docs.astral.sh/uv/) + pytest
|
||||
|
||||
## Setup
|
||||
@@ -92,6 +93,17 @@ Audit), Erinnerungslogik mit eingefrorener Uhr (freezegun) — 4-Wochen-Grenze
|
||||
Empfängerregeln (offene oder fehlende Planung, Rollen-Filter), Doppelschutz
|
||||
pro Ausgabe+Benutzer, manuelle Prüfung, Scheduler-Lifecycle/Uhrzeit-Konfiguration
|
||||
— wiederum plus ein Integrationstest mit den echten Plugins.
|
||||
Dazu das Plugin **export** (CSV-Inhalt mit Semikolon/BOM/Umlauten inkl. Quoting, gültige
|
||||
PDF-Dateien via Kopf-/Struktur-Check, Rollen-Zugriff je Liste und Format,
|
||||
Audit-Protokollierung der Downloads; PDF-Tests skippen sauber, wenn die
|
||||
WeasyPrint-System-Bibliotheken fehlen — ein Installationsversuch läuft
|
||||
zuvor automatisch) plus ein Integrationstest mit den echten Plugins., Bearbeiten/Löschen, Rechte pro Rolle), das Plugin
|
||||
**export** (CSV-Inhalt mit Semikolon/BOM/Umlauten inkl. Quoting, gültige
|
||||
PDF-Dateien via Kopf-/Struktur-Check, Rollen-Zugriff je Liste und Format,
|
||||
Audit-Protokollierung der Downloads; PDF-Tests skippen sauber, wenn die
|
||||
WeasyPrint-System-Bibliotheken fehlen — ein Installationsversuch läuft
|
||||
zuvor automatisch) plus ein Integrationstest mit den echten Plugins
|
||||
(In-App-Nachricht + Audit-Eintrag).
|
||||
|
||||
## Architektur
|
||||
|
||||
@@ -113,7 +125,7 @@ plugins/ ein Ordner pro Funktion, ladbar über den Plugin-Load
|
||||
├── planung/ VOLL IMPLEMENTIERT: Planungsliste, Verschiebung, Dialoge
|
||||
├── archiv/ VOLL IMPLEMENTIERT: 12-Monats-Autopilot, Job, UI
|
||||
├── erinnerung/ VOLL IMPLEMENTIERT: Ausgaben, 4-Wochen-Erinnerung, Tages-Job
|
||||
├── export/ (Stub, ladbar)
|
||||
├── export/ VOLL IMPLEMENTIERT: CSV/PDF-Downloads, Rollen, Audit
|
||||
└── … je __init__.py + templates/<name>/
|
||||
```
|
||||
|
||||
@@ -492,6 +504,39 @@ Ausgaben mit Redaktionsschluss und Restzeit-Badge. Admins verwalten zusätzlich
|
||||
die Ausgaben (anlegen/bearbeiten/löschen), starten den Sofort-Check und
|
||||
sehen den **Erinnerungsstatus**: wer wurde für welche Ausgabe wann über
|
||||
welche Kanäle erinnert.
|
||||
## Plugin „export“ (implementiert)
|
||||
|
||||
Redaktionslisten als Datei: die drei Listen **Neuheiten**, **Planung** und
|
||||
**Archiv** sind je als CSV und PDF unter **Export** (`/export`) herunterladbar.
|
||||
Keine eigene Datentabelle — das Plugin liest die Tabellen der Partner-Plugins
|
||||
über die gemeinsame SQLAlchemy-Metadata (ohne Plugin-Importe); fehlt ein
|
||||
Partner, erscheint die Liste als „nicht verfügbar“, statt zu brechen.
|
||||
|
||||
### Formate
|
||||
|
||||
| Format | Details |
|
||||
|--------|---------|
|
||||
| **CSV** | stdlib `csv`, Semikolon-getrennt (Excel mit deutschem Gebietsschema), UTF-8 mit Byte-Order-Mark — Umlaute/ß bleiben erhalten, Felder mit `;` werden korrekt gequotet; Auslieferung als `StreamingResponse` (`text/csv; charset=utf-8`) |
|
||||
| **PDF** | WeasyPrint aus einem generierten HTML: A4-Tabelle mit deutscher Kopfzeile (wird auf jeder Seite wiederholt), Erstell-Datum und Anzahl Einträge im Kopf, Fußzeile „Seite X von Y“; Auslieferung als `StreamingResponse` (`application/pdf`) |
|
||||
|
||||
WeasyPrint wird erst beim PDF-Download importiert: Ohne installierte
|
||||
System-Bibliotheken (Pango & Co.) bleiben App und CSV-Export voll nutzbar,
|
||||
der PDF-Download liefert eine verständliche Fehlermeldung.
|
||||
|
||||
### Spalten
|
||||
|
||||
- **Neuheiten:** Titel · Verlag · Autor · Erscheinungsjahr · Status („Neuheit“, „In Planung“, „Archiviert“) · Aktualisiert am
|
||||
- **Planung:** Titel · Verlag · Autor · Ausgabe · Rezensent (aufgelöster Name) · Status (Offen / In Bearbeitung / Abgeschlossen) · Notizen · Aktualisiert am
|
||||
- **Archiv** = Neuheiten-Tabelle gefiltert auf Status „archiviert“ (gefüllt durch den Autopilot des archiv-Plugins)
|
||||
|
||||
### Rollen & Protokollierung
|
||||
|
||||
Admins und Redakteure exportieren alle Listen; **Rezensenten nur die
|
||||
Planungsliste**. Die Prüfung passiert serverseitig an jedem Download-Endpunkt
|
||||
(`403` bei Zugriff ohne Berechtigung, `404` bei unbekannter Liste); auf der
|
||||
Export-Seite sind nicht erlaubte Karten ausgegraut. Jeder Download wird best
|
||||
effort ins Audit-Log geschrieben (Aktion „exportiert“, Format und Zeilenzahl
|
||||
in den Details).
|
||||
|
||||
## Deployment (später)
|
||||
|
||||
@@ -513,7 +558,7 @@ geschrieben.
|
||||
| 6 | Plugin `planung` (Verschiebung, händischer Eintrag + Prüfungen + Benachrichtigung) | ✅ fertig |
|
||||
| 7 | Plugin `archiv` (12-Monats-Autopilot, Wiederherstellen, täglicher Job) | ✅ fertig |
|
||||
| 8 | Plugin `erinnerung` (Redaktionsschluss pro Ausgabe, 4-Wochen-Erinnerung, Tages-Job) | ✅ fertig |
|
||||
| 9 | Plugin `export` (CSV + PDF via WeasyPrint) | ⏳ offen |
|
||||
| 9 | Plugin `export` (CSV + PDF via WeasyPrint) | ✅ fertig |
|
||||
| 10 | Integrationstests über alle Plugins | ⏳ offen |
|
||||
| 11 | Deployment auf swen.henry.insight-it.de (Compose + Traefik, Live-Check) | ⏳ offen |
|
||||
|
||||
@@ -522,5 +567,5 @@ Legende: ✅ fertig · 🔄 in Arbeit · ⏳ offen · ⚠️ fertig mit offenen
|
||||
## Offene Punkte (nicht Teil von Phase 1)
|
||||
|
||||
- CSRF-Schutz für Formulare (aktuell SameSite=Lax-Cookie als Basisschutz)
|
||||
- WeasyPrint für PDF-Export (Systemabhängigkeiten im Container)
|
||||
- WeasyPrint-Systemabhängigkeiten im Container prüfen
|
||||
- Tailwind via CDN nur für Dev; für Produktion lokal gehostete Assets
|
||||
|
||||
Reference in New Issue
Block a user