diff --git a/open_workshop_dokuwiki/README.md b/open_workshop_dokuwiki/README.md
index ac351cf..2b2e920 100644
--- a/open_workshop_dokuwiki/README.md
+++ b/open_workshop_dokuwiki/README.md
@@ -7,12 +7,15 @@ Basis-Felder (maintenance.equipment):
{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"
@@ -32,4 +35,5 @@ ows.machine Felder (falls verknüpft):
{ows_machine_id.serial_no} - Seriennummer
{ows_machine_id.location} - Standort
{ows_machine_id.note} - Notizen
-{ows_machine_id.category} - Kategorie
\ No newline at end of file
+{ows_machine_id.category} - Sicherheitskategorie (red/yellow/green)
+{ows_machine_id.category_icon} - Kategorie-Icon als Emoji (🔴/🟡/🟢)
\ No newline at end of file
diff --git a/open_workshop_dokuwiki/__init__.py b/open_workshop_dokuwiki/__init__.py
index ab4d630..0c3e1b6 100644
--- a/open_workshop_dokuwiki/__init__.py
+++ b/open_workshop_dokuwiki/__init__.py
@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
from . import models
+from . import wizard
from .hooks import post_init_hook
diff --git a/open_workshop_dokuwiki/__manifest__.py b/open_workshop_dokuwiki/__manifest__.py
index 4625ddb..546b09d 100644
--- a/open_workshop_dokuwiki/__manifest__.py
+++ b/open_workshop_dokuwiki/__manifest__.py
@@ -37,13 +37,17 @@ ACL:
'depends': [
'open_workshop_base',
'maintenance',
+ 'maintenance_equipment_status',
],
'external_dependencies': {
'python': ['dokuwiki'],
},
'data': [
+ 'security/ir.model.access.csv',
'data/ir_config_parameter.xml',
'views/maintenance_equipment_views.xml',
+ 'views/maintenance_equipment_status_views.xml',
+ 'wizard/equipment_wiki_sync_wizard_views.xml',
],
'post_init_hook': 'post_init_hook',
'installable': True,
diff --git a/open_workshop_dokuwiki/models/__init__.py b/open_workshop_dokuwiki/models/__init__.py
index 6d09f64..1a6af17 100644
--- a/open_workshop_dokuwiki/models/__init__.py
+++ b/open_workshop_dokuwiki/models/__init__.py
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
from . import dokuwiki_client
from . import maintenance_equipment
+from . import maintenance_equipment_status
from . import res_config_settings
diff --git a/open_workshop_dokuwiki/models/maintenance_equipment.py b/open_workshop_dokuwiki/models/maintenance_equipment.py
index 4154a92..83bf4b6 100644
--- a/open_workshop_dokuwiki/models/maintenance_equipment.py
+++ b/open_workshop_dokuwiki/models/maintenance_equipment.py
@@ -222,7 +222,7 @@ class MaintenanceEquipment(models.Model):
values = {
# Spezielle Werte
'wiki_doku_page': doku_page_id,
- 'wiki_doku_link': f"[[{doku_page_id}|✏️ Zentrale Dokumentation bearbeiten]]",
+ 'wiki_doku_link': f"[[{doku_page_id}| Wiki Dokumentation]]",
'odoo_link': f"[[{odoo_equipment_url}|🔗 In Odoo öffnen]]",
'odoo_url': odoo_equipment_url,
'sync_datetime': datetime.now().strftime('%d.%m.%Y %H:%M'),
@@ -234,12 +234,15 @@ class MaintenanceEquipment(models.Model):
'ows_area': self.ows_area_id.name if self.ows_area_id else '',
'category': self.category_id.name if self.category_id else '',
'status': self.status_id.name if self.status_id else '',
+ 'status_smiley': self.status_id.smiley if self.status_id and self.status_id.smiley else '',
'location': self.location or '',
'assign_date': self.assign_date.strftime('%d.%m.%Y') if self.assign_date else '',
'cost': str(self.cost) if self.cost else '',
'warranty_date': self.warranty_date.strftime('%d.%m.%Y') if self.warranty_date else '',
'color': str(self.color) if self.color else '',
'note': self.note or '',
+ 'partner_id': self.partner_id.name if self.partner_id else '',
+ 'partner_ref': self.partner_ref or '',
}
# ows.machine Felder hinzufügen (falls verknüpft)
@@ -259,8 +262,10 @@ class MaintenanceEquipment(models.Model):
ows_machine_fields['ows_machine_id.location'] = machine.location
if hasattr(machine, 'note'):
ows_machine_fields['ows_machine_id.note'] = machine.note or ''
- if hasattr(machine, 'category_id') and machine.category_id:
- ows_machine_fields['ows_machine_id.category'] = machine.category_id.name
+ if hasattr(machine, 'ows_category') and machine.ows_category:
+ ows_machine_fields['ows_machine_id.category'] = machine.ows_category
+ if hasattr(machine, 'ows_category_icon') and machine.ows_category_icon:
+ ows_machine_fields['ows_machine_id.category_icon'] = machine.ows_category_icon
values.update(ows_machine_fields)
diff --git a/open_workshop_dokuwiki/models/maintenance_equipment_status.py b/open_workshop_dokuwiki/models/maintenance_equipment_status.py
new file mode 100644
index 0000000..96e933f
--- /dev/null
+++ b/open_workshop_dokuwiki/models/maintenance_equipment_status.py
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+from odoo import fields, models
+
+
+class MaintenanceEquipmentStatus(models.Model):
+ _inherit = 'maintenance.equipment.status'
+
+ smiley = fields.Char(
+ string='Smiley',
+ help='DokuWiki Smiley für diesen Status (z.B. :-) oder :-()'
+ )
diff --git a/open_workshop_dokuwiki/security/ir.model.access.csv b/open_workshop_dokuwiki/security/ir.model.access.csv
new file mode 100644
index 0000000..18191ce
--- /dev/null
+++ b/open_workshop_dokuwiki/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_equipment_wiki_sync_wizard,equipment.wiki.sync.wizard,model_equipment_wiki_sync_wizard,base.group_user,1,1,1,1
diff --git a/open_workshop_dokuwiki/views/maintenance_equipment_status_views.xml b/open_workshop_dokuwiki/views/maintenance_equipment_status_views.xml
new file mode 100644
index 0000000..14bdc82
--- /dev/null
+++ b/open_workshop_dokuwiki/views/maintenance_equipment_status_views.xml
@@ -0,0 +1,24 @@
+
+
+
+ maintenance.equipment.status.form.dokuwiki
+ maintenance.equipment.status
+
+
+
+
+
+
+
+
+
+ maintenance.equipment.status.tree.dokuwiki
+ maintenance.equipment.status
+
+
+
+
+
+
+
+
diff --git a/open_workshop_dokuwiki/wizard/__init__.py b/open_workshop_dokuwiki/wizard/__init__.py
new file mode 100644
index 0000000..dc5a3de
--- /dev/null
+++ b/open_workshop_dokuwiki/wizard/__init__.py
@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+from . import equipment_wiki_sync_wizard
diff --git a/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard.py b/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard.py
new file mode 100644
index 0000000..ca7a8d6
--- /dev/null
+++ b/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard.py
@@ -0,0 +1,123 @@
+# -*- coding: utf-8 -*-
+import logging
+from odoo import api, fields, models, _
+from odoo.exceptions import UserError
+
+_logger = logging.getLogger(__name__)
+
+
+class EquipmentWikiSyncWizard(models.TransientModel):
+ _name = 'equipment.wiki.sync.wizard'
+ _description = 'Massen-Synchronisation von Equipment zu DokuWiki'
+
+ sync_mode = fields.Selection([
+ ('all', 'Alle Equipment'),
+ ('area', 'Nach Bereich filtern'),
+ ('unsynced', 'Nur nicht synchronisierte'),
+ ], string='Synchronisations-Modus', default='all', required=True)
+
+ ows_area_id = fields.Many2one(
+ 'ows.machine.area',
+ string='Bereich',
+ help='Nur Equipment aus diesem Bereich synchronisieren'
+ )
+
+ force_sync = fields.Boolean(
+ string='Zentrale Doku-Seiten überschreiben',
+ default=False,
+ help='Auch bereits existierende zentrale Dokumentationsseiten neu generieren (VORSICHT: Überschreibt manuell erstellten Inhalt!)'
+ )
+
+ # Statistik-Felder (nach Sync)
+ total_count = fields.Integer(string='Gefunden', readonly=True)
+ success_count = fields.Integer(string='Erfolgreich', readonly=True)
+ error_count = fields.Integer(string='Fehler', readonly=True)
+ error_messages = fields.Text(string='Fehlermeldungen', readonly=True)
+
+ @api.onchange('sync_mode')
+ def _onchange_sync_mode(self):
+ """Bereich-Feld nur bei 'area' Modus anzeigen"""
+ if self.sync_mode != 'area':
+ self.ows_area_id = False
+
+ def action_sync_equipment(self):
+ """
+ Hauptaktion: Equipment synchronisieren basierend auf gewähltem Modus
+ """
+ self.ensure_one()
+
+ # Equipment-Liste basierend auf Modus ermitteln
+ domain = []
+
+ if self.sync_mode == 'area':
+ if not self.ows_area_id:
+ raise UserError("Bitte einen Bereich auswählen!")
+ domain.append(('ows_area_id', '=', self.ows_area_id.id))
+ elif self.sync_mode == 'unsynced':
+ domain.append(('wiki_synced', '=', False))
+
+ # Equipment finden
+ equipment_records = self.env['maintenance.equipment'].search(domain)
+
+ if not equipment_records:
+ raise UserError("Keine Equipment-Einträge gefunden, die synchronisiert werden können!")
+
+ total = len(equipment_records)
+ success = 0
+ errors = 0
+ error_list = []
+
+ _logger.info(f"Starte Wiki-Synchronisation für {total} Equipment-Einträge")
+
+ # Jeden Equipment-Eintrag synchronisieren
+ for equipment in equipment_records:
+ try:
+ # Prüfen ob Bereich gesetzt ist
+ if not equipment.ows_area_id:
+ error_msg = f"{equipment.name}: Kein Bereich gesetzt"
+ error_list.append(error_msg)
+ errors += 1
+ _logger.warning(error_msg)
+ continue
+
+ # Force-Sync: Zentrale Doku-Seite überschreiben
+ if self.force_sync and equipment.wiki_doku_id:
+ doku_page_id = equipment._get_wiki_doku_page_id()
+ doku_content = equipment._generate_wiki_doku_page_content()
+ dokuwiki_client = self.env['dokuwiki.client']
+ dokuwiki_client.create_page(
+ doku_page_id,
+ doku_content,
+ f"Überschrieben von Massen-Sync: {equipment.name}"
+ )
+ _logger.info(f"Zentrale Doku-Seite überschrieben: {doku_page_id}")
+
+ # Standard-Synchronisation
+ equipment.sync_to_dokuwiki()
+ success += 1
+ _logger.info(f"✓ {equipment.name} synchronisiert")
+
+ except Exception as e:
+ error_msg = f"{equipment.name}: {str(e)}"
+ error_list.append(error_msg)
+ errors += 1
+ _logger.error(f"✗ {error_msg}")
+
+ # Statistik speichern
+ self.write({
+ 'total_count': total,
+ 'success_count': success,
+ 'error_count': errors,
+ 'error_messages': '\n'.join(error_list) if error_list else 'Keine Fehler',
+ })
+
+ # Ergebnis-View anzeigen
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': 'Wiki-Synchronisation Ergebnis',
+ 'res_model': 'equipment.wiki.sync.wizard',
+ 'view_mode': 'form',
+ 'res_id': self.id,
+ 'target': 'new',
+ 'context': {'show_result': True},
+ }
diff --git a/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard_views.xml b/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard_views.xml
new file mode 100644
index 0000000..e9d6f8d
--- /dev/null
+++ b/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard_views.xml
@@ -0,0 +1,60 @@
+
+
+
+
+ equipment.wiki.sync.wizard.form
+ equipment.wiki.sync.wizard
+
+
+
+
+
+
+
+ Wiki-Synchronisation
+ equipment.wiki.sync.wizard
+ form
+ new
+ {}
+
+
+
+
+