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 + {} + + + + +