diff --git a/odoo/addons/base/models/ir_ui_view.py b/odoo/addons/base/models/ir_ui_view.py index e8d730453a1..5c26c00d457 100644 --- a/odoo/addons/base/models/ir_ui_view.py +++ b/odoo/addons/base/models/ir_ui_view.py @@ -1216,6 +1216,31 @@ actual arch. if not node.get('on_change'): node.set('on_change', '1') + def _get_x2many_missing_view_archs(self, field, field_node, node_info): + """ + For x2many fields that require to have some multi-record arch (kanban or list) to display the records + be available, this function fetches all arch that are needed and return them. + The caller function is responsible to do what it needs with them. + """ + current_view_types = [el.tag for el in field_node.xpath("./*[descendant::field]")] + missing_view_types = [] + if not any(view_type in current_view_types for view_type in field_node.get('mode', 'kanban,tree').split(',')): + missing_view_types.append( + field_node.get('mode', 'kanban' if node_info.get('mobile') else 'tree').split(',')[0] + ) + + if not missing_view_types: + return [] + + comodel = self.env[field.comodel_name].sudo(False) + refs = self._get_view_refs(field_node) + # Do not propagate _view_ref of parent call to `_get_view` + comodel = comodel.with_context(**{ + f'{view_type}_view_ref': refs.get(f'{view_type}_view_ref') + for view_type in missing_view_types + }) + + return [comodel._get_view(view_type=view_type) for view_type in missing_view_types] #------------------------------------------------------ # Specific node postprocessors @@ -1260,23 +1285,9 @@ actual arch. # if no widget or the widget requires it. # So the web client doesn't have to call `get_views` for x2many fields not embedding their view # in the main form view. - current_view_types = [el.tag for el in node.xpath("./*[descendant::field]")] - missing_view_types = [] - if not any(view_type in current_view_types for view_type in node.get('mode', 'kanban,tree').split(',')): - missing_view_types.append( - node.get('mode', 'kanban' if node_info.get('mobile') else 'tree').split(',')[0] - ) - if missing_view_types: - comodel = self.env[field.comodel_name].sudo(False) - refs = self._get_view_refs(node) - # Do not propagate _view_ref of parent call to `_get_view` - comodel = comodel.with_context(**{ - f'{view_type}_view_ref': refs.get(f'{view_type}_view_ref') - for view_type in missing_view_types - }) - for view_type in missing_view_types: - subarch, _subview = comodel._get_view(view_type=view_type) - node.append(subarch) + for arch, _view in self._get_x2many_missing_view_archs(field, node, node_info): + node.append(arch) + for child in node: if child.tag in ('form', 'tree', 'graph', 'kanban', 'calendar'): node_info['children'] = []