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:
parent
4626379d6e
commit
a73c0cb299
306
open_workshop_report/Integration_Plan.md
Normal file
306
open_workshop_report/Integration_Plan.md
Normal 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.
|
||||
Loading…
Reference in New Issue
Block a user