From 2db9ad7d442ef90232d65891c6b5a445ffdb8676 Mon Sep 17 00:00:00 2001 From: Suherdy Yacob Date: Fri, 29 May 2026 21:06:36 +0700 Subject: [PATCH] feat: expand restricted price fields visibility and apply to purchase order lines --- models/product.py | 71 ++++++++++++++++++++++++---------------- models/purchase_order.py | 47 ++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 29 deletions(-) diff --git a/models/product.py b/models/product.py index 03dafd8..4621f0c 100644 --- a/models/product.py +++ b/models/product.py @@ -22,7 +22,10 @@ class ProductSupplierinfo(models.Model): continue modified = False - price_fields = {'price', 'discount'} + price_fields = { + 'price', 'discount', 'currency_id', 'variation_percent', + 'previous_price', 'price_discounted' + } for field in doc.xpath("//field"): if field.get('name') in price_fields: is_column = False @@ -64,21 +67,26 @@ class ProductTemplate(models.Model): continue modified = False - for field in doc.xpath("//field[@name='standard_price']"): - is_column = False - p = field.getparent() - while p is not None: - if p.tag in ('tree', 'list'): - is_column = True - break - p = p.getparent() + price_fields = { + 'standard_price', 'price', 'discount', 'currency_id', + 'variation_percent', 'previous_price', 'price_discounted' + } + for field in doc.xpath("//field"): + if field.get('name') in price_fields: + is_column = False + p = field.getparent() + while p is not None: + if p.tag in ('tree', 'list'): + is_column = True + break + p = p.getparent() + + if is_column: + field.set('column_invisible', 'True') + else: + field.set('invisible', '1') + modified = True - if is_column: - field.set('column_invisible', 'True') - else: - field.set('invisible', '1') - modified = True - if modified: view_data['arch'] = etree.tostring(doc, encoding='utf-8').decode('utf-8') @@ -104,21 +112,26 @@ class ProductProduct(models.Model): continue modified = False - for field in doc.xpath("//field[@name='standard_price']"): - is_column = False - p = field.getparent() - while p is not None: - if p.tag in ('tree', 'list'): - is_column = True - break - p = p.getparent() + price_fields = { + 'standard_price', 'price', 'discount', 'currency_id', + 'variation_percent', 'previous_price', 'price_discounted' + } + for field in doc.xpath("//field"): + if field.get('name') in price_fields: + is_column = False + p = field.getparent() + while p is not None: + if p.tag in ('tree', 'list'): + is_column = True + break + p = p.getparent() + + if is_column: + field.set('column_invisible', 'True') + else: + field.set('invisible', '1') + modified = True - if is_column: - field.set('column_invisible', 'True') - else: - field.set('invisible', '1') - modified = True - if modified: view_data['arch'] = etree.tostring(doc, encoding='utf-8').decode('utf-8') diff --git a/models/purchase_order.py b/models/purchase_order.py index a64e9a7..f0afc0a 100644 --- a/models/purchase_order.py +++ b/models/purchase_order.py @@ -91,3 +91,50 @@ class PurchaseOrder(models.Model): view_data['arch'] = etree.tostring(doc, encoding='utf-8').decode('utf-8') return res + +class PurchaseOrderLine(models.Model): + _inherit = 'purchase.order.line' + + @api.model + def get_views(self, views, options=None): + res = super().get_views(views, options) + if not self.env.user.hide_purchase_prices: + return res + + for view_type, view_data in res.get('views', {}).items(): + arch_str = view_data.get('arch') + if not arch_str: + continue + + try: + doc = etree.fromstring(arch_str.encode('utf-8')) + except Exception: + continue + + modified = False + price_fields = { + 'price_unit', 'price_unit_product_uom', 'price_subtotal', + 'price_total', 'price_tax', 'discount', 'taxes_id' + } + + for field in doc.xpath("//field"): + if field.get('name') in price_fields: + is_column = False + p = field.getparent() + while p is not None: + if p.tag in ('tree', 'list'): + is_column = True + break + p = p.getparent() + + if is_column: + field.set('column_invisible', 'True') + else: + field.set('invisible', '1') + modified = True + + if modified: + view_data['arch'] = etree.tostring(doc, encoding='utf-8').decode('utf-8') + + return res +