This commit refactors mail.thread message_subscribe method. It is done for two purposes. First one is to optimize performance by using the new followers computation methods introduced recently. Second purpose is to clean the API of message_subscribe to make it simpler to use. This commit splits message_subscribe in two main parts : * _message_subscribe is a private method calling the follower new subscription methods and updating the record set; * message_subscribe is a public wrapper on _message_subscribe that adds access rights checks; Simplification comes by removing message_subscribe_users that was a shortcut to message_subscribe. Having a method to subscribe partners and channels is sufficient as we would like to avoid bloating the public API of mail.thread. A force parameter is also removed from message_subscribe as this implementation detail can be induced in the computation. Various addons using the removed methods are updated in order to use the new subscription API. They have the same functional behavior. This commit has a great impact when subscribing several followers. In a more general way all code using message_post is also optimized as posting a message generally implies subscribing followers. It also improves activity use as posting a message and subscribing new followers are common process in activities.
134 lines
6.0 KiB
Python
134 lines
6.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo import api, fields, models, tools
|
|
|
|
|
|
class MaintenanceEquipment(models.Model):
|
|
_inherit = 'maintenance.equipment'
|
|
|
|
employee_id = fields.Many2one('hr.employee', string='Assigned to Employee', track_visibility='onchange')
|
|
department_id = fields.Many2one('hr.department', string='Assigned to Department', track_visibility='onchange')
|
|
equipment_assign_to = fields.Selection(
|
|
[('department', 'Department'), ('employee', 'Employee') ,('other', 'Other')],
|
|
string='Used By',
|
|
required=True,
|
|
default='employee')
|
|
owner_user_id = fields.Many2one(compute='_compute_owner', store=True)
|
|
|
|
@api.one
|
|
@api.depends('employee_id', 'department_id', 'equipment_assign_to')
|
|
def _compute_owner(self):
|
|
self.owner_user_id = self.env.user.id
|
|
if self.equipment_assign_to == 'employee':
|
|
self.owner_user_id = self.employee_id.user_id.id
|
|
elif self.equipment_assign_to == 'department':
|
|
self.owner_user_id = self.department_id.manager_id.user_id.id
|
|
|
|
@api.onchange('equipment_assign_to')
|
|
def _onchange_equipment_assign_to(self):
|
|
if self.equipment_assign_to == 'employee':
|
|
self.department_id = False
|
|
if self.equipment_assign_to == 'department':
|
|
self.employee_id = False
|
|
self.assign_date = fields.Date.context_today(self)
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
equipment = super(MaintenanceEquipment, self).create(vals)
|
|
# subscribe employee or department manager when equipment assign to him.
|
|
partner_ids = []
|
|
if equipment.employee_id and equipment.employee_id.user_id:
|
|
partner_ids.append(equipment.employee_id.user_id.partner_id.id)
|
|
if equipment.department_id and equipment.department_id.manager_id and equipment.department_id.manager_id.user_id:
|
|
partner_ids.append(equipment.department_id.manager_id.user_id.partner_id.id)
|
|
if partner_ids:
|
|
equipment.message_subscribe(partner_ids=partner_ids)
|
|
return equipment
|
|
|
|
@api.multi
|
|
def write(self, vals):
|
|
partner_ids = []
|
|
# subscribe employee or department manager when equipment assign to employee or department.
|
|
if vals.get('employee_id'):
|
|
user_id = self.env['hr.employee'].browse(vals['employee_id'])['user_id']
|
|
if user_id:
|
|
partner_ids.append(user_id.partner_id.id)
|
|
if vals.get('department_id'):
|
|
department = self.env['hr.department'].browse(vals['department_id'])
|
|
if department and department.manager_id and department.manager_id.user_id:
|
|
partner_ids.append(department.manager_id.user_id.partner_id.id)
|
|
if partner_ids:
|
|
self.message_subscribe(partner_ids=partner_ids)
|
|
return super(MaintenanceEquipment, self).write(vals)
|
|
|
|
@api.multi
|
|
def _track_subtype(self, init_values):
|
|
self.ensure_one()
|
|
if ('employee_id' in init_values and self.employee_id) or ('department_id' in init_values and self.department_id):
|
|
return 'maintenance.mt_mat_assign'
|
|
return super(MaintenanceEquipment, self)._track_subtype(init_values)
|
|
|
|
|
|
class MaintenanceRequest(models.Model):
|
|
_inherit = 'maintenance.request'
|
|
|
|
@api.returns('self')
|
|
def _default_employee_get(self):
|
|
return self.env['hr.employee'].search([('user_id', '=', self.env.uid)], limit=1)
|
|
|
|
employee_id = fields.Many2one('hr.employee', string='Employee', default=_default_employee_get)
|
|
department_id = fields.Many2one('hr.department', string='Department')
|
|
owner_user_id = fields.Many2one(compute='_compute_owner', store=True)
|
|
|
|
@api.depends('employee_id', 'department_id')
|
|
def _compute_owner(self):
|
|
if self.equipment_id.equipment_assign_to == 'employee':
|
|
self.owner_user_id = self.employee_id.user_id.id
|
|
elif self.equipment_id.equipment_assign_to == 'department':
|
|
self.owner_user_id = self.department_id.manager_id.user_id.id
|
|
|
|
@api.onchange('employee_id', 'department_id')
|
|
def onchange_department_or_employee_id(self):
|
|
domain = []
|
|
if self.department_id:
|
|
domain = [('department_id', '=', self.department_id.id)]
|
|
if self.employee_id and self.department_id:
|
|
domain = ['|'] + domain
|
|
if self.employee_id:
|
|
domain = domain + ['|', ('employee_id', '=', self.employee_id.id), ('employee_id', '=', None)]
|
|
equipment = self.env['maintenance.equipment'].search(domain, limit=2)
|
|
if len(equipment) == 1:
|
|
self.equipment_id = equipment
|
|
return {'domain': {'equipment_id': domain}}
|
|
|
|
@api.model
|
|
def create(self, vals):
|
|
result = super(MaintenanceRequest, self).create(vals)
|
|
if result.employee_id.user_id:
|
|
result.message_subscribe(partner_ids=[result.employee_id.user_id.partner_id.id])
|
|
return result
|
|
|
|
@api.multi
|
|
def write(self, vals):
|
|
if vals.get('employee_id'):
|
|
employee = self.env['hr.employee'].browse(vals['employee_id'])
|
|
if employee and employee.user_id:
|
|
self.message_subscribe(partner_ids=[employee.user_id.partner_id.id])
|
|
return super(MaintenanceRequest, self).write(vals)
|
|
|
|
@api.model
|
|
def message_new(self, msg, custom_values=None):
|
|
""" Overrides mail_thread message_new that is called by the mailgateway
|
|
through message_process.
|
|
This override updates the document according to the email.
|
|
"""
|
|
if custom_values is None:
|
|
custom_values = {}
|
|
email = tools.email_split(msg.get('from')) and tools.email_split(msg.get('from'))[0] or False
|
|
user = self.env['res.users'].search([('login', '=', email)], limit=1)
|
|
if user:
|
|
employee = self.env['hr.employee'].search([('user_id', '=', user.id)], limit=1)
|
|
if employee:
|
|
custom_values['employee_id'] = employee and employee[0].id
|
|
return super(MaintenanceRequest, self).message_new(msg, custom_values=custom_values)
|