diff --git a/base_user_role/i18n/de.po b/base_user_role/i18n/de.po index 933723126..c24267f5c 100644 --- a/base_user_role/i18n/de.po +++ b/base_user_role/i18n/de.po @@ -436,6 +436,18 @@ msgstr "Ansichten" msgid "Wizard to add multiple users to a role" msgstr "" +#. module: base_user_role +#. odoo-python +#: code:addons/base_user_role/models/role.py:0 +msgid "" +"You cannot delete a role that is still assigned to one or " +"more users. Please remove the users from the role(s) " +"before deleting. Roles in use: %s" +msgstr "" +"Sie können eine Rolle nicht löschen, die noch einem oder mehreren Benutzern " +"zugewiesen ist. Bitte entfernen Sie die Benutzer aus der/den Rolle(n), " +"bevor Sie löschen. Rollen in Verwendung: %s" + #. module: base_user_role #: model_terms:ir.ui.view,arch_db:base_user_role.create_from_user_wizard_view msgid "or" diff --git a/base_user_role/models/role.py b/base_user_role/models/role.py index 4cf166668..dc8b0cd13 100644 --- a/base_user_role/models/role.py +++ b/base_user_role/models/role.py @@ -4,6 +4,7 @@ import logging from odoo import SUPERUSER_ID, _, api, fields, models +from odoo.exceptions import UserError _logger = logging.getLogger(__name__) @@ -98,6 +99,21 @@ def write(self, vals): return res def unlink(self): + # Check if any of the roles being deleted are still assigned to users + role_lines = self.env["res.users.role.line"].search( + [("role_id", "in", self.ids)] + ) + if role_lines: + # Get role names for better error message + role_names = ", ".join(role_lines.mapped("role_id.name")) + raise UserError( + _( + "You cannot delete a role that is still assigned to one or " + "more users. Please remove the users from the role(s) " + "before deleting. Roles in use: %s" + ) + % role_names + ) users = self.mapped("user_ids") res = super().unlink() users.set_groups_from_roles(force=True) diff --git a/base_user_role/tests/test_user_role.py b/base_user_role/tests/test_user_role.py index 10331869e..8d110a96f 100644 --- a/base_user_role/tests/test_user_role.py +++ b/base_user_role/tests/test_user_role.py @@ -3,7 +3,7 @@ import datetime from odoo import fields -from odoo.exceptions import AccessError +from odoo.exceptions import AccessError, UserError from odoo.tests import tagged from odoo.tests.common import TransactionCase @@ -154,12 +154,20 @@ def test_role_unlink(self): # Check user has groups from role1 and role2 self.assertLessEqual(role1_groups, self.user_id.groups_id) self.assertLessEqual(role2_groups, self.user_id.groups_id) - # Remove role2 + # Remove role2 from user before unlinking + self.user_id.role_line_ids.filtered( + lambda rl: rl.role_id.id == self.role2_id.id + ).unlink() + # Now unlink role2 self.role2_id.unlink() # Check user has groups from only role1 self.assertLessEqual(role1_groups, self.user_id.groups_id) self.assertFalse(role2_groups <= self.user_id.groups_id) - # Remove role1 + # Remove role1 from user before unlinking + self.user_id.role_line_ids.filtered( + lambda rl: rl.role_id.id == self.role1_id.id + ).unlink() + # Now unlink role1 self.role1_id.unlink() # Check user has no groups from role1 and role2 self.assertFalse(role1_groups <= self.user_id.groups_id) @@ -197,6 +205,18 @@ def test_role_line_unlink(self): self.assertFalse(role1_groups <= self.user_id.groups_id) self.assertFalse(role2_groups <= self.user_id.groups_id) + def test_role_unlink_with_users_assigned(self): + """Test that deleting a role with assigned users raises UserError.""" + # Assign role1 to a user + self.user_id.write({"role_line_ids": [(0, 0, {"role_id": self.role1_id.id})]}) + + # Try to delete the role - should raise UserError + with self.assertRaisesRegex( + UserError, + "You cannot delete a role that is still assigned to one or " "more users", + ): + self.role1_id.unlink() + def test_default_user_roles(self): self.default_user.write( {