diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py index 2cd55dfbf25..5b691798ff3 100644 --- a/odoo/addons/base/models/res_users.py +++ b/odoo/addons/base/models/res_users.py @@ -1147,19 +1147,23 @@ class UsersImplied(models.Model): return super(UsersImplied, self).create(vals_list) def write(self, values): + if not values.get('groups_id'): + return super(UsersImplied, self).write(values) users_before = self.filtered(lambda u: u.has_group('base.group_user')) res = super(UsersImplied, self).write(values) - if values.get('groups_id'): - # add implied groups for all users - for user in self: - if not user.has_group('base.group_user') and user in users_before: - # if we demoted a user, we strip him of all its previous privileges - # (but we should not do it if we are simply adding a technical group to a portal user) - vals = {'groups_id': [Command.clear()] + values['groups_id']} - super(UsersImplied, user).write(vals) - gs = set(concat(g.trans_implied_ids for g in user.groups_id)) - vals = {'groups_id': [Command.link(g.id) for g in gs]} - super(UsersImplied, user).write(vals) + demoted_users = users_before.filtered(lambda u: not u.has_group('base.group_user')) + if demoted_users: + # demoted users are restricted to the assigned groups only + vals = {'groups_id': [Command.clear()] + values['groups_id']} + super(UsersImplied, demoted_users).write(vals) + # add implied groups for all users (in batches) + users_batch = defaultdict(self.browse) + for user in self: + users_batch[user.groups_id] += user + for groups, users in users_batch.items(): + gs = set(concat(g.trans_implied_ids for g in groups)) + vals = {'groups_id': [Command.link(g.id) for g in gs]} + super(UsersImplied, users).write(vals) return res #