diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py
index 1554caf3d3c..87f8c9ce7ef 100644
--- a/addons/mail/mail_mail.py
+++ b/addons/mail/mail_mail.py
@@ -126,7 +126,7 @@ class mail_mail(osv.Model):
_logger.exception("Failed processing mail queue")
return res
- def _postprocess_sent_message(self, cr, uid, mail, context=None):
+ def _postprocess_sent_message(self, cr, uid, mail, context=None, mail_sent=True):
"""Perform any post-processing necessary after sending ``mail``
successfully, including deleting it completely along with its
attachment if the ``auto_delete`` flag of the mail was set.
@@ -295,7 +295,7 @@ class mail_mail(osv.Model):
# /!\ can't use mail.state here, as mail.refresh() will cause an error
# see revid:odo@openerp.com-20120622152536-42b2s28lvdv3odyr in 6.1
if mail_sent:
- self._postprocess_sent_message(cr, uid, mail, context=context)
+ self._postprocess_sent_message(cr, uid, mail, context=context, mail_sent=mail_sent)
except Exception as e:
_logger.exception('failed sending mail.mail %s', mail.id)
mail.write({'state': 'exception'})
diff --git a/addons/mass_mailing/__openerp__.py b/addons/mass_mailing/__openerp__.py
index 2409fa6a09b..411170c7e0e 100644
--- a/addons/mass_mailing/__openerp__.py
+++ b/addons/mass_mailing/__openerp__.py
@@ -43,6 +43,7 @@ professional emails and reuse templates in a few clicks.
'wizard/mail_compose_message_view.xml',
'views/mass_mailing.xml',
'views/res_config.xml',
+ 'views/res_partner.xml',
'views/email_template.xml',
'security/ir.model.access.csv',
],
diff --git a/addons/mass_mailing/models/mail_mail.py b/addons/mass_mailing/models/mail_mail.py
index c3e661efa89..9eb1bcf55bc 100644
--- a/addons/mass_mailing/models/mail_mail.py
+++ b/addons/mass_mailing/models/mail_mail.py
@@ -64,7 +64,7 @@ class MailMail(osv.Model):
body = tools.append_content_to_html(body, tracking_url, plaintext=False, container_tag='div')
return body
- def _postprocess_sent_message(self, cr, uid, mail, context=None):
- if mail.state == 'sent' and mail.statistics_ids:
+ def _postprocess_sent_message(self, cr, uid, mail, context=None, mail_sent=True):
+ if mail_sent is True and mail.statistics_ids:
self.pool['mail.mail.statistics'].write(cr, uid, [s.id for s in mail.statistics_ids], {'sent': fields.datetime.now()}, context=context)
- return super(MailMail, self)._postprocess_sent_message(cr, uid, mail, context=context)
+ return super(MailMail, self)._postprocess_sent_message(cr, uid, mail, context=context, mail_sent=mail_sent)
diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py
index 7abdc6785c6..dfaad617082 100644
--- a/addons/mass_mailing/models/mass_mailing.py
+++ b/addons/mass_mailing/models/mass_mailing.py
@@ -51,11 +51,20 @@ class MassMailingContact(osv.Model):
'email': fields.char('Email', required=True),
'list_id': fields.many2one(
'mail.mass_mailing.list', string='Mailing List',
- required=True, ondelete='cascade',
+ ondelete='cascade',
),
'opt_out': fields.boolean('Opt Out', help='The contact has chosen not to receive news anymore from this mailing list'),
}
+ def name_create(self, cr, uid, name, context=None):
+ name, email = self.pool['res.partner']._parse_partner_name(name, context=context)
+ if name and not email:
+ email = name
+ if email and not name:
+ name = email
+ rec_id = self.create(cr, uid, {'name': name, 'email': email}, context=context)
+ return self.name_get(cr, uid, [rec_id], context)[0]
+
class MassMailingList(osv.Model):
"""Model of a contact list. """
@@ -72,19 +81,16 @@ class MassMailingList(osv.Model):
elif 'active_ids' in context:
res['domain'] = '%s' % [('id', 'in', context['active_ids'])]
else:
- res['domain'] = '%s' % [('id', 'in', context.get('active_id', 0))]
+ res['domain'] = False
return res
def _get_contact_nbr(self, cr, uid, ids, name, arg, context=None):
"""Compute the number of contacts linked to the mailing list. """
results = dict.fromkeys(ids, 0)
for contact_list in self.browse(cr, uid, ids, context=context):
- print contact_list, contact_list.model, contact_list.domain
- domain = self._get_domain(cr, uid, [contact_list.id], context=context)[contact_list.id]
- print domain
results[contact_list.id] = self.pool[contact_list.model].search(
cr, uid,
- domain,
+ self._get_domain(cr, uid, [contact_list.id], context=context)[contact_list.id],
count=True, context=context
)
return results
@@ -428,7 +434,7 @@ class MassMailing(osv.Model):
'template_id': fields.many2one(
'email.template', 'Email Template',
domain=[('use_in_mass_mailing', '=', True)],
- ondelete='set null',
+ required=True,
),
'body_html': fields.related(
'template_id', 'body_html', type='html',
@@ -445,7 +451,10 @@ class MassMailing(osv.Model):
),
# mailing options
'email_from': fields.char('From'),
- 'email_to': fields.char('Send to Emails'),
+ 'email_to': fields.many2many(
+ 'mail.mass_mailing.contact', 'mail_mass_mailing_contact_rel',
+ string='Test Emails'
+ ),
'reply_to': fields.char('Reply To'),
'mailing_model': fields.selection(_mailing_model, string='Type', required=True),
'contact_list_ids': fields.many2many(
@@ -554,6 +563,12 @@ class MassMailing(osv.Model):
values['body_html'] = False
return {'value': values}
+ def _get_model_to_list_action_id(self, cr, uid, model, context=None):
+ if model == 'res.partner':
+ return self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, 'mass_mailing.action_partner_to_mailing_list')
+ else:
+ return self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, 'mass_mailing.action_contact_to_mailing_list')
+
def action_new_list(self, cr, uid, ids, context=None):
wizard = self.browse(cr, uid, ids[0], context=context)
action_id = self.pool['ir.model.data'].xmlid_to_res_id(cr, uid, 'mass_mailing.action_partner_to_mailing_list')
@@ -584,16 +599,24 @@ class MassMailing(osv.Model):
# Email Sending
#------------------------------------------------------
+ def _get_mail_recipients(self, cr, uid, mailing, res_ids, context=None):
+ if mailing.mailing_model == 'mail.mass_mailing.contact':
+ contacts = self.pool['mail.mass_mailing.contact'].browse(cr, uid, res_ids, context=context)
+ return dict((contact.id, {'email_to': '"%s" <%s>' % (contact.name, contact.email)}) for contact in contacts)
+ else:
+ return dict((res_id, {'recipient_ids': [(4, res_id)]}) for res_id in res_ids)
+
def send_mail(self, cr, uid, ids, context=None):
Mail = self.pool['mail.mail']
for mailing in self.browse(cr, uid, ids, context=context):
- domain = self.pool['mail.mass_mailing.list'].get_global_domain(cr, uid, [l.id for l in mailing.contact_list_ids], context=context)[mailing.mailing_model]
+ domain = self.pool['mail.mass_mailing.list'].get_global_domain(
+ cr, uid, [l.id for l in mailing.contact_list_ids], context=context
+ )[mailing.mailing_model]
res_ids = self.pool[mailing.mailing_model].search(cr, uid, domain, context=context)
+ recipients = self._get_mail_recipients(cr, uid, mailing, res_ids, context=context)
all_mail_values = self.pool['mail.compose.message'].generate_email_for_composer_batch(
cr, uid, mailing.template_id.id, res_ids,
- context=context,
- fields=['body_html', 'attachment_ids', 'mail_server_id']
- )
+ context=context, fields=['body_html', 'attachment_ids', 'mail_server_id'])
for res_id, mail_values in all_mail_values.iteritems():
mail_values.update({
'email_from': mailing.email_from,
@@ -601,40 +624,48 @@ class MassMailing(osv.Model):
'subject': mailing.name,
'body_html': mail_values.get('body'),
'auto_delete': True,
- 'statistics_ids': [(0, 0, {
+ 'notification': True,
+ })
+ mail_values['statistics_ids'] = [
+ (0, 0, {
'model': mailing.mailing_model,
'res_id': res_id,
'mass_mailing_id': mailing.id,
})]
- })
m2m_attachment_ids = self.pool['mail.thread']._message_preprocess_attachments(
cr, uid, mail_values.pop('attachments', []),
mail_values.pop('attachment_ids', []),
'mail.message', 0,
context=context)
mail_values['attachment_ids'] = m2m_attachment_ids
- if mailing.mailing_model == 'mail.mass_mailing.list':
- contact = self.pool['mail.mass_mailing.contact'].browse(cr, uid, res_id, context=context)
- mail_values['email_to'] = '"%s" <%s>' % (contact.name, contact.email)
- elif mailing.mailing_model == 'res.partner':
- mail_values['recipient_ids'] = [(4, res_id)]
+
+ mail_values.update(recipients[res_id])
+
Mail.create(cr, uid, mail_values, context=context)
- # todo: handle email_to
return True
- def send_mail_to_myself(self, cr, uid, ids, context=None):
+ def send_mail_test(self, cr, uid, ids, context=None):
Mail = self.pool['mail.mail']
for mailing in self.browse(cr, uid, ids, context=context):
- mail_values = {
- 'email_from': mailing.email_from,
- 'reply_to': mailing.reply_to,
- 'email_to': self.pool['res.users'].browse(cr, uid, uid, context=context).email,
- 'subject': mailing.name,
- 'body_html': mailing.template_id.body_html,
- 'auto_delete': True,
- }
- mail_id = Mail.create(cr, uid, mail_values, context=context)
- Mail.send(cr, uid, [mail_id], context=context)
+ # res_ids = self._set_up_test_mailing(cr, uid, mailing.mailing_model, context=context)
+ res_ids = [c.id for c in mailing.email_to]
+ all_mail_values = self.pool['mail.compose.message'].generate_email_for_composer_batch(
+ cr, uid, mailing.template_id.id, res_ids,
+ context=context,
+ fields=['body_html', 'attachment_ids', 'mail_server_id']
+ )
+ mail_ids = []
+ for res_id, mail_values in all_mail_values.iteritems():
+ mail_values = {
+ 'email_from': mailing.email_from,
+ 'reply_to': mailing.reply_to,
+ 'email_to': self.pool['mail.mass_mailing.contact'].browse(cr, uid, res_id, context=context).email,
+ 'subject': mailing.name,
+ 'body_html': mail_values.get('body'),
+ 'auto_delete': True,
+ }
+ mail_ids.append(Mail.create(cr, uid, mail_values, context=context))
+ Mail.send(cr, uid, mail_ids, context=context)
return True
diff --git a/addons/mass_mailing/views/mass_mailing.xml b/addons/mass_mailing/views/mass_mailing.xml
index 110439e3e55..dc86fb6c947 100644
--- a/addons/mass_mailing/views/mass_mailing.xml
+++ b/addons/mass_mailing/views/mass_mailing.xml
@@ -72,6 +72,17 @@
parent="mass_mailing_list" sequence="50"
action="action_view_mass_mailing_contacts"/>
+
+
+
mail.mass_mailing.list.search
@@ -126,8 +137,8 @@
-
+
+
@@ -189,8 +200,8 @@