From 05fcef820400116673bebe88a841c3a6646328ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Fri, 6 Jun 2025 15:07:00 +0200 Subject: [PATCH] Support delete on cascade user roles Closes #14054 --- modules/user_role/res.py | 17 ++++++++++++++--- modules/user_role/tests/scenario_user_role.rst | 8 ++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/modules/user_role/res.py b/modules/user_role/res.py index 26cc50c85b..3ac6b39f88 100644 --- a/modules/user_role/res.py +++ b/modules/user_role/res.py @@ -22,6 +22,16 @@ class Role(ModelSQL, ModelView): users = {u.user for r in roles for u in r.users} User.sync_roles(User.browse(users)) + @classmethod + def on_delete(cls, roles): + pool = Pool() + User = pool.get('res.user') + callback = super().on_delete(roles) + if users := {u.user for r in roles for u in r.users}: + callback.append(lambda: User.sync_roles( + User.browse(users), clear=True)) + return callback + @classmethod def copy(cls, roles, default=None): default = default.copy() if default is not None else {} @@ -58,14 +68,14 @@ class User(metaclass=PoolMeta): cls.sync_roles(users) @classmethod - def sync_roles(cls, users=None, date=None): + def sync_roles(cls, users=None, date=None, clear=False): if date is None: date = dt.datetime.now() if users is None: users = cls.search([]) to_write = [] for user in users: - if not user.roles: + if not user.roles and not clear: continue new = {g.id for r in user.roles for g in r.role.groups if r.valid(date)} @@ -84,7 +94,8 @@ class UserRole(ModelSQL, ModelView): __name__ = 'res.user.role' user = fields.Many2One( 'res.user', "User", ondelete='CASCADE', required=True) - role = fields.Many2One('res.role', "Role", required=True) + role = fields.Many2One( + 'res.role', "Role", ondelete='CASCADE', required=True) from_date = fields.DateTime( "From Date", domain=[ diff --git a/modules/user_role/tests/scenario_user_role.rst b/modules/user_role/tests/scenario_user_role.rst index 0db5b5e395..92b2c658b4 100644 --- a/modules/user_role/tests/scenario_user_role.rst +++ b/modules/user_role/tests/scenario_user_role.rst @@ -86,3 +86,11 @@ Changing groups to role:: >>> user.reload() >>> len(user.groups) 3 + +Deleting role:: + + >>> role.delete() + + >>> user.reload() + >>> len(user.groups) + 0