diff --git a/odoo_repository/models/odoo_module_branch.py b/odoo_repository/models/odoo_module_branch.py index 2229d0f..c5ef024 100644 --- a/odoo_repository/models/odoo_module_branch.py +++ b/odoo_repository/models/odoo_module_branch.py @@ -307,9 +307,10 @@ def _get_recursive_dependencies(self, domain=None, _visited=None): domain = [] if _visited is None: _visited = set() - if self.id in _visited: + current_ids = set(self.ids) + if current_ids.issubset(_visited): return self.browse() - _visited.add(self.id) + _visited |= current_ids # Apply domain and exclude self dependencies = (self.dependency_ids - self).filtered_domain(domain) dep_ids = set(dependencies.ids) diff --git a/odoo_repository/tests/test_odoo_module_branch_recursive_dependencies.py b/odoo_repository/tests/test_odoo_module_branch_recursive_dependencies.py index f6b3094..6915b31 100644 --- a/odoo_repository/tests/test_odoo_module_branch_recursive_dependencies.py +++ b/odoo_repository/tests/test_odoo_module_branch_recursive_dependencies.py @@ -188,6 +188,22 @@ def test_get_recursive_dependencies_empty(self): deps = mod_alone_branch._get_recursive_dependencies() self.assertEqual(len(deps), 0) + def test_get_recursive_dependencies_multi_record_self(self): + """Test _get_recursive_dependencies called on a non-singleton recordset.""" + # This mirrors odoo.project.import.modules._action_import_missing_dependencies, + # which calls the method on the module_branch_id of several project + # modules at once. The previous implementation relied on `self.id`, + # raising `ValueError: Expected singleton` for more than one record. + self.mod_a_branch.dependency_ids = self.mod_base_branch + self.mod_b_branch.dependency_ids = self.mod_c_branch + modules = self.mod_a_branch + self.mod_b_branch + deps = modules._get_recursive_dependencies() + self.assertIn(self.mod_base_branch, deps) + self.assertIn(self.mod_c_branch, deps) + self.assertNotIn(self.mod_a_branch, deps) + self.assertNotIn(self.mod_b_branch, deps) + self.assertEqual(len(deps), 2) # base, module_c + def test_get_recursive_dependencies_self_exclusion(self): """Test that _get_recursive_dependencies excludes self.""" # Create modules