[IMP] mail: added headers field on mail.mail, allowing to store headers data when sending notification emails.

This commit is contained in:
Thibault Delavallée 2014-06-20 16:34:27 +02:00
parent e862ff7033
commit f62f58174b
6 changed files with 47 additions and 42 deletions

View File

@ -175,6 +175,11 @@ class mail_notification(osv.Model):
# compute email references # compute email references
references = message.parent_id.message_id if message.parent_id else False references = message.parent_id.message_id if message.parent_id else False
# custom values
custom_values = dict()
if message.model and message.res_id and self.pool.get(message.model) and hasattr(self.pool[message.model], 'message_get_email_values'):
custom_values = self.pool[message.model].message_get_email_values(cr, uid, message.res_id, message, context=context)
# create email values # create email values
max_recipients = 50 max_recipients = 50
chunks = [email_pids[x:x + max_recipients] for x in xrange(0, len(email_pids), max_recipients)] chunks = [email_pids[x:x + max_recipients] for x in xrange(0, len(email_pids), max_recipients)]
@ -187,6 +192,7 @@ class mail_notification(osv.Model):
'recipient_ids': [(4, id) for id in chunk], 'recipient_ids': [(4, id) for id in chunk],
'references': references, 'references': references,
} }
mail_values.update(custom_values)
email_ids.append(self.pool.get('mail.mail').create(cr, uid, mail_values, context=context)) email_ids.append(self.pool.get('mail.mail').create(cr, uid, mail_values, context=context))
if force_send and len(chunks) < 2: # for more than 50 followers, use the queue system if force_send and len(chunks) < 2: # for more than 50 followers, use the queue system
self.pool.get('mail.mail').send(cr, uid, email_ids, context=context) self.pool.get('mail.mail').send(cr, uid, email_ids, context=context)

View File

@ -23,6 +23,7 @@ import openerp
import openerp.tools as tools import openerp.tools as tools
from openerp.osv import osv from openerp.osv import osv
from openerp.osv import fields from openerp.osv import fields
from openerp.tools.safe_eval import safe_eval as eval
from openerp import SUPERUSER_ID from openerp import SUPERUSER_ID
@ -215,12 +216,13 @@ class mail_group(osv.Model):
def message_get_email_values(self, cr, uid, id, notif_mail=None, context=None): def message_get_email_values(self, cr, uid, id, notif_mail=None, context=None):
res = super(mail_group, self).message_get_email_values(cr, uid, id, notif_mail=notif_mail, context=context) res = super(mail_group, self).message_get_email_values(cr, uid, id, notif_mail=notif_mail, context=context)
group = self.browse(cr, uid, id, context=context) group = self.browse(cr, uid, id, context=context)
res.update({ try:
'headers': { headers = eval(res.get('headers', '{}'))
'Precedence': 'list', except Exception:
} headers = {}
}) headers['Precedence'] = 'list'
if group.alias_domain: if group.alias_domain and group.alias_name:
res['headers']['List-Id'] = '%s.%s' % (group.alias_name, group.alias_domain) headers['List-Id'] = '%s.%s' % (group.alias_name, group.alias_domain)
res['headers']['List-Post'] = '<mailto:%s@%s>' % (group.alias_name, group.alias_domain) headers['List-Post'] = '<mailto:%s@%s>' % (group.alias_name, group.alias_domain)
res['headers'] = '%s' % headers
return res return res

View File

@ -22,13 +22,13 @@
import base64 import base64
import logging import logging
import re import re
from urllib import urlencode
from urlparse import urljoin from urlparse import urljoin
from openerp import tools from openerp import tools
from openerp import SUPERUSER_ID from openerp import SUPERUSER_ID
from openerp.addons.base.ir.ir_mail_server import MailDeliveryException from openerp.addons.base.ir.ir_mail_server import MailDeliveryException
from openerp.osv import fields, osv from openerp.osv import fields, osv
from openerp.tools.safe_eval import safe_eval as eval
from openerp.tools.translate import _ from openerp.tools.translate import _
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -59,6 +59,7 @@ class mail_mail(osv.Model):
'recipient_ids': fields.many2many('res.partner', string='To (Partners)'), 'recipient_ids': fields.many2many('res.partner', string='To (Partners)'),
'email_cc': fields.char('Cc', help='Carbon copy message recipients'), 'email_cc': fields.char('Cc', help='Carbon copy message recipients'),
'body_html': fields.text('Rich-text Contents', help="Rich-text/HTML message"), 'body_html': fields.text('Rich-text Contents', help="Rich-text/HTML message"),
'headers': fields.text('Headers'),
# Auto-detected based on create() - if 'mail_message_id' was passed then this mail is a notification # Auto-detected based on create() - if 'mail_message_id' was passed then this mail is a notification
# and during unlink() we will not cascade delete the parent and its attachments # and during unlink() we will not cascade delete the parent and its attachments
'notification': fields.boolean('Is Notification', 'notification': fields.boolean('Is Notification',
@ -67,6 +68,7 @@ class mail_mail(osv.Model):
_defaults = { _defaults = {
'state': 'outgoing', 'state': 'outgoing',
'headers': '{}',
} }
def default_get(self, cr, uid, fields, context=None): def default_get(self, cr, uid, fields, context=None):
@ -210,8 +212,6 @@ class mail_mail(osv.Model):
'subject': self.send_get_mail_subject(cr, uid, mail, partner=partner, context=context), 'subject': self.send_get_mail_subject(cr, uid, mail, partner=partner, context=context),
'email_to': self.send_get_mail_to(cr, uid, mail, partner=partner, context=context), 'email_to': self.send_get_mail_to(cr, uid, mail, partner=partner, context=context),
} }
if mail.model and mail.res_id and self.pool.get(mail.model) and hasattr(self.pool[mail.model], 'message_get_email_values'):
res.update(self.pool[mail.model].message_get_email_values(cr, uid, mail.res_id, mail, context=context))
return res return res
def send(self, cr, uid, ids, auto_commit=False, raise_exception=False, context=None): def send(self, cr, uid, ids, auto_commit=False, raise_exception=False, context=None):
@ -267,13 +267,15 @@ class mail_mail(osv.Model):
headers['Return-Path'] = '%s-%d-%s-%d@%s' % (bounce_alias, mail.id, mail.model, mail.res_id, catchall_domain) headers['Return-Path'] = '%s-%d-%s-%d@%s' % (bounce_alias, mail.id, mail.model, mail.res_id, catchall_domain)
else: else:
headers['Return-Path'] = '%s-%d@%s' % (bounce_alias, mail.id, catchall_domain) headers['Return-Path'] = '%s-%d@%s' % (bounce_alias, mail.id, catchall_domain)
if mail.headers:
try:
headers.update(eval(mail.headers))
except Exception:
pass
# build an RFC2822 email.message.Message object and send it without queuing # build an RFC2822 email.message.Message object and send it without queuing
res = None res = None
for email in email_list: for email in email_list:
email_headers = dict(headers)
if email.get('headers'):
email_headers.update(email['headers'])
msg = ir_mail_server.build_email( msg = ir_mail_server.build_email(
email_from=mail.email_from, email_from=mail.email_from,
email_to=email.get('email_to'), email_to=email.get('email_to'),
@ -288,7 +290,7 @@ class mail_mail(osv.Model):
object_id=mail.res_id and ('%s-%s' % (mail.res_id, mail.model)), object_id=mail.res_id and ('%s-%s' % (mail.res_id, mail.model)),
subtype='html', subtype='html',
subtype_alternative='plain', subtype_alternative='plain',
headers=email_headers) headers=headers)
res = ir_mail_server.send_email(cr, uid, msg, res = ir_mail_server.send_email(cr, uid, msg,
mail_server_id=mail.mail_server_id.id, mail_server_id=mail.mail_server_id.id,
context=context) context=context)

View File

@ -34,26 +34,19 @@
</page> </page>
<page string="Advanced" groups="base.group_no_one"> <page string="Advanced" groups="base.group_no_one">
<group> <group>
<div> <group string="Status">
<group string="Status"> <field name="auto_delete"/>
<field name="auto_delete"/> <field name="notification"/>
<field name="notification"/> <field name="type"/>
<field name="type"/> <field name="mail_server_id"/>
<field name="mail_server_id"/> <field name="model"/>
<field name="model"/> <field name="res_id"/>
<field name="res_id"/> </group>
</group> <group string="Headers">
</div> <field name="message_id"/>
<div> <field name="references"/>
<group string="Headers"> <field name="headers"/>
<field name="message_id"/> </group>
<field name="references"/>
</group>
<group string="Recipients">
<field name="partner_ids" widget="many2many_tags"/>
<field name="notified_partner_ids" widget="many2many_tags"/>
</group>
</div>
</group> </group>
</page> </page>
<page string="Attachments"> <page string="Attachments">

View File

@ -698,12 +698,8 @@ class mail_thread(osv.AbstractModel):
for record in self.browse(cr, SUPERUSER_ID, ids, context=context)] for record in self.browse(cr, SUPERUSER_ID, ids, context=context)]
def message_get_email_values(self, cr, uid, id, notif_mail=None, context=None): def message_get_email_values(self, cr, uid, id, notif_mail=None, context=None):
""" Temporary method to create custom notification email values for a given """ Get specific notification email values to store on the notification
model and document. This should be better to have a headers field on mail_mail. Void method, inherit it to add custom values. """
the mail.mail model, computed when creating the notification email, but
this cannot be done in a stable version.
TDE FIXME: rethink this ulgy thing. """
res = dict() res = dict()
return res return res

View File

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from openerp.osv import osv from openerp.osv import osv
from openerp.tools.safe_eval import safe_eval as eval
class MailGroup(osv.Model): class MailGroup(osv.Model):
@ -10,9 +11,14 @@ class MailGroup(osv.Model):
res = super(MailGroup, self).message_get_email_values(cr, uid, id, notif_mail=notif_mail, context=context) res = super(MailGroup, self).message_get_email_values(cr, uid, id, notif_mail=notif_mail, context=context)
group = self.browse(cr, uid, id, context=context) group = self.browse(cr, uid, id, context=context)
base_url = self.pool['ir.config_parameter'].get_param(cr, uid, 'web.base.url') base_url = self.pool['ir.config_parameter'].get_param(cr, uid, 'web.base.url')
res['headers'].update({ try:
headers = eval(res.get('headers', '{}'))
except Exception:
headers = {}
headers.update({
'List-Archive': '<%s/groups/%s>' % (base_url, group.id), 'List-Archive': '<%s/groups/%s>' % (base_url, group.id),
'List-Subscribe': '<%s/groups>' % (base_url), 'List-Subscribe': '<%s/groups>' % (base_url),
'List-Unsubscribe': '<%s/groups>' % (base_url), 'List-Unsubscribe': '<%s/groups>' % (base_url),
}) })
res['headers'] = '%s' % headers
return res return res