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 e6ee174f2..37508736e 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,79 @@ 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>"""
+ 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>"""
+ 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:
+ # 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 or [],
+ )
+ 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
+
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