Integration Plan für automatisierte DokuWiki-Report-Generierung

Roadmap für vollautomatische monatliche PNG-Export-Generierung:
- Graph-Renderer mit Matplotlib/Plotly (alle Metabase-Features möglich)
- Scheduled Action (Cron) für monatliche Ausführung
- DokuWiki XML-RPC Upload Integration
- 5 Diagramm-Typen: Tagesansicht, Jahresvergleich, Trends, Wiederholungstäter
- Aufwand: 5-7 Stunden Implementierung

Vorteil: Vollautomatisch, professionelle Visualisierung mit Beschriftungen,
kein manueller Metabase-Export mehr nötig
This commit is contained in:
Matthias Lotz 2025-12-26 23:47:24 +01:00
parent 4626379d6e
commit a73c0cb299

View File

@ -0,0 +1,306 @@
# Integration Plan: Automatisierter Export zu DokuWiki
## Überblick
Automatische monatliche Generierung von Statistik-Diagrammen als PNG-Dateien und Upload zu DokuWiki.
## Ziel
- **Vollautomatische** monatliche Reports ohne manuellen Export
- **Professionelle Visualisierungen** mit Beschriftungen (wie Metabase oder besser)
- **Direkte Integration** in DokuWiki für Präsentationen und Dokumentation
## Technische Architektur
### 1. Graph-Renderer Modul
**Aufwand: 2-3 Stunden**
#### Bibliotheken
- **Matplotlib** oder **Plotly** für PNG-Generierung
- Volle Kontrolle über Styling, Beschriftungen, Farben
#### Zu generierende Diagramme
1. **Tägliche Nutzung (Monat)**
- Balkendiagramm: Tag × Nutzer
- Wochentag (blau) vs. Wochenende (türkis)
- Zahlen auf jedem Balken
- Summe + Ø rechts oben
2. **Jahresvergleich Buchungen**
- Gruppierte Balken: Monat × Jahre (2020-2025)
- Zahlen auf Balken
- Farbcodierung pro Jahr
- Legende mit Jahren
3. **Ø Nutzer pro Tag (Trend)**
- Liniendiagramm über Zeit
- Datenpunkte mit Werten beschriftet
- Monatliche Granularität
- Optional: Trendlinie
4. **Wiederholungstäter Verteilung**
- 100% gestapeltes Balkendiagramm
- Häufigkeit 1x, 2x, 3x... 17+
- Prozentuale Beschriftung
- Monatliche Vergleiche
5. **Nutzer pro Monat (Jahresvergleich)**
- Balkendiagramm: Monat × Jahre
- Zahlen auf Balken
- Identisch zu Buchungen, andere Metrik
#### Datenzugriff
```python
# In models/report_generator.py
class ReportGenerator(models.Model):
_name = 'open_workshop.report.generator'
def generate_daily_chart(self, month, year):
"""Generiert Tagesdiagramm für einen Monat"""
# Hole DailyStats für den Monat
daily_stats = self.env['open_workshop.daily.stats'].search([
('year', '=', year),
('month', '=', month)
], order='date asc')
# Matplotlib: Balkendiagramm mit Beschriftung
# Speichere als PNG in ir.attachment
pass
def generate_yearly_comparison(self):
"""Generiert Jahresvergleich Buchungen"""
# Hole UsageStats gruppiert nach Monat und Jahr
stats = self.env['open_workshop.usage.stats'].search([
('period_type', '=', 'month')
], order='year, month')
# Matplotlib: Gruppierte Balken mit Legende
pass
```
#### PNG-Konfiguration
- **Auflösung**: 300 DPI (Präsentationsqualität)
- **Größe**: 1920×1080 oder 1600×900
- **Format**: PNG mit Transparenz optional
- **Speicherort**: `ir.attachment` mit Metadaten
---
### 2. Scheduled Action (Cron)
**Aufwand: 30 Minuten**
#### Konfiguration
```xml
<!-- data/scheduled_actions.xml -->
<record id="ir_cron_monthly_report_export" model="ir.cron">
<field name="name">Monatliche Report-Generierung für DokuWiki</field>
<field name="model_id" ref="model_open_workshop_report_generator"/>
<field name="state">code</field>
<field name="code">model.generate_and_upload_reports()</field>
<field name="interval_number">1</field>
<field name="interval_type">months</field>
<field name="numbercall">-1</field>
<field name="doall">False</field>
<field name="nextcall" eval="(DateTime.now() + timedelta(days=1)).replace(day=1, hour=2, minute=0)"/>
</record>
```
#### Ausführungslogik
- **Zeitpunkt**: 1. des Monats, 02:00 Uhr
- **Verarbeitet**: Vormonat (z.B. am 1. Januar → Dezember-Report)
- **Fehlerbehandlung**: Log-Eintrag bei Fehler, kein Absturz
---
### 3. DokuWiki Integration
**Aufwand: 2 Stunden**
#### Nutzt bestehendes Modul
- `open_workshop_dokuwiki` ist bereits vorhanden
- XML-RPC Verbindung konfiguriert
#### Upload-Prozess
```python
def upload_to_dokuwiki(self, png_data, filename):
"""Upload PNG zu DokuWiki via XML-RPC"""
dokuwiki = self.env['open_workshop.dokuwiki.connection']
# Upload zu :statistik:reports:2025:
namespace = f'statistik:reports:{year}'
dokuwiki.upload_file(
namespace=namespace,
filename=filename,
data=png_data,
overwrite=True
)
# Aktualisiere Wiki-Seite
page_content = f"""
====== Statistik {month_name} {year} ======
===== Tägliche Nutzung =====
{{{{:statistik:reports:{year}:daily_{year}_{month:02d}.png}}}}
===== Jahresvergleich Buchungen =====
{{{{:statistik:reports:{year}:yearly_comparison_{year}_{month:02d}.png}}}}
===== Durchschnittliche Nutzer pro Tag =====
{{{{:statistik:reports:{year}:avg_users_trend_{year}_{month:02d}.png}}}}
===== Wiederholungstäter =====
{{{{:statistik:reports:{year}:repeat_users_{year}_{month:02d}.png}}}}
===== Nutzer pro Monat =====
{{{{:statistik:reports:{year}:users_per_month_{year}_{month:02d}.png}}}}
"""
dokuwiki.save_page(
page_id=f'statistik:reports:{year}:{month:02d}',
content=page_content
)
```
#### Wiki-Struktur
```
statistik/
├── reports/
│ ├── 2024/
│ │ ├── daily_2024_12.png
│ │ ├── yearly_comparison_2024_12.png
│ │ └── 12.txt (Wiki-Seite)
│ └── 2025/
│ ├── daily_2025_01.png
│ ├── yearly_comparison_2025_01.png
│ └── 01.txt (Wiki-Seite)
```
---
## Implementierungsplan
### Phase 1: Graph-Renderer (Tag 1-2)
- [ ] `models/report_generator.py` erstellen
- [ ] Matplotlib/Plotly Abhängigkeit hinzufügen
- [ ] Funktion: Tagesdiagramm generieren
- [ ] Funktion: Jahresvergleich generieren
- [ ] Funktion: Trenddiagramm generieren
- [ ] Funktion: Wiederholungstäter-Diagramm (100% gestapelt)
- [ ] PNG-Speicherung in `ir.attachment`
- [ ] Tests mit aktuellen Daten
### Phase 2: DokuWiki Upload (Tag 2-3)
- [ ] XML-RPC Upload-Funktion erweitern
- [ ] Template für Wiki-Seiten erstellen
- [ ] Automatische Namespace-Erstellung
- [ ] Fehlerbehandlung (Wiki offline, etc.)
- [ ] Test-Upload mit Dummy-Daten
### Phase 3: Scheduled Action (Tag 3)
- [ ] Cron-Job konfigurieren
- [ ] Orchestrierung: Generierung + Upload
- [ ] Logging und Monitoring
- [ ] E-Mail-Benachrichtigung bei Erfolg/Fehler (optional)
- [ ] Manueller Trigger für Backfill alter Monate
### Phase 4: Testing & Rollout (Tag 4)
- [ ] Test-Durchlauf für letzte 3 Monate
- [ ] Validierung: Alle Diagramme korrekt?
- [ ] Wiki-Seiten lesbar und vollständig?
- [ ] Performance-Check (Generierung < 30 Sekunden)
- [ ] Produktiv-Schaltung
---
## Technische Anforderungen
### Python-Bibliotheken
```python
# requirements.txt (zu ergänzen)
matplotlib>=3.7.0
plotly>=5.18.0
kaleido>=0.2.1 # Für Plotly PNG-Export
```
### Odoo-Module
- `open_workshop_dokuwiki` (bereits vorhanden)
- `open_workshop_report` (aktuelles Modul)
### Server-Anforderungen
- **Fonts**: Liberation Sans/DejaVu für Matplotlib
- **Speicher**: ~50 MB pro Monat für PNG-Archiv
- **CPU**: Generierung ~10-20 Sekunden pro Diagramm
---
## Vorteile gegenüber Metabase
### Was besser ist
1. **Vollautomatisch**: Kein manueller Export
2. **Konsistent**: Immer gleiche Formatierung
3. **Versioniert**: Alte Reports bleiben im Wiki
4. **Integriert**: Daten direkt aus Odoo
5. **Anpassbar**: Jedes Detail steuerbar (Farben, Beschriftungen)
### Was gleich gut ist
- PNG-Qualität für Präsentationen
- Zahlen direkt auf Diagrammen
- Komplexe Visualisierungen (100% gestapelt)
### Was Metabase besser kann
- Ad-hoc Abfragen ohne Code
- Interaktive Dashboards (kein Export nötig)
- Schnellere Iteration bei neuen Fragen
---
## Aufwandsschätzung
| Phase | Aufwand | Beschreibung |
|-------|---------|--------------|
| Graph-Renderer | 2-3h | Matplotlib/Plotly Implementation |
| DokuWiki Upload | 2h | XML-RPC Integration |
| Scheduled Action | 30min | Cron-Konfiguration |
| Testing | 1-2h | Validierung & Rollout |
| **GESAMT** | **5-7h** | Vollständige Implementierung |
---
## Nächste Schritte
### Entscheidung erforderlich
1. **Bibliothek wählen**: Matplotlib (einfacher) oder Plotly (moderner)?
2. **Umfang**: Alle 5 Diagramme oder erstmal 2-3 zum Testen?
3. **Zeitplan**: Wann soll die erste automatische Generierung laufen?
### Optional: Manuelle Trigger
- Button in Odoo: "Report jetzt generieren"
- Nützlich für Ad-hoc Präsentationen
- Zusatzaufwand: +1 Stunde
---
## Wartung
### Monatlich
- Automatisch, kein Eingriff nötig
### Bei Änderungen
- Neue Metriken → Graph-Renderer erweitern
- Neues Design → Template anpassen
- DokuWiki-Struktur → Upload-Pfade ändern
### Monitoring
- Cron-Job-Log prüfen (Odoo UI)
- Wiki-Seiten stichprobenartig kontrollieren
- Bei Fehler: E-Mail-Benachrichtigung
---
## Fazit
Mit dieser Integration wird **Odoo zur vollständigen Reporting-Lösung**:
- Daten erfassen ✓
- Analysieren ✓
- Visualisieren ✓
- Automatisch publizieren ✓
**Kein Metabase mehr nötig** für monatliche Standard-Reports.