From a23afea36da933cc82c5e51cc76be99e6f399181 Mon Sep 17 00:00:00 2001 From: "matthias.lotz" Date: Sat, 21 Jun 2025 20:53:57 +0200 Subject: [PATCH 1/2] fixed Color Picker in machine_area_views --- models/ows_models.py | 50 +++++++++++++++++++++++++++++++++--- views/machine_area_views.xml | 6 +++-- 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/models/ows_models.py b/models/ows_models.py index e2fea6e..c19a086 100644 --- a/models/ows_models.py +++ b/models/ows_models.py @@ -377,15 +377,57 @@ class OwsUser(models.Model): ] +AVAILABLE_COLORS = [ + ('#000000', 'schwarz'), + ('#ff0000', 'Rot'), + ('#E91E63', 'Pink'), + ('#9C27B0', 'Lila'), + ('#3F51B5', 'Indigo'), + ('#0000ff', 'Blau'), + ('#008000', 'Grün'), + ('#ffff00', 'Gelb'), + ('#FF9800', 'Orange'), + ('#795548', 'Braun'), + ('#ffffff', 'Weiss'), +] + class OwsMachineArea(models.Model): _name = 'ows.machine.area' - _table = "ows_machine_area" + _table = 'ows_machine_area' _description = 'OWS: Maschinenbereich' _order = 'name' - name = fields.Char(required=True, translate=True) - #color = fields.Integer(string="Farbe") - color_hex = fields.Char(string="Farbe (Hex)", help="Hex-Farbcode wie #FF0000 für Rot") + name = fields.Char(string="Name", required=True, translate=True) + + color_hex = fields.Selection( + selection=AVAILABLE_COLORS, + string="Farbe (Hex)", + required=True, + ) + + color_hex_value = fields.Char( + string="Farbcode", + compute='_compute_color_hex_value', + store=False + ) + + color_name = fields.Char( + string="Farbname", + compute='_compute_color_name', + store=False + ) + + @api.depends('color_hex') + def _compute_color_hex_value(self): + for rec in self: + rec.color_hex_value = rec.color_hex or '' + + @api.depends('color_hex') + def _compute_color_name(self): + label_dict = dict(AVAILABLE_COLORS) + for rec in self: + rec.color_name = label_dict.get(rec.color_hex, 'Unbekannt') + class OwsMachine(models.Model): diff --git a/views/machine_area_views.xml b/views/machine_area_views.xml index 88e9956..b2232b7 100644 --- a/views/machine_area_views.xml +++ b/views/machine_area_views.xml @@ -17,7 +17,8 @@ - + + @@ -30,7 +31,8 @@
- + +
From a1eb1461379d74e0c918c632c56b5d3f15469a51 Mon Sep 17 00:00:00 2001 From: "matthias.lotz" Date: Sat, 21 Jun 2025 22:10:40 +0200 Subject: [PATCH 2/2] [FIX] open_workshop: sichere Zugriffskontrolle auf Partner im POS-Widget - Speichert den aktuellen Partner explizit in state.client - Dadurch wird im POS Frontend im Widget Geburtstag, HA, ... angezeigt. --- models/ows_models.py | 26 ++++++++++++++++++++++-- static/src/js/ows_machine_access_list.js | 3 ++- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/models/ows_models.py b/models/ows_models.py index c19a086..05d6380 100644 --- a/models/ows_models.py +++ b/models/ows_models.py @@ -466,6 +466,28 @@ class OwsMachine(models.Model): @api.model def get_access_list_grouped(self, partner_id): + """ + Gibt eine gruppierte Liste von Maschinenzugängen für einen bestimmten Partner zurück. Diese Funktion wird in + Odoo POS Frontend verwendet um die Ansicht zu erzeugen auf Welche Maschinen der Partner Zugriff hat. + + Für einen gegebenen Partner (über die partner_id) werden alle Maschinenbereiche (areas) abgefragt. + Für jeden Bereich wird geprüft, auf welche Maschinen der Partner Zugriff hat. Das Ergebnis wird + als Liste von Bereichen mit jeweils zugehörigen Maschinen und Zugriffsstatus zurückgegeben. + + Zusätzlich werden sicherheitsrelevante Informationen des Partners (wie Sicherheitsunterweisung, + Sicherheits-ID, RFID-Karte und Geburtstag) aus dem zugehörigen ows_user ermittelt und mitgeliefert. + + Args: + partner_id (int): Die ID des Partners, für den die Zugriffsübersicht erstellt werden soll. + + Returns: + dict: Ein Dictionary mit folgenden Schlüsseln: + - 'access_by_area': Liste von Bereichen mit Maschinen und Zugriffsstatus. + - 'security_briefing': Sicherheitsunterweisung des Nutzers (bool oder False). + - 'security_id': Sicherheits-ID des Nutzers (str oder ''). + - 'rfid_card': RFID-Kartennummer des Nutzers (str oder ''). + - 'birthday': Geburtstag des Nutzers (str oder ''). + """ partner = self.env['res.partner'].browse(partner_id) areas = self.env['ows.machine.area'].search([], order="name") @@ -520,7 +542,7 @@ class OwsMachineAccess(models.Model): class OwsMachineProduct(models.Model): _name = 'ows.machine.product' _table = 'ows_machine_product' - _description = 'OWS: Zurordnung Produkt der Nutzung zur die Maschine' + _description = 'OWS: Zuordnung Produkt der Nutzung zu der Maschine' product_id = fields.Many2one('product.product', required=True, domain=[('available_in_pos', '=', True)], ondelete='cascade') machine_id = fields.Many2one('ows.machine', required=True, ondelete='cascade') @@ -528,7 +550,7 @@ class OwsMachineProduct(models.Model): class OwsMachineTraining(models.Model): _name = 'ows.machine.training' _table = 'ows_machine_training' - _description = 'OWS: Zurordnung Produkt der Einweisung zur die Maschine' + _description = 'OWS: Zuordnung Produkt der Einweisung zu der Maschine' training_id = fields.Many2one('product.product', required=True, domain=[('available_in_pos', '=', True)], ondelete='cascade') machine_id = fields.Many2one('ows.machine', required=True, ondelete='cascade') diff --git a/static/src/js/ows_machine_access_list.js b/static/src/js/ows_machine_access_list.js index fc9e981..7e63850 100644 --- a/static/src/js/ows_machine_access_list.js +++ b/static/src/js/ows_machine_access_list.js @@ -12,6 +12,7 @@ export class OwsMachineAccessList extends Component { this.pos = usePos(); this.state = useState({ + client: null, grouped_accesses: [], security_briefing: false, security_id: '', @@ -31,7 +32,7 @@ export class OwsMachineAccessList extends Component { async updateAccessList() { const order = this.pos.get_order(); const partner = order?.get_partner?.(); - + this.state.client = partner || null; if (!partner) { this.state.grouped_accesses = []; this.state.security_briefing = false;