Support delete on cascade user roles

Closes #14054
This commit is contained in:
Cédric Krier
2025-06-06 15:07:00 +02:00
parent a60dee6c84
commit 05fcef8204
2 changed files with 22 additions and 3 deletions
+14 -3
View File
@@ -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=[
@@ -86,3 +86,11 @@ Changing groups to role::
>>> user.reload()
>>> len(user.groups)
3
Deleting role::
>>> role.delete()
>>> user.reload()
>>> len(user.groups)
0