From 8e682dd591cfd426d1feecca4cbd600de3460fb8 Mon Sep 17 00:00:00 2001 From: Yannick Tivisse Date: Tue, 22 Feb 2022 13:58:48 +0000 Subject: [PATCH] [FW][FIX] hr_holidays/hr_recruitment: Write correclty on groups Purpose ======= This is the optimal way to add a user on a group, to avoid calling the contraint method _check_one_user_type on all the users from the group closes odoo/odoo#87998 Related: odoo/enterprise#25908 Signed-off-by: Yannick Tivisse (yti) --- addons/hr_holidays/models/hr_employee.py | 7 ++++--- addons/hr_recruitment/models/res_users.py | 13 +++++-------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/addons/hr_holidays/models/hr_employee.py b/addons/hr_holidays/models/hr_employee.py index d934e60a957..f03ec41a028 100644 --- a/addons/hr_holidays/models/hr_employee.py +++ b/addons/hr_holidays/models/hr_employee.py @@ -209,10 +209,11 @@ class HrEmployeeBase(models.AbstractModel): if 'leave_manager_id' in values: old_managers = self.mapped('leave_manager_id') if values['leave_manager_id']: - old_managers -= self.env['res.users'].browse(values['leave_manager_id']) + leave_manager = self.env['res.users'].browse(values['leave_manager_id']) + old_managers -= leave_manager approver_group = self.env.ref('hr_holidays.group_hr_holidays_responsible', raise_if_not_found=False) - if approver_group: - approver_group.sudo().write({'users': [(4, values['leave_manager_id'])]}) + if approver_group and not leave_manager.has_group('hr_holidays.group_hr_holidays_responsible'): + leave_manager.sudo().write({'groups_id': [(4, approver_group.id)]}) res = super(HrEmployeeBase, self).write(values) # remove users from the Responsible group if they are no longer leave managers diff --git a/addons/hr_recruitment/models/res_users.py b/addons/hr_recruitment/models/res_users.py index 77b1ae5cd2b..92e5601f937 100644 --- a/addons/hr_recruitment/models/res_users.py +++ b/addons/hr_recruitment/models/res_users.py @@ -12,10 +12,9 @@ class ResUsers(models.Model): interviewer_group = self.env.ref('hr_recruitment.group_hr_recruitment_interviewer') recruitment_group = self.env.ref('hr_recruitment.group_hr_recruitment_user') - interviewer_group.sudo().write({ - 'users': [ - (4, user.id) for user in self - recruitment_group.users - ] + interviewers = self - recruitment_group.users + interviewers.sudo().write({ + 'groups_id': [(4, interviewer_group.id)] }) def _remove_recruitment_interviewers(self): @@ -32,8 +31,6 @@ class ResUsers(models.Model): # Remove users that are no longer interviewers on at least a job or an application users_to_remove = set(self.ids) - (user_ids | set(recruitment_group.users.ids)) - interviewer_group.sudo().write({ - 'users': [ - (3, user_id) for user_id in users_to_remove - ] + self.env['res.users'].browse(users_to_remove).sudo().write({ + 'groups_id': [(3, interviewer_group.id)] })