From b425351b60e27fd6f3e0c864d04254b51078200c Mon Sep 17 00:00:00 2001 From: Carlos Dauden Date: Mon, 20 Feb 2023 18:55:59 +0100 Subject: [PATCH 1/2] [IMP] base_view_inheritance_extension: Add new options domain_add and text_add --- .../models/ir_ui_view.py | 77 +++++++++++++++++++ .../readme/CONTRIBUTORS.rst | 6 +- .../readme/USAGE.rst | 17 ++++ 3 files changed, 99 insertions(+), 1 deletion(-) diff --git a/base_view_inheritance_extension/models/ir_ui_view.py b/base_view_inheritance_extension/models/ir_ui_view.py index e6ee174f2..3a45dcc3b 100644 --- a/base_view_inheritance_extension/models/ir_ui_view.py +++ b/base_view_inheritance_extension/models/ir_ui_view.py @@ -1,14 +1,17 @@ # Copyright 2016 Therp BV # Copyright 2018 Tecnativa - Sergio Teruel # Copyright 2021 Camptocamp SA (https://www.camptocamp.com). +# Copyright 2023 Tecnativa - Carlos Dauden # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). import ast +import re import astor from lxml import etree from odoo import api, models +from odoo.osv import expression def ast_dict_update(source, update): @@ -128,3 +131,77 @@ class IrUiView(models.Model): pretty_source=lambda s: "".join(s).strip(), ) return source + + @api.model + def inheritance_handler_attributes_text_add(self, source, specs): + """Implement + <$node position="attributes"> + + $text_before {old_value} $text_after + + """ + node = self.locate_node(source, specs) + for attribute_node in specs: + attribute_name = attribute_node.get("name") + old_value = node.get(attribute_name) or "" + node.attrib[attribute_name] = attribute_node.text.format( + old_value=old_value + ) + return source + + @api.model + def inheritance_handler_attributes_domain_add(self, source, specs): + """Implement + <$node position="attributes"> + + $domain_to_add + + """ + node = self.locate_node(source, specs) + for attribute_node in specs: + attribute_name = attribute_node.get("name") + condition = attribute_node.get("condition") + join_operator = attribute_node.get("join_operator") or "AND" + old_value = node.get(attribute_name) or "" + if old_value: + old_domain = ast.literal_eval( + self.var2str_domain_text(old_value.strip()) + ) + new_domain = ast.literal_eval( + self.var2str_domain_text(attribute_node.text.strip()) + ) + if join_operator == "OR": + new_value = str(expression.OR([old_domain, new_domain])) + else: + new_value = str(expression.AND([old_domain, new_domain])) + new_value = self.str2var_domain_text(new_value) + else: + new_value = attribute_node.text + if condition: + new_value = "{condition} and {new_value} or {old_value}".format( + condition=condition, + new_value=new_value, + old_value=old_value, + ) + node.attrib[attribute_name] = new_value + return source + + @api.model + def var2str_domain_text(self, domain_str): + """Replaces var names with str names to allow eval without defined vars""" + # Replace fields in 2 steps because 1 step returns "parent_sufix"."var_sufix" + regex_parent = re.compile(r"parent\.(\b\w+\b)") + domain_str = re.sub( + regex_parent, r"'parent.\1_is_a_var_to_replace'", domain_str + ) + regex = re.compile(r"(? * Ronald Portier -* Sergio Teruel +* `Tecnativa `_: + + * Sergio Teruel + * Carlos Dauden + * Iván Todorovich diff --git a/base_view_inheritance_extension/readme/USAGE.rst b/base_view_inheritance_extension/readme/USAGE.rst index 66ae50d75..7acccf59c 100644 --- a/base_view_inheritance_extension/readme/USAGE.rst +++ b/base_view_inheritance_extension/readme/USAGE.rst @@ -14,3 +14,20 @@ Note that views are subject to evaluation of xmlids anyways, so if you need to refer to some xmlid, say ``%(xmlid)s``. + +**Add text after and/or before than original** + +.. code-block:: xml + + + $text_before {old_value} $text_after + + +**Add domain with AND/OR join operator (AND if missed) allowing conditional changes** + +.. code-block:: xml + + + $domain_to_add + From 5148f53431442c59abda2a74b0e2b9010d3487c0 Mon Sep 17 00:00:00 2001 From: sergio-teruel Date: Thu, 7 Sep 2023 18:57:31 +0200 Subject: [PATCH 2/2] [FIX] base_view_inheritance_extension: Crash domain for elements without previous domain defined --- base_view_inheritance_extension/README.rst | 27 ++++++++- .../models/ir_ui_view.py | 6 +- .../static/description/index.html | 59 ++++++++++++------- 3 files changed, 66 insertions(+), 26 deletions(-) diff --git a/base_view_inheritance_extension/README.rst b/base_view_inheritance_extension/README.rst index 4d732570a..637555c7c 100644 --- a/base_view_inheritance_extension/README.rst +++ b/base_view_inheritance_extension/README.rst @@ -7,7 +7,7 @@ Extended view inheritance !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:a2a6ec82054d07e82194c05453c4e8e2a0e32f5c503b8d08a1d115ad9f75e8ef + !! source digest: sha256:b4ce51071687c3c1085145c8aa6b9212febea204d46ff6382f8b44d5539fa426 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png @@ -23,7 +23,7 @@ Extended view inheritance :target: https://translation.odoo-community.org/projects/server-tools-16-0/server-tools-16-0-base_view_inheritance_extension :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/server-tools&target_branch=16.0 + :target: https://runboat.odoo-community.org/webui/builds.html?repo=OCA/server-tools&target_branch=16.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -56,6 +56,23 @@ Usage Note that views are subject to evaluation of xmlids anyways, so if you need to refer to some xmlid, say ``%(xmlid)s``. +**Add text after and/or before than original** + +.. code-block:: xml + + + $text_before {old_value} $text_after + + +**Add domain with AND/OR join operator (AND if missed) allowing conditional changes** + +.. code-block:: xml + + + $domain_to_add + + Known issues / Roadmap ====================== @@ -84,7 +101,11 @@ Contributors * Holger Brunn * Ronald Portier -* Sergio Teruel +* `Tecnativa `_: + + * Sergio Teruel + * Carlos Dauden + * Iván Todorovich Maintainers diff --git a/base_view_inheritance_extension/models/ir_ui_view.py b/base_view_inheritance_extension/models/ir_ui_view.py index 3a45dcc3b..37508736e 100644 --- a/base_view_inheritance_extension/models/ir_ui_view.py +++ b/base_view_inheritance_extension/models/ir_ui_view.py @@ -177,12 +177,14 @@ class IrUiView(models.Model): new_value = str(expression.AND([old_domain, new_domain])) new_value = self.str2var_domain_text(new_value) else: - new_value = attribute_node.text + # We must ensure that the domain definition has not line breaks because + # in update mode the domain cause an invalid syntax error + new_value = attribute_node.text.strip() if condition: new_value = "{condition} and {new_value} or {old_value}".format( condition=condition, new_value=new_value, - old_value=old_value, + old_value=old_value or [], ) node.attrib[attribute_name] = new_value return source diff --git a/base_view_inheritance_extension/static/description/index.html b/base_view_inheritance_extension/static/description/index.html index 37ddfc1c0..1c0b32f00 100644 --- a/base_view_inheritance_extension/static/description/index.html +++ b/base_view_inheritance_extension/static/description/index.html @@ -1,20 +1,20 @@ - + - + Extended view inheritance