From 3d408dc663a0b810068dd32aafb7f9bc121478c0 Mon Sep 17 00:00:00 2001 From: sebalix Date: Thu, 21 Sep 2017 11:21:34 +0200 Subject: [PATCH] [FIX+IMP] base_user_role: Several things: * FIX: Update users' groups when a role is deleted * IMP: add some test cases to check user's groups when its last role line is removed * FIX: ensure that the user's groups are updated when its last role line is removed --- base_user_role/models/role.py | 9 ++++- base_user_role/models/user.py | 7 ++-- base_user_role/tests/test_user_role.py | 50 ++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/base_user_role/models/role.py b/base_user_role/models/role.py index facc82913..500863ee0 100644 --- a/base_user_role/models/role.py +++ b/base_user_role/models/role.py @@ -46,6 +46,13 @@ class ResUsersRole(models.Model): self.update_users() return res + @api.multi + def unlink(self): + users = self.mapped('user_ids') + res = super(ResUsersRole, self).unlink() + users.set_groups_from_roles(force=True) + return res + @api.multi def update_users(self): """Update all the users concerned by the roles identified by `ids`.""" @@ -91,5 +98,5 @@ class ResUsersRoleLine(models.Model): def unlink(self): users = self.mapped('user_id') res = super(ResUsersRoleLine, self).unlink() - users.set_groups_from_roles() + users.set_groups_from_roles(force=True) return res diff --git a/base_user_role/models/user.py b/base_user_role/models/user.py index 22a17a8eb..f1c406efc 100644 --- a/base_user_role/models/user.py +++ b/base_user_role/models/user.py @@ -32,12 +32,13 @@ class ResUsers(models.Model): return res @api.multi - def set_groups_from_roles(self): + def set_groups_from_roles(self, force=False): """Set (replace) the groups following the roles defined on users. - If no role is defined on the user, its groups are let untouched. + If no role is defined on the user, its groups are let untouched unless + the `force` parameter is `True`. """ for user in self: - if not user.role_line_ids: + if not user.role_line_ids and not force: continue group_ids = [] role_lines = user.role_line_ids.filtered( diff --git a/base_user_role/tests/test_user_role.py b/base_user_role/tests/test_user_role.py index 8c92373e4..1383a5f78 100644 --- a/base_user_role/tests/test_user_role.py +++ b/base_user_role/tests/test_user_role.py @@ -92,3 +92,53 @@ class TestUserRole(TransactionCase): role1_group_ids.append(self.role1_id.group_id.id) role_group_ids = sorted(set(role1_group_ids)) self.assertEqual(user_group_ids, role_group_ids) + + def test_role_unlink(self): + # Get role1 groups + role1 = self.role_model.browse(self.cr, self.uid, self.role1_id) + role1_group_ids = role1.implied_ids.ids + role1_group_ids.append(role1.group_id.id) + role1_group_ids = sorted(set(role1_group_ids)) + # Get role2 + role2 = self.role_model.browse(self.cr, self.uid, self.role2_id) + # Configure the user with role1 and role2 + self.user_model.write( + self.cr, self.uid, [self.user_id], + {'role_line_ids': [ + (0, 0, {'role_id': self.role1_id}), + (0, 0, {'role_id': self.role2_id}), + ]}) + user = self.user_model.browse(self.cr, self.uid, self.user_id) + # Remove role2 + role2.unlink() + user_group_ids = sorted(set([group.id for group in user.groups_id])) + self.assertEqual(user_group_ids, role1_group_ids) + # Remove role1 + role1.unlink() + user_group_ids = sorted(set([group.id for group in user.groups_id])) + self.assertEqual(user_group_ids, []) + + def test_role_line_unlink(self): + # Get role1 groups + role1 = self.role_model.browse(self.cr, self.uid, self.role1_id) + role1_group_ids = role1.implied_ids.ids + role1_group_ids.append(role1.group_id.id) + role1_group_ids = sorted(set(role1_group_ids)) + # Configure the user with role1 and role2 + self.user_model.write( + self.cr, self.uid, [self.user_id], + {'role_line_ids': [ + (0, 0, {'role_id': self.role1_id}), + (0, 0, {'role_id': self.role2_id}), + ]}) + user = self.user_model.browse(self.cr, self.uid, self.user_id) + # Remove role2 from the user + user.role_line_ids.filtered( + lambda l: l.role_id.id == self.role2_id).unlink() + user_group_ids = sorted(set([group.id for group in user.groups_id])) + self.assertEqual(user_group_ids, role1_group_ids) + # Remove role1 from the user + user.role_line_ids.filtered( + lambda l: l.role_id.id == self.role1_id).unlink() + user_group_ids = sorted(set([group.id for group in user.groups_id])) + self.assertEqual(user_group_ids, [])