From 253d289633127a0fff7ce0f1a6920e52c3fcdd22 Mon Sep 17 00:00:00 2001 From: "matthias.lotz" Date: Sat, 20 Dec 2025 12:49:58 +0100 Subject: [PATCH] feat(dokuwiki): Flexible overview table with configurable columns - Made overview table columns fully configurable via system parameters - Added wiki_page_id placeholder for internal DokuWiki links - Removed DokuWiki template dependency for overview table - Added _register_hook to initialize parameters on module load/update - Updated README with new configuration approach - System parameters: overview_page_id, overview_title, overview_columns, overview_column_data - Default columns: Name (with link), Status, Security Category, Area, Location, Image --- open_workshop_dokuwiki/README.md | 241 ++++++++++++------ open_workshop_dokuwiki/__init__.py | 2 +- open_workshop_dokuwiki/__manifest__.py | 1 + open_workshop_dokuwiki/hooks.py | 9 +- .../models/maintenance_equipment.py | 137 ++++++---- .../models/res_config_settings.py | 25 +- 6 files changed, 276 insertions(+), 139 deletions(-) diff --git a/open_workshop_dokuwiki/README.md b/open_workshop_dokuwiki/README.md index a949d46..da70a7e 100644 --- a/open_workshop_dokuwiki/README.md +++ b/open_workshop_dokuwiki/README.md @@ -11,34 +11,35 @@ Das **datatables Plugin** muss in DokuWiki installiert sein: ## Setup-Schritte -### 1. Template-Seite in DokuWiki erstellen +### 1. Odoo Konfiguration -Erstelle die Seite: `werkstatt:ausruestung:uebersicht_template` +Die Übersichtstabelle wird vollständig aus Odoo heraus konfiguriert - **kein DokuWiki Template nötig!** -Kopiere den Inhalt aus: `dokuwiki_uebersicht_template.txt` +Gehe zu: **Einstellungen → Technisch → Parameter → Systemparameter** -**Wichtige Platzhalter:** -- `{{EQUIPMENT_TABLE_ROWS}}` → Wird durch Tabellenzeilen ersetzt -- `{{SYNC_DATETIME}}` → Wird durch Sync-Zeitstempel ersetzt - -### 2. Odoo Konfiguration (optional) - -Falls andere Seitennamen gewünscht: +Standardwerte (automatisch gesetzt beim Modul-Install): ```python -# In Odoo: Einstellungen → Technisch → Parameter → Systemparameter +# Seiten-ID wo die Übersicht erstellt wird +dokuwiki.overview_page_id = werkstatt:ausruestung:start -dokuwiki.overview_page_id = werkstatt:ausruestung:uebersicht -dokuwiki.overview_template_id = werkstatt:ausruestung:uebersicht_template +# Titel der Übersichtsseite +dokuwiki.overview_title = Geräte & Maschinen - Übersicht + +# Spaltenüberschriften (Pipe-separiert) +dokuwiki.overview_columns = Status|Sicherheits-Kategorie|Hersteller|Bemerkung|Typ|Bild|Standort|Dokumentation + +# Spaltendaten mit Platzhaltern (Pipe-separiert) +dokuwiki.overview_column_data = {status_smiley}|{ows_machine_id.category_icon}|{partner_id}|{note}|{model}|{image}|{ows_machine_id.location}|{wiki_doku_link} ``` -### 3. Erste Synchronisation +### 2. Erste Synchronisation 1. In Odoo: **Wartung → Konfiguration → Wiki-Synchronisation** 2. Wähle: **"Übersichtstabelle aktualisieren"** 3. Klicke: **"Synchronisieren"** -Die Übersichtsseite wird erstellt unter: `werkstatt:ausruestung:uebersicht` +Die Übersichtsseite wird erstellt unter: `werkstatt:ausruestung:start` ## Features @@ -48,27 +49,63 @@ Die Übersichtsseite wird erstellt unter: `werkstatt:ausruestung:uebersicht` - ✅ Pagination bei vielen Einträgen - ✅ Responsive Design -### Spalten -| Spalte | Inhalt | Quelle | -|--------|--------|--------| -| Name | Link zur Detail-Seite | `maintenance.equipment.name` | -| Status | In Betrieb, Wartung, etc. | `equipment_status_id` | -| Sicherheits-Kategorie | 🟢 Grün / 🟡 Gelb / 🔴 Rot | `ows_category` | -| Bereich | Holzwerkstatt, Metallwerkstatt, etc. | `ows_area_id` | -| Standort | Freier Text | `location` | -| Bild | Thumbnail 50px | `image_1920` | +### Flexible Spalten +- ✅ Spalten in Odoo konfigurierbar (kein DokuWiki Template) +- ✅ Alle Platzhalter verfügbar (siehe unten) +- ✅ Spalten hinzufügen/entfernen ohne Code-Änderung +- ✅ Änderungen sofort beim nächsten Sync wirksam + +### Standard-Spalten +| Spalte | Platzhalter | Ausgabe | +|--------|-------------|---------| +| Status | `{status_smiley}` | 😊 / 😐 / ☹️ | +| Sicherheits-Kategorie | `{ows_machine_id.category_icon}` | 🟢 / 🟡 / 🔴 | +| Hersteller | `{partner_id}` | BOSCH, Festool, ... | +| Bemerkung | `{note}` | Notizen | +| Typ | `{model}` | Modellbezeichnung | +| Bild | `{image}` | Thumbnail 100px | +| Standort | `{ows_machine_id.location}` | Regal A3, ... | +| Dokumentation | `{wiki_doku_link}` | Link zur Detail-Seite | + +## Spalten anpassen + +### Beispiel 1: Seriennummer hinzufügen + +```python +# Spaltenüberschriften erweitern +dokuwiki.overview_columns = Status|Typ|Seriennummer|Hersteller|Standort|Dokumentation + +# Spaltendaten erweitern +dokuwiki.overview_column_data = {status_smiley}|{model}|{serial_no}|{partner_id}|{ows_machine_id.location}|{wiki_doku_link} +``` + +### Beispiel 2: Minimale Ansicht + +```python +dokuwiki.overview_columns = Name|Status|Kategorie|Dokumentation +dokuwiki.overview_column_data = {name}|{status_smiley}|{ows_machine_id.category_icon}|{wiki_doku_link} +``` + +### Beispiel 3: Detaillierte Ansicht mit Kosten + +```python +dokuwiki.overview_columns = Name|Hersteller|Modell|Seriennummer|Kosten|Garantie|Standort|Kategorie +dokuwiki.overview_column_data = {name}|{partner_id}|{model}|{serial_no}|{cost}|{warranty_date}|{location}|{ows_machine_id.category_icon} +``` + +**Wichtig:** Anzahl der Pipes muss übereinstimmen! +- 3 Pipes = 4 Spalten +- Spalten und Daten müssen gleiche Anzahl haben ## Performance -- ⚡ Schneller Sync: Keine DB-Iteration über 134 Einträge -- ⚡ Generiert nur eine Seite (statt 134 einzelne) +- ⚡ Schneller Sync: Keine DB-Iteration über alle Einträge +- ⚡ Generiert nur eine Seite (statt 156 einzelne) - ⚡ DokuWiki cached die Seite automatisch +- ⚡ Spalten-Änderung ohne Code-Deploy ## Troubleshooting -### "Template-Seite nicht gefunden" -→ Erstelle `werkstatt:ausruestung:uebersicht_template` in DokuWiki - ### DataTables funktioniert nicht → Installiere DataTables Plugin in DokuWiki @@ -80,40 +117,51 @@ Die Übersichtsseite wird erstellt unter: `werkstatt:ausruestung:uebersicht` → Nur Equipment mit gesetztem `ows_area_id` werden angezeigt → Prüfe Filter in `action_sync_overview_table()` +### Spalten werden nicht korrekt dargestellt +→ Prüfe ob Anzahl Pipes in `overview_columns` und `overview_column_data` übereinstimmt +→ Beispiel: 3 Pipes = 4 Spalten + +### Platzhalter wird nicht ersetzt (z.B. `{status}` bleibt stehen) +→ Prüfe Schreibweise (case-sensitive!) +→ Siehe Liste der verfügbaren Platzhalter unten +→ Bei `ows.machine` Feldern: `{ows_machine_id.feldname}` verwenden + ## Workflow ``` ┌─────────────────┐ -│ Odoo Equipment │ -│ (134 Einträge) │ +│ Odoo Systempar. │ +│ - Spalten │ +│ - Platzhalter │ └────────┬────────┘ │ ▼ ┌─────────────────────────┐ +│ Odoo Equipment │ +│ (156 Einträge) │ +└────────┬────────────────┘ + │ + ▼ +┌─────────────────────────┐ │ _generate_overview_ │ │ table_row() │ ← Pro Equipment eine Zeile -│ (maintenance_equipment) │ +│ (Platzhalter ersetzen) │ mit Platzhalter-Engine └────────┬────────────────┘ - │ 134 Zeilen + │ 156 Zeilen ▼ ┌─────────────────────────┐ -│ Template laden │ -│ werkstatt:ausruestung: │ -│ uebersicht_template │ -└────────┬────────────────┘ - │ - ▼ -┌─────────────────────────┐ -│ Placeholder ersetzen │ -│ {{EQUIPMENT_TABLE_ROWS}}│ -│ {{SYNC_DATETIME}} │ +│ Seite zusammenbauen │ +│ - Titel │ +│ - DataTables Header │ +│ - Zeilen │ +│ - Footer │ └────────┬────────────────┘ │ ▼ ┌─────────────────────────┐ │ Seite speichern │ │ werkstatt:ausruestung: │ -│ uebersicht │ +│ start │ └─────────────────────────┘ ``` @@ -136,42 +184,77 @@ Aktion: action_sync_overview_table() Intervall: Täglich um 02:00 Uhr ``` -# Verfügbare Platzhalter: +--- -Basis-Felder (maintenance.equipment): +# Verfügbare Platzhalter -{name} - Equipment-Name -{serial_no} - Seriennummer -{model} - Modell -{category} - Kategoriename -{status} - Status (aus status_id) -{status_smiley} - Status als Smiley (aus status_id.smiley Feld, z.B. :-) oder :-() -{location} - Standort -{ows_area} - Bereichsname -{assign_date} - Zuweisungsdatum (formatiert) -{cost} - Kosten -{warranty_date} - Garantiedatum (formatiert) -{note} - Notizen -{partner_id} - Lieferant (Name) -{partner_ref} - Lieferanten-Referenz -Spezial-Felder: +Alle Platzhalter aus dem Detail-Template sind verfügbar! -{view_type} - "Bereich" oder "Einsatzzweck" -{view_name} - Name des Bereichs/Einsatzzwecks -{wiki_doku_page} - ID der zentralen Doku-Seite -{wiki_doku_link} - Fertiger Link zur zentralen Doku-Seite -{odoo_link} - Fertiger Link zur Odoo Equipment-Seite -{odoo_url} - URL zur Odoo Equipment-Seite (ohne Link-Markup) -{sync_datetime} - Aktuelles Datum/Zeit -{image} - Equipment-Bild (300px Breite) - Format: {{:media_id?300}} -{image_large} - Equipment-Bild (Originalgröße) - Format: {{:media_id}} -{image_id} - Media-ID des Bildes (z.B. werkstatt:ausruestung:media:sabako-laser.jpg) -ows.machine Felder (falls verknüpft): +## Basis-Felder (maintenance.equipment) -{ows_machine_id.name} - Name -{ows_machine_id.model} - Modell -{ows_machine_id.serial_no} - Seriennummer -{ows_machine_id.location} - Standort -{ows_machine_id.note} - Notizen -{ows_machine_id.category} - Sicherheitskategorie (red/yellow/green) -{ows_machine_id.category_icon} - Kategorie-Icon als Emoji (🔴/🟡/🟢) \ No newline at end of file +- `{name}` - Equipment-Name +- `{serial_no}` - Seriennummer +- `{model}` - Modell +- `{category}` - Kategoriename +- `{status}` - Status (aus status_id) +- `{status_smiley}` - Status als Smiley (aus status_id.smiley Feld, z.B. 😊 oder ☹️) +- `{location}` - Standort +- `{ows_area}` - Bereichsname +- `{assign_date}` - Zuweisungsdatum (formatiert) +- `{cost}` - Kosten +- `{warranty_date}` - Garantiedatum (formatiert) +- `{note}` - Notizen +- `{partner_id}` - Lieferant (Name) +- `{partner_ref}` - Lieferanten-Referenz + +## Spezial-Felder + +- `{view_type}` - "Bereich" oder "Einsatzzweck" +- `{view_name}` - Name des Bereichs/Einsatzzwecks +- `{wiki_doku_page}` - ID der zentralen Doku-Seite +- `{wiki_doku_link}` - Fertiger Link zur zentralen Doku-Seite +- `{odoo_link}` - Fertiger Link zur Odoo Equipment-Seite +- `{odoo_url}` - URL zur Odoo Equipment-Seite (ohne Link-Markup) +- `{sync_datetime}` - Aktuelles Datum/Zeit +- `{image}` - Equipment-Bild (300px Breite) - Format: `{{:media_id?300}}` +- `{image_large}` - Equipment-Bild (Originalgröße) - Format: `{{:media_id}}` +- `{image_id}` - Media-ID des Bildes (z.B. werkstatt:ausruestung:media:sabako-laser.jpg) + +## ows.machine Felder (falls verknüpft) + +- `{ows_machine_id.name}` - Name +- `{ows_machine_id.model}` - Modell +- `{ows_machine_id.serial_no}` - Seriennummer +- `{ows_machine_id.location}` - Standort +- `{ows_machine_id.note}` - Notizen +- `{ows_machine_id.category}` - Sicherheitskategorie (red/yellow/green) +- `{ows_machine_id.category_icon}` - Kategorie-Icon als Emoji (🔴/🟡/🟢) + +## Tipps für Platzhalter + +- **Case-sensitive**: `{Name}` funktioniert nicht, nur `{name}` +- **Pipe als Trenner**: Zwischen Spalten `|` verwenden +- **Leere Werte**: Werden automatisch durch `-` ersetzt +- **Links**: `{wiki_doku_link}` und `{odoo_link}` enthalten bereits DokuWiki Link-Syntax +- **Bilder**: `{image}` ist bereits formatiert mit `{{:...?300}}` +- **ows.machine**: Immer mit Präfix `ows_machine_id.` (z.B. `{ows_machine_id.location}`) + +## Beispiel-Konfigurationen + +### Minimalistische Ansicht +``` +Spalten: Name|Status|Kategorie +Daten: {name}|{status_smiley}|{ows_machine_id.category_icon} +``` + +### Standard-Ansicht (Default) +``` +Spalten: Status|Sicherheits-Kategorie|Hersteller|Bemerkung|Typ|Bild|Standort|Dokumentation +Daten: {status_smiley}|{ows_machine_id.category_icon}|{partner_id}|{note}|{model}|{image}|{ows_machine_id.location}|{wiki_doku_link} +``` + +### Vollständige Ansicht +``` +Spalten: Name|Status|Kategorie|Hersteller|Modell|S/N|Kosten|Garantie|Standort|Bereich|Bild|Doku +Daten: {name}|{status_smiley}|{ows_machine_id.category_icon}|{partner_id}|{model}|{serial_no}|{cost}|{warranty_date}|{location}|{ows_area}|{image}|{wiki_doku_link} +``` diff --git a/open_workshop_dokuwiki/__init__.py b/open_workshop_dokuwiki/__init__.py index 0c3e1b6..2bcf037 100644 --- a/open_workshop_dokuwiki/__init__.py +++ b/open_workshop_dokuwiki/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- from . import models from . import wizard -from .hooks import post_init_hook +from .hooks import post_init_hook, pre_init_hook diff --git a/open_workshop_dokuwiki/__manifest__.py b/open_workshop_dokuwiki/__manifest__.py index 99fb86b..e1aa87a 100644 --- a/open_workshop_dokuwiki/__manifest__.py +++ b/open_workshop_dokuwiki/__manifest__.py @@ -51,6 +51,7 @@ ACL: 'wizard/equipment_wiki_sync_wizard_views.xml', ], 'post_init_hook': 'post_init_hook', + 'pre_init_hook': 'pre_init_hook', 'installable': True, 'application': False, 'auto_install': False, diff --git a/open_workshop_dokuwiki/hooks.py b/open_workshop_dokuwiki/hooks.py index 56dba60..dafe8d2 100644 --- a/open_workshop_dokuwiki/hooks.py +++ b/open_workshop_dokuwiki/hooks.py @@ -1,8 +1,15 @@ # -*- coding: utf-8 -*- +def pre_init_hook(env): + """ + Hook der VOR der Modul-Installation/Update ausgeführt wird. + """ + pass + + def post_init_hook(env): """ - Hook der nach der Modul-Installation ausgeführt wird. + Hook der nach der Modul-Installation/Update ausgeführt wird. Initialisiert die DokuWiki-Parameter falls sie nicht existieren. """ env['res.config.settings']._init_dokuwiki_parameters() diff --git a/open_workshop_dokuwiki/models/maintenance_equipment.py b/open_workshop_dokuwiki/models/maintenance_equipment.py index 831fde1..fef3123 100644 --- a/open_workshop_dokuwiki/models/maintenance_equipment.py +++ b/open_workshop_dokuwiki/models/maintenance_equipment.py @@ -218,11 +218,16 @@ class MaintenanceEquipment(models.Model): base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url', 'http://localhost:8069') odoo_equipment_url = f"{base_url}/web#id={self.id}&model=maintenance.equipment&view_type=form" + # Wiki Page IDs + wiki_page_id = self._get_wiki_page_id_by_area() if self.ows_area_id else '' + # Basis-Werte für maintenance.equipment values = { # Spezielle Werte 'wiki_doku_page': doku_page_id, 'wiki_doku_link': f"[[{doku_page_id}| Wiki Dokumentation]]", + 'wiki_page_id': wiki_page_id, # Page-ID der Hauptseite (nach Bereich) + 'wiki_page_url': self.wiki_page_url or '', # Externe URL zur Hauptseite 'odoo_link': f"[[{odoo_equipment_url}|🔗 In Odoo öffnen]]", 'odoo_url': odoo_equipment_url, 'sync_datetime': datetime.now().strftime('%d.%m.%Y %H:%M'), @@ -285,7 +290,7 @@ class MaintenanceEquipment(models.Model): dokuwiki_client.upload_media(media_id, image_bytes, overwrite=True) # DokuWiki Image-Syntax: {{namespace:file.jpg?300}} - values['image'] = f"{{{{:{media_id}?300}}}}" + values['image'] = f"{{{{:{media_id}?100}}}}" values['image_large'] = f"{{{{:{media_id}}}}}" values['image_id'] = media_id _logger.info(f"Bild hochgeladen: {media_id}") @@ -346,7 +351,7 @@ class MaintenanceEquipment(models.Model): ---- [[{doku_page_id}|✏️ Zentrale Dokumentation bearbeiten]] -//Letzte Synchronisation: {datetime.now().strftime('%d.%m.%Y %H:%M')} von Odoo// +//Letzte Synchronisation: {datetime.now().strftime('%d.%m.%Y %H:%M')} // """ return content @@ -392,7 +397,7 @@ Hier kann die Dokumentation für {self.name} geschrieben werden. //Hinweis: Diese Seite kann beliebig strukturiert werden. Unterseiten können bei Bedarf manuell angelegt werden.// ---- -//Erstellt: {datetime.now().strftime('%d.%m.%Y %H:%M')} von Odoo// +//Erstellt: {datetime.now().strftime('%d.%m.%Y %H:%M')} // """ return content @@ -537,48 +542,30 @@ Hier kann die Dokumentation für {self.name} geschrieben werden. # Übersichtstabelle (DataTable) # ========================================== - def _generate_overview_table_row(self): + def _generate_overview_table_row(self, column_data_template): """ - Generiert eine DokuWiki DataTable Zeile für dieses Equipment. + Generiert eine DokuWiki DataTable Zeile für dieses Equipment mit konfigurierbaren Spalten. - Format: | [[link|Name]] | Status | Kategorie | Bereich | Standort | {{image.jpg?50}} | + Args: + column_data_template (str): Template mit Platzhaltern, z.B. "{status_smiley}|{partner_id}|{model}" Returns: str: Wiki-Markup für eine Tabellenzeile """ self.ensure_one() - # Name mit Link zur Detail-Seite - wiki_doku_id = self._get_wiki_doku_id() - doku_page_id = self._get_wiki_doku_page_id() - name_link = f"[[{doku_page_id}|{self.name}]]" if wiki_doku_id else self.name + # Template-Werte vorbereiten (nutzt bestehende Platzhalter-Engine) + values = self._prepare_template_values(view_type='area') - # Status (maintenance_equipment_status) - status = self.status_id.name if self.status_id else "-" + # Platzhalter im Template ersetzen + rendered_data = column_data_template + for key, value in values.items(): + placeholder = '{' + key + '}' + rendered_data = rendered_data.replace(placeholder, str(value or '-')) - # Sicherheitskategorie - category_map = { - 'green': '🟢 Grün', - 'yellow': '🟡 Gelb', - 'red': '🔴 Rot', - } - ows_category = category_map.get(self.ows_category, '-') - - # Bereich - area = self.ows_area_id.name if self.ows_area_id else "-" - - # Standort - location = self.location if self.location else "-" - - # Bild (als Thumbnail 50px) - if self.image_1920: - media_id = self._get_wiki_media_id() - image = f"{{{{:{media_id}?50}}}}" - else: - image = "-" - - # Tabellenzeile - row = f"| {name_link} | {status} | {ows_category} | {area} | {location} | {image} |" + # Pipe-separierte Werte in DokuWiki-Tabellenzeile umwandeln + columns = rendered_data.split('|') + row = '| ' + ' | '.join(columns) + ' |' return row @@ -586,12 +573,7 @@ Hier kann die Dokumentation für {self.name} geschrieben werden. def action_sync_overview_table(self): """ Aktualisiert die Übersichtstabelle in DokuWiki mit allen Equipment-Einträgen. - - Diese Methode: - 1. Lädt das Template aus DokuWiki (mit {{EQUIPMENT_TABLE_ROWS}} Placeholder) - 2. Generiert für jedes Equipment eine Tabellenzeile - 3. Ersetzt den Placeholder mit den generierten Zeilen - 4. Speichert die Übersichtsseite zurück zu DokuWiki + Verwendet konfigurierbare Spalten aus Systemparametern (kein Template mehr nötig). Returns: dict: Ergebnis-Dictionary mit 'total', 'success', 'error_messages' @@ -599,17 +581,17 @@ Hier kann die Dokumentation für {self.name} geschrieben werden. IrConfigParameter = self.env['ir.config_parameter'].sudo() dokuwiki_client = self.env['dokuwiki.client'] - # Config Parameter - overview_page_id = IrConfigParameter.get_param('dokuwiki.overview_page_id', 'werkstatt:ausruestung:uebersicht') - overview_template_id = IrConfigParameter.get_param('dokuwiki.overview_template_id', 'werkstatt:ausruestung:uebersicht_template') + # Config Parameter (Defaults werden via _register_hook automatisch gesetzt) + overview_page_id = IrConfigParameter.get_param('dokuwiki.overview_page_id') + overview_title = IrConfigParameter.get_param('dokuwiki.overview_title') + overview_columns = IrConfigParameter.get_param('dokuwiki.overview_columns') + overview_column_data = IrConfigParameter.get_param('dokuwiki.overview_column_data') + + # Validierung + if not all([overview_page_id, overview_title, overview_columns, overview_column_data]): + raise UserError("DokuWiki Übersichtstabellen-Parameter nicht konfiguriert! Bitte Modul neu installieren.") try: - # Template aus Wiki laden - template_content = dokuwiki_client.get_page(overview_template_id) - - if not template_content: - raise UserError(f"Template-Seite '{overview_template_id}' nicht gefunden! Bitte erst im Wiki erstellen.") - # Alle Equipment mit ows_area_id laden (sortiert nach Bereich, dann Name) equipment_records = self.search([ ('ows_area_id', '!=', False) @@ -622,7 +604,7 @@ Hier kann die Dokumentation für {self.name} geschrieben werden. table_rows = [] for equipment in equipment_records: try: - row = equipment._generate_overview_table_row() + row = equipment._generate_overview_table_row(overview_column_data) table_rows.append(row) except Exception as e: _logger.warning(f"Fehler beim Generieren der Zeile für {equipment.name}: {e}") @@ -631,12 +613,57 @@ Hier kann die Dokumentation für {self.name} geschrieben werden. # Rows zusammenfügen table_rows_markup = '\n'.join(table_rows) - # Placeholder ersetzen - overview_content = template_content.replace('{{EQUIPMENT_TABLE_ROWS}}', table_rows_markup) + # Spalten-Header generieren (aus overview_columns) + column_headers = overview_columns.split('|') + header_row = '^ ' + ' ^ '.join(column_headers) + ' ^' - # Sync-Zeitstempel hinzufügen + # Sync-Zeitstempel sync_datetime = datetime.now().strftime('%d.%m.%Y %H:%M:%S') - overview_content = overview_content.replace('{{SYNC_DATETIME}}', sync_datetime) + + # Komplette Seite zusammenbauen (ohne Template) + overview_content = f"""====== {overview_title} ====== + +Diese Seite wird automatisch aktualisiert. + +**Letztes Update:** {sync_datetime} + + +{header_row} +{table_rows_markup} + + +---- + +**Hinweis:** Diese Tabelle ist interaktiv: + * Klicken Sie auf die Spaltenköpfe zum Sortieren + * Nutzen Sie das Suchfeld zum Filtern + * Klicken Sie auf Links für Details + +**Sicherheit:** + * 🟢 Grün + * **keine** Einweisungspflicht + * Bei Fragen zu Bedienung unterstützt der Thekendienst gerne + * Bei Unsicherheiten bitte aktiv nach Hilfe fragen + * Nicht gekennzeichnete Geräte können unter Beachtung der üblichen Sicherheitsregeln frei genutzt werden. + * 🟡 Gelb + * keine **explizite** Einweisungspflicht + * Höheres Risikio als „grüne Maschinen“ + * teilweise in der Handhabung anspruchsvoller („unintitive Bedienung“) + * ggf. müssen Verbrauchsmaterialien gewechselt werden + * Wir empfehlen eine Einweisung für den sicheren Umgang + * 🔴 Rot + * explizite Einweisungspflicht + * Ohne dokumentierte Einweisung darf die Maschine nicht bedient werden + * Für Einweisungstermine bitte den Thekendienst befragen oder trage dich [[https://hobbyhimmel.de/so-gehts/einweisungen/|hier]] im Kalender für einen Termin ein + +** Status ** + * 🙂 - Maschine/Gerät in gutem Zustand, keine bekannten Probleme + * 🙁 - Maschine/Gerät ist Defekt und darf nicht genutzt werden + * 🛠️ - Maschine/Gerät ist Defekt und wird gerade repariert + * ❌ - Maschine/Gerät wurde ausgemustert + +//Automatisch generiert - Änderungen werden beim nächsten Sync überschrieben// +""" # Seite in DokuWiki speichern dokuwiki_client.create_page( diff --git a/open_workshop_dokuwiki/models/res_config_settings.py b/open_workshop_dokuwiki/models/res_config_settings.py index 060a2ff..2c3752c 100644 --- a/open_workshop_dokuwiki/models/res_config_settings.py +++ b/open_workshop_dokuwiki/models/res_config_settings.py @@ -8,10 +8,19 @@ _logger = logging.getLogger(__name__) class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' + @api.model + def _register_hook(self): + """ + Hook der bei jedem Modul-Load (auch bei Update) ausgeführt wird. + Initialisiert fehlende DokuWiki-Parameter. + """ + super()._register_hook() + self._init_dokuwiki_parameters() + @api.model def _init_dokuwiki_parameters(self): """ - Initialisiert DokuWiki-Parameter beim Modul-Install falls sie nicht existieren. + Initialisiert DokuWiki-Parameter beim Modul-Install/-Update falls sie nicht existieren. Wird automatisch beim Laden des Moduls aufgerufen. """ IrConfigParameter = self.env['ir.config_parameter'].sudo() @@ -21,12 +30,22 @@ class ResConfigSettings(models.TransientModel): 'dokuwiki.url': 'https://wiki.hobbyhimmel.de', 'dokuwiki.user': 'odoo.odoo', 'dokuwiki.password': 'CHANGE_ME', - 'dokuwiki.overview_page_id': 'werkstatt:ausruestung:uebersicht', - 'dokuwiki.overview_template_id': 'werkstatt:ausruestung:uebersicht_template', + 'dokuwiki.overview_page_id': 'werkstatt:ausruestung:start', + 'dokuwiki.overview_title': 'Geräte & Maschinen - Übersicht', + 'dokuwiki.overview_columns': 'Name|Zustand|Sicherheit|Bereich|Standort|Bild', + 'dokuwiki.overview_column_data': '[[{wiki_page_id}|{name}]]|{status_smiley}|{ows_machine_id.category_icon}|{ows_area}|{location}|{image}', } # Nur fehlende Parameter anlegen + count_created = 0 + count_existing = 0 for key, value in defaults.items(): if not IrConfigParameter.get_param(key): IrConfigParameter.set_param(key, value) + count_created += 1 _logger.info(f"DokuWiki parameter '{key}' initialized with default value") + else: + count_existing += 1 + + if count_created > 0: + _logger.info(f"DokuWiki parameters: {count_created} created, {count_existing} already existing")