diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 1bb62b0c50b628f96a9781382c6512132db0db89..adb6b9733aa901b1575436bf1da800379123da09 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -1113,9 +1113,9 @@ class Lead(models.Model): return [new_group] + groups @api.model - def message_get_reply_to(self, res_ids, default=None): + def _notify_get_reply_to(self, res_ids, default=None): leads = self.sudo().browse(res_ids) - aliases = self.env['crm.team'].message_get_reply_to(leads.mapped('team_id').ids, default=default) + aliases = self.env['crm.team']._notify_get_reply_to(leads.mapped('team_id').ids, default=default) return {lead.id: aliases.get(lead.team_id.id or 0, False) for lead in leads} @api.multi diff --git a/addons/hr_recruitment/models/hr_recruitment.py b/addons/hr_recruitment/models/hr_recruitment.py index 6d41a839f3654fae9f3e28838df1a07f9d7aec68..7437d4ab65ed71a38164c68becc0cff79bc7542c 100644 --- a/addons/hr_recruitment/models/hr_recruitment.py +++ b/addons/hr_recruitment/models/hr_recruitment.py @@ -336,10 +336,10 @@ class Applicant(models.Model): return super(Applicant, self)._track_subtype(init_values) @api.model - def message_get_reply_to(self, ids, default=None): + def _notify_get_reply_to(self, ids, default=None): """ Override to get the reply_to of the parent project. """ applicants = self.sudo().browse(ids) - aliases = self.env['hr.job'].message_get_reply_to(applicants.mapped('job_id').ids, default=default) + aliases = self.env['hr.job']._notify_get_reply_to(applicants.mapped('job_id').ids, default=default) return dict((applicant.id, aliases.get(applicant.job_id and applicant.job_id.id or 0, False)) for applicant in applicants) @api.multi diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py index fefa20c53c1df5fcb5bdea88d285ded206e23d6b..cde5924207daab78695135a52ff3909bf900df2b 100644 --- a/addons/mail/models/mail_channel.py +++ b/addons/mail/models/mail_channel.py @@ -197,15 +197,13 @@ class Channel(models.Model): return groups @api.multi - def message_get_email_values(self, notif_mail=None): + def _notify_specific_email_values(self, message): self.ensure_one() - res = super(Channel, self).message_get_email_values(notif_mail=notif_mail) - headers = {} - if res.get('headers'): - try: - headers.update(safe_eval(res['headers'])) - except Exception: - pass + res = super(Channel, self)._notify_specific_email_values(message) + try: + headers = safe_eval(res.get('headers', dict())) + except Exception: + headers = {} headers['Precedence'] = 'list' # avoid out-of-office replies from MS Exchange # http://blogs.technet.com/b/exchange/archive/2006/10/06/3395024.aspx @@ -229,14 +227,14 @@ class Channel(models.Model): return super(Channel, self).message_receive_bounce(email, partner, mail_id=mail_id) @api.multi - def message_get_recipient_values(self, notif_message=None, recipient_ids=None): + def _notify_email_recipients(self, message, recipient_ids): # real mailing list: multiple recipients (hidden by X-Forge-To) if self.alias_domain and self.alias_name: return { 'email_to': ','.join(formataddr((partner.name, partner.email)) for partner in self.env['res.partner'].sudo().browse(recipient_ids)), 'recipient_ids': [], } - return super(Channel, self).message_get_recipient_values(notif_message=notif_message, recipient_ids=recipient_ids) + return super(Channel, self)._notify_email_recipients(message, recipient_ids) @api.multi @api.returns('self', lambda value: value.id) diff --git a/addons/mail/models/mail_message.py b/addons/mail/models/mail_message.py index 1973c204b133a6ebde9c8cf5c91dd7907908b8fe..0f3665c4acb32756b194e5d6702013e40fd6eed3 100644 --- a/addons/mail/models/mail_message.py +++ b/addons/mail/models/mail_message.py @@ -699,14 +699,14 @@ class Message(models.Model): @api.model def _get_reply_to(self, values): """ Return a specific reply_to: alias of the document through - message_get_reply_to or take the email_from """ + _notify_get_reply_to or take the email_from """ model, res_id, email_from = values.get('model', self._context.get('default_model')), values.get('res_id', self._context.get('default_res_id')), values.get('email_from') # ctx values / defualt_get res ? - if model and hasattr(self.env[model], 'message_get_reply_to'): - # return self.env[model].browse(res_id).message_get_reply_to([res_id], default=email_from)[res_id] - return self.env[model].message_get_reply_to([res_id], default=email_from)[res_id] + if model and hasattr(self.env[model], '_notify_get_reply_to'): + # return self.env[model].browse(res_id)._notify_get_reply_to([res_id], default=email_from)[res_id] + return self.env[model]._notify_get_reply_to([res_id], default=email_from)[res_id] else: - # return self.env['mail.thread'].message_get_reply_to(default=email_from)[None] - return self.env['mail.thread'].message_get_reply_to([None], default=email_from)[None] + # return self.env['mail.thread']._notify_get_reply_to(default=email_from)[None] + return self.env['mail.thread']._notify_get_reply_to([None], default=email_from)[None] @api.model def _get_message_id(self, values): diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py index 1473953a91b1cd9c734e35bf4f8d79cbd7f5b48f..dd2c40965f0dbed42a2ccba797d23ff5200203e9 100644 --- a/addons/mail/models/mail_thread.py +++ b/addons/mail/models/mail_thread.py @@ -661,7 +661,7 @@ class MailThread(models.AbstractModel): return groups @api.multi - def _message_notification_recipients(self, message, recipients): + def _notify_classify_recipients(self, message, recipients): # At this point, all access rights should be ok. We sudo everything to # access rights checks and speedup the computation. result = {} @@ -709,7 +709,7 @@ class MailThread(models.AbstractModel): return result @api.model - def message_get_reply_to(self, res_ids, default=None): + def _notify_get_reply_to(self, res_ids, default=None): """ Returns the preferred reply-to email address that is basically the alias of the document, if it exists. Override this method to implement a custom behavior about reply-to for generated emails. """ @@ -752,9 +752,12 @@ class MailThread(models.AbstractModel): return res @api.multi - def message_get_email_values(self, notif_mail=None): + def _notify_specific_email_values(self, message): """ Get specific notification email values to store on the notification - mail_mail. Void method, inherit it to add custom values. """ + mail.mail. Override to add values related to a specific model. + + :param MailMessage message: mail.message record being notified by email + """ self.ensure_one() database_uuid = self.env['ir.config_parameter'].sudo().get_param('database.uuid') return {'headers': repr({ @@ -763,12 +766,15 @@ class MailThread(models.AbstractModel): })} @api.multi - def message_get_recipient_values(self, notif_message=None, recipient_ids=None): - """ Get specific notification recipient values to store on the notification - mail_mail. Basic method just set the recipient partners as mail_mail - recipients. Inherit this method to add custom behavior like using - recipient email_to to bypass the recipint_ids heuristics in the - mail sending mechanism. """ + def _notify_email_recipients(self, message, recipient_ids): + """ Format email notification recipient values to store on the notification + mail.mail. Basic method just set the recipient partners as mail_mail + recipients. Override to generate other mail values like email_to or + email_cc. + + :param MailMessage message: mail.message record being notified by email + :param list recipient_ids: list of res.partner ids to notify + """ return { 'recipient_ids': [(4, pid) for pid in recipient_ids] } diff --git a/addons/mail/models/res_partner.py b/addons/mail/models/res_partner.py index 7f9149a92553205590d702280661d17b9d2d65a6..8004b653e50b0c44125e2c3eddbb11963ca44b41 100644 --- a/addons/mail/models/res_partner.py +++ b/addons/mail/models/res_partner.py @@ -98,8 +98,8 @@ class Partner(models.Model): # custom values custom_values = dict() - if message.res_id and message.model in self.env and hasattr(self.env[message.model], 'message_get_email_values'): - custom_values = self.env[message.model].browse(message.res_id).message_get_email_values(message) + if message.res_id and message.model in self.env and hasattr(self.env[message.model], '_notify_specific_email_values'): + custom_values = self.env[message.model].browse(message.res_id)._notify_specific_email_values(message) mail_values = { 'mail_message_id': message.id, @@ -120,11 +120,11 @@ class Partner(models.Model): # cache so should not impact performances. mail_message_id = mail_values.get('mail_message_id') message = self.env['mail.message'].browse(mail_message_id) if mail_message_id else None - if message and message.model and message.res_id and message.model in self.env and hasattr(self.env[message.model], 'message_get_recipient_values'): + if message and message.model and message.res_id and message.model in self.env and hasattr(self.env[message.model], '_notify_email_recipients'): tig = self.env[message.model].browse(message.res_id) - recipient_values = tig.message_get_recipient_values(notif_message=message, recipient_ids=email_chunk) + recipient_values = tig._notify_email_recipients(message, email_chunk) else: - recipient_values = self.env['mail.thread'].message_get_recipient_values(notif_message=None, recipient_ids=email_chunk) + recipient_values = self.env['mail.thread']._notify_email_recipients(message, email_chunk) create_values = { 'body_html': body, 'subject': subject, @@ -177,10 +177,10 @@ class Partner(models.Model): base_mail_values = self._notify_prepare_email_values(message) # classify recipients: actions / no action - if message.model and message.res_id and hasattr(self.env[message.model], '_message_notification_recipients'): - recipients = self.env[message.model].browse(message.res_id)._message_notification_recipients(message, self) + if message.model and message.res_id and hasattr(self.env[message.model], '_notify_classify_recipients'): + recipients = self.env[message.model].browse(message.res_id)._notify_classify_recipients(message, self) else: - recipients = self.env['mail.thread']._message_notification_recipients(message, self) + recipients = self.env['mail.thread']._notify_classify_recipients(message, self) emails = self.env['mail.mail'] recipients_nbr, recipients_max = 0, 50 diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index db46e76d5c8ad1daaae650f59145557fa367e5d4..de83584f282a2abcebb4f1745466a537eed1d28c 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -277,8 +277,8 @@ class MailComposer(models.TransientModel): # compute alias-based reply-to in batch reply_to_value = dict.fromkeys(res_ids, None) if mass_mail_mode and not self.no_auto_thread: - # reply_to_value = self.env['mail.thread'].with_context(thread_model=self.model).browse(res_ids).message_get_reply_to(default=self.email_from) - reply_to_value = self.env['mail.thread'].with_context(thread_model=self.model).message_get_reply_to(res_ids, default=self.email_from) + # reply_to_value = self.env['mail.thread'].with_context(thread_model=self.model).browse(res_ids)._notify_get_reply_to(default=self.email_from) + reply_to_value = self.env['mail.thread'].with_context(thread_model=self.model)._notify_get_reply_to(res_ids, default=self.email_from) for res_id in res_ids: # static wizard (mail.message) values @@ -298,8 +298,8 @@ class MailComposer(models.TransientModel): # mass mailing: rendering override wizard static values if mass_mail_mode and self.model: - if self.model in self.env and hasattr(self.env[self.model], 'message_get_email_values'): - mail_values.update(self.env[self.model].browse(res_id).message_get_email_values()) + if self.model in self.env and hasattr(self.env[self.model], '_notify_specific_email_values'): + mail_values.update(self.env[self.model].browse(res_id)._notify_specific_email_values(False)) # keep a copy unless specifically requested, reset record name (avoid browsing records) mail_values.update(notification=not self.auto_delete_message, model=self.model, res_id=res_id, record_name=False) # auto deletion of mail_mail diff --git a/addons/project/models/project.py b/addons/project/models/project.py index 34a3e5b5fa52fbc91e62b7995a39b8fb747f896c..90630570b58a344b2dd13c272bf5db2854eeb1c1 100644 --- a/addons/project/models/project.py +++ b/addons/project/models/project.py @@ -888,11 +888,11 @@ class Task(models.Model): return groups @api.model - def message_get_reply_to(self, res_ids, default=None): + def _notify_get_reply_to(self, res_ids, default=None): """ Override to get the reply_to of the parent project. """ tasks = self.sudo().browse(res_ids) project_ids = tasks.mapped('project_id').ids - aliases = self.env['project.project'].message_get_reply_to(project_ids, default=default) + aliases = self.env['project.project']._notify_get_reply_to(project_ids, default=default) return {task.id: aliases.get(task.project_id.id, False) for task in tasks} @api.multi @@ -968,14 +968,12 @@ class Task(models.Model): return recipients @api.multi - def message_get_email_values(self, notif_mail=None): - res = super(Task, self).message_get_email_values(notif_mail=notif_mail) - headers = {} - if res.get('headers'): - try: - headers.update(safe_eval(res['headers'])) - except Exception: - pass + def _notify_specific_email_values(self, message): + res = super(Task, self)._notify_specific_email_values(message) + try: + headers = safe_eval(res.get('headers', dict())) + except Exception: + headers = {} if self.project_id: current_objects = [h for h in headers.get('X-Odoo-Objects', '').split(',') if h] current_objects.insert(0, 'project.project-%s, ' % self.project_id.id) diff --git a/addons/website_mail_channel/models/mail_channel.py b/addons/website_mail_channel/models/mail_channel.py index f0b0f3665e256c3037a2bac995c07397e811f354..49d9139ec6940e622df9d240b70ebb5db3dd3267 100644 --- a/addons/website_mail_channel/models/mail_channel.py +++ b/addons/website_mail_channel/models/mail_channel.py @@ -14,21 +14,17 @@ class MailGroup(models.Model): _inherit = 'mail.channel' @api.multi - def message_get_email_values(self, notif_mail=None): + def _notify_specific_email_values(self, message): self.ensure_one() - res = super(MailGroup, self).message_get_email_values(notif_mail=notif_mail) + res = super(MailGroup, self)._notify_specific_email_values(message) + try: + headers = safe_eval(res.get('headers', dict())) + except Exception: + headers = {} base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') - headers = {} - if res.get('headers'): - try: - headers = safe_eval(res['headers']) - except Exception: - pass - headers.update({ - 'List-Archive': '<%s/groups/%s>' % (base_url, slug(self)), - 'List-Subscribe': '<%s/groups>' % (base_url), - 'List-Unsubscribe': '<%s/groups?unsubscribe>' % (base_url,), - }) + headers['List-Archive'] = '<%s/groups/%s>' % (base_url, slug(self)), + headers['List-Subscribe'] = '<%s/groups>' % (base_url), + headers['List-Unsubscribe'] = '<%s/groups?unsubscribe>' % (base_url,), res['headers'] = repr(headers) return res