[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.
This commit is contained in:
Thibault Delavallée
2018-04-03 17:47:32 +02:00
parent 1eba78381d
commit ee64e8104c
+8 -43
View File
@@ -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