From ee64e8104c63e4dd408d7ffaa5e51ad29b330044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 2 Mar 2018 16:05:57 +0100 Subject: [PATCH] [REF] hr_expense: use new implementation for auto subscription Expense report has custom code to add people as followers. This code has several issues, notably in some cases it could try to add several times same people, leading to crash and issues. As auto subscription has been cleaned let us clean the code in hr expense. Using _message_auto_subscribe_followers it is now simpler to automatically add follower to expense reports. It is not necessary to add hackish custom code in create and write. One change is done in this commit. Some people are set as follower after record creation and not before. However this was necessary when tracking messages were not correctly triggered or auto subscription done after tracking. As process is now 1/ create 2/ auto subscribe 3/ tracking, messages linked to tracking will be correctly push to recipients automatically added as followers. --- addons/hr_expense/models/hr_expense.py | 51 ++++---------------------- 1 file changed, 8 insertions(+), 43 deletions(-) diff --git a/addons/hr_expense/models/hr_expense.py b/addons/hr_expense/models/hr_expense.py index 5519ca8a888..cc827d6fce7 100644 --- a/addons/hr_expense/models/hr_expense.py +++ b/addons/hr_expense/models/hr_expense.py @@ -527,18 +527,10 @@ class HrExpenseSheet(models.Model): @api.model def create(self, vals): - self._create_set_followers(vals) sheet = super(HrExpenseSheet, self).create(vals) sheet.activity_update() return sheet - @api.multi - def write(self, vals): - res = super(HrExpenseSheet, self).write(vals) - if vals.get('employee_id'): - self._add_followers() - return res - @api.multi def unlink(self): for expense in self: @@ -561,41 +553,14 @@ class HrExpenseSheet(models.Model): return 'hr_expense.mt_expense_paid' return super(HrExpenseSheet, self)._track_subtype(init_values) - def _get_users_to_subscribe(self, employee=False): - users = self.env['res.users'] - employee = employee or self.employee_id - if employee.user_id: - users |= employee.user_id - if employee.parent_id: - users |= employee.parent_id.user_id - if employee.department_id and employee.department_id.manager_id and employee.parent_id != employee.department_id.manager_id: - users |= employee.department_id.manager_id.user_id - return users - - def _add_followers(self): - users = self._get_users_to_subscribe() - self.message_subscribe(partner_ids=users.mapped('partner_id').ids) - - @api.model - def _create_set_followers(self, values): - # Add the followers at creation, so they can be notified - employee_id = values.get('employee_id') - if not employee_id: - return - - employee = self.env['hr.employee'].browse(employee_id) - users = self._get_users_to_subscribe(employee=employee) - self.env.user - values['message_follower_ids'] = [] - MailFollowers = self.env['mail.followers'] - for partner in users.mapped('partner_id'): - values['message_follower_ids'] += MailFollowers._add_follower_command(self._name, [], {partner.id: None}, {})[0] - - if values.get('user_id') and values.get('user_id') != employee.user_id.id and values.get('user_id') != self.env.uid: - resp_partner = self.env['res.users'].browse(values['user_id']) - # Parsing ORM command to avoid adding several times the same partner - # TDE note: a better implementation should come in saas 11.3 or 11.4, allowing to normally remove that code - if resp_partner.partner_id.id not in (x[2].get('partner_id') for x in values['message_follower_ids'] if len(x) == 3): - values['message_follower_ids'] += MailFollowers._add_follower_command(self._name, [], {resp_partner.partner_id.id: None}, {})[0] + def _message_auto_subscribe_followers(self, updated_values, subtype_ids): + res = super(HrExpenseSheet, self)._message_auto_subscribe_followers(updated_values, subtype_ids) + if updated_values.get('employee_id'): + employee = self.env['hr.employee'].browse(updated_values['employee_id']) + users = employee.user_id | employee.parent_id.user_id | employee.department_id.manager_id.user_id + for pid in users.mapped('partner_id').ids: + res.append((pid, subtype_ids, False)) + return res # -------------------------------------------- # Actions