From c0ac8fac683a403e89313dcc60a525f436b8ee88 Mon Sep 17 00:00:00 2001 From: laurentbarontini Date: Mon, 29 Jun 2026 23:05:27 +0200 Subject: [PATCH] Coffee --- modules/purchase_trade/coffee.py | 44 ++++++++++++++----- .../view/purchase_line_form.xml | 4 +- .../purchase_trade/view/sale_line_form.xml | 4 +- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/modules/purchase_trade/coffee.py b/modules/purchase_trade/coffee.py index a26373e..e6e61c1 100644 --- a/modules/purchase_trade/coffee.py +++ b/modules/purchase_trade/coffee.py @@ -3,6 +3,8 @@ import datetime from decimal import Decimal +from lxml import etree + from trytond.model import ModelSQL, ModelView, Workflow, fields from trytond.pool import Pool, PoolMeta from trytond.pyson import Eval @@ -1072,11 +1074,23 @@ class CoffeeLabAnalysis(Workflow, ModelSQL, ModelView): class CoffeeLineMixin: + _coffee_view_fields = { + 'coffee_quality_status', + 'coffee_origin', + 'coffee_type', + 'coffee_process', + 'coffee_variety', + 'coffee_crop_year', + 'coffee_screen_size', + 'coffee_moisture_max', + 'coffee_defect_max', + 'coffee_cup_score_min', + 'coffee_samples', + } + active_coffee_compatibility = fields.Function( fields.Boolean('Active coffee compatibility'), 'get_active_coffee_compatibility') - coffee_samples = fields.One2Many( - 'coffee.sample', None, 'Coffee samples') coffee_quality_status = fields.Function(fields.Selection([ (None, ''), ('none', 'No sample'), @@ -1107,14 +1121,24 @@ class CoffeeLineMixin: return self.get_active_coffee_compatibility(name) @classmethod - def view_attributes(cls): - attributes = super().view_attributes() - if not coffee_compatibility_active(): - attributes += [ - ('//page[@id="coffee_quality"]', 'states', - {'invisible': True}), - ] - return attributes + def fields_view_get(cls, view_id=None, view_type='form', level=None): + result = super().fields_view_get( + view_id=view_id, view_type=view_type, level=level) + if view_type == 'form' and not coffee_compatibility_active(): + cls._remove_coffee_quality_page(result) + return result + + @classmethod + def _remove_coffee_quality_page(cls, view): + parser = etree.XMLParser(remove_blank_text=True, resolve_entities=False) + tree = etree.fromstring(view['arch'], parser) + for page in tree.xpath('//page[@id="coffee_quality"]'): + parent = page.getparent() + if parent is not None: + parent.remove(page) + view['arch'] = etree.tostring(tree, encoding='unicode') + for field_name in cls._coffee_view_fields: + view.get('fields', {}).pop(field_name, None) def get_coffee_quality_status(self, name=None): samples = self._coffee_samples() diff --git a/modules/purchase_trade/view/purchase_line_form.xml b/modules/purchase_trade/view/purchase_line_form.xml index 45abd6a..d265d51 100755 --- a/modules/purchase_trade/view/purchase_line_form.xml +++ b/modules/purchase_trade/view/purchase_line_form.xml @@ -5,7 +5,6 @@ this repository contains the full copyright notices and license terms. --> - @@ -136,8 +135,7 @@ this repository contains the full copyright notices and license terms. --> + col_widths="1fr,1fr,1fr,1fr,1fr,1fr,1fr,1fr,1fr,1fr,1fr,1fr"> diff --git a/modules/purchase_trade/view/sale_line_form.xml b/modules/purchase_trade/view/sale_line_form.xml index c47eb4d..77a4b9d 100755 --- a/modules/purchase_trade/view/sale_line_form.xml +++ b/modules/purchase_trade/view/sale_line_form.xml @@ -5,7 +5,6 @@ this repository contains the full copyright notices and license terms. --> - @@ -129,8 +128,7 @@ this repository contains the full copyright notices and license terms. --> + col_widths="1fr,1fr,1fr,1fr,1fr,1fr,1fr,1fr,1fr,1fr,1fr,1fr">