From 28bc88684058744f837ea9370d78ccafbffc15bb Mon Sep 17 00:00:00 2001 From: Daniel Duque Date: Wed, 30 Oct 2024 13:12:37 +0100 Subject: [PATCH] [FIX] base_user_role: default roles When granting access to a contact, a copy from Portal User Template is made for it. But applied default roles are the ones from Default User Template, causing an error when trying to assign both internal and portal types to new user. --- base_user_role/models/user.py | 36 +++++++++++++++++++------- base_user_role/tests/test_user_role.py | 32 +++++++++++++++++++++++ 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/base_user_role/models/user.py b/base_user_role/models/user.py index b1afa280c..573907dc5 100644 --- a/base_user_role/models/user.py +++ b/base_user_role/models/user.py @@ -34,15 +34,21 @@ def _default_role_lines(self): default_user = self.env.ref("base.default_user", raise_if_not_found=False) default_values = [] if default_user: - for role_line in default_user.with_context(active_test=False).role_line_ids: - default_values.append( - { - "role_id": role_line.role_id.id, - "date_from": role_line.date_from, - "date_to": role_line.date_to, - "is_enabled": role_line.is_enabled, - } - ) + default_values = default_user._get_role_lines_vals_from_user() + return default_values + + def _get_role_lines_vals_from_user(self): + self.ensure_one() + default_values = [] + for role_line in self.with_context(active_test=False).role_line_ids: + default_values.append( + { + "role_id": role_line.role_id.id, + "date_from": role_line.date_from, + "date_to": role_line.date_to, + "is_enabled": role_line.is_enabled, + } + ) return default_values @api.depends("role_line_ids.role_id") @@ -97,3 +103,15 @@ def set_groups_from_roles(self, force=False): vals = {"groups_id": groups} super(ResUsers, user).write(vals) return True + + def copy(self, default=None): + self.ensure_one() + portal_user = self.env.ref( + "base.template_portal_user_id", raise_if_not_found=False + ) + if portal_user and self == portal_user: + default["role_line_ids"] = [ + (0, 0, role_vals) + for role_vals in portal_user._get_role_lines_vals_from_user() + ] + return super().copy(default=default) diff --git a/base_user_role/tests/test_user_role.py b/base_user_role/tests/test_user_role.py index a20e8cd2a..48b827126 100644 --- a/base_user_role/tests/test_user_role.py +++ b/base_user_role/tests/test_user_role.py @@ -270,3 +270,35 @@ def test_group_groups_into_role(self): self.assertTrue(new_role) # Check that the role has the correct groups self.assertEqual(set(new_role.implied_ids.ids), set(user_group_ids)) + + def test_role_default_user(self): + """ + Test that portal user has the right role and groups based on the portal + template. + """ + self.default_user.write( + { + "role_line_ids": [ + (0, 0, {"role_id": self.role1_id.id}), + (0, 0, {"role_id": self.role2_id.id}), + ] + } + ) + + portal_template = self.env.ref("base.template_portal_user_id") + portal_group = self.env.ref("base.group_portal") + vals = { + "name": "Portal Role", + "implied_ids": [(6, 0, [portal_group.id])], + } + portal_role = self.role_model.create(vals) + portal_template.write({"role_line_ids": [(0, 0, {"role_id": portal_role.id})]}) + portal_user = portal_template.copy( + { + "name": "New portal user", + "active": True, + } + ) + portal_user = portal_user.with_context(active_test=False) + self.assertNotIn(self.group_user_id, set(portal_user.groups_id)) + self.assertIn(portal_role.group_id, set(portal_user.groups_id))