diff --git a/odoo/addons/base/models/ir_ui_view.py b/odoo/addons/base/models/ir_ui_view.py index 04f735a4e72..c7392a51a52 100644 --- a/odoo/addons/base/models/ir_ui_view.py +++ b/odoo/addons/base/models/ir_ui_view.py @@ -1749,7 +1749,7 @@ actual arch. valid_aria_attrs = { *att_names('title'), *att_names('aria-label'), *att_names('aria-labelledby'), } - valid_t_attrs = {'t-value', 't-raw', 't-field', 't-esc'} + valid_t_attrs = {'t-value', 't-raw', 't-field', 't-esc', 't-out'} ## Following or preceding text if (node.tail or '').strip() or (node.getparent().text or '').strip(): @@ -1769,15 +1769,15 @@ actual arch. if has_text(node.getnext()) or has_text(node.getprevious()): return - ## Aria label can be on ancestors def has_title_or_aria_label(node): return any(node.get(attr) for attr in valid_aria_attrs) - parent = node.getparent() - while parent is not None: - if has_title_or_aria_label(parent): - return - parent = parent.getparent() + ## Aria label can be on ancestors + if any(map(has_title_or_aria_label, node.iterancestors())): + return + + if node.get('string'): + return ## And we ignore all elements with describing in children def contains_description(node, depth=0): @@ -1789,8 +1789,6 @@ actual arch. return True if node.tag in ('label', 'field'): return True - if node.tag == 'button' and node.get('string'): - return True if node.text: # not sure, does it match *[text()] return True return any(contains_description(child, depth+1) for child in node) @@ -1798,7 +1796,7 @@ actual arch. if contains_description(node): return - msg = ('%s must have title in its tag, parents, descendants or have text') + msg = '%s must have title in its tag, parents, descendants or have text' self._log_view_warning(msg % description, node) def _get_domain_identifiers(self, node, domain, use, expr=None):