diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 8109e3422aa..ab568d77004 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -790,7 +790,7 @@ class mail_message(osv.Model): if 'email_from' not in values: # needed to compute reply_to values['email_from'] = self._get_default_from(cr, uid, context=context) - if 'message_id' not in values: + if not values.get('message_id'): values['message_id'] = self._get_message_id(cr, uid, values, context=context) if 'reply_to' not in values: values['reply_to'] = self._get_reply_to(cr, uid, values, context=context) diff --git a/addons/mail/tests/test_mail_gateway.py b/addons/mail/tests/test_mail_gateway.py index 1b16f151cdf..9f9c463625a 100644 --- a/addons/mail/tests/test_mail_gateway.py +++ b/addons/mail/tests/test_mail_gateway.py @@ -404,7 +404,8 @@ class TestMailgateway(TestMail): # When 6.1 messages are present, compat mode is available # Create a fake 6.1 message - tmp_msg_id = self.mail_message.create(cr, uid, {'message_id': False, 'model': 'mail.group', 'res_id': frog_group.id}) + tmp_msg_id = self.mail_message.create(cr, uid, {'model': 'mail.group', 'res_id': frog_group.id}) + self.mail_message.write(cr, uid, [tmp_msg_id], {'message_id': False}) # Do: compat mode accepts partial-matching emails frog_groups = format_and_process(MAIL_TEMPLATE, email_from='other5@gmail.com', msg_id='<1.2.JavaMail.new@agrolait.com>', @@ -422,7 +423,8 @@ class TestMailgateway(TestMail): self.assertEqual(len(frog_group.message_ids), 4, 'message_process: group should contain 4 messages after reply') # 6.1 compat mode should not work if hostname does not match! - tmp_msg_id = self.mail_message.create(cr, uid, {'message_id': False, 'model': 'mail.group', 'res_id': frog_group.id}) + tmp_msg_id = self.mail_message.create(cr, uid, {'model': 'mail.group', 'res_id': frog_group.id}) + self.mail_message.write(cr, uid, [tmp_msg_id], {'message_id': False}) self.assertRaises(ValueError, format_and_process, MAIL_TEMPLATE, email_from='other5@gmail.com', diff --git a/addons/mail/wizard/invite.py b/addons/mail/wizard/invite.py index 457eabb319c..9399e4f943f 100644 --- a/addons/mail/wizard/invite.py +++ b/addons/mail/wizard/invite.py @@ -60,9 +60,9 @@ class invite_wizard(osv.osv_memory): help="If checked, the partners will receive an email warning they have been " "added in the document's followers."), } - + _defaults = { - 'send_mail' : True, + 'send_mail': True, } def add_followers(self, cr, uid, ids, context=None): @@ -91,10 +91,13 @@ class invite_wizard(osv.osv_memory): mail_id = mail_mail.create(cr, uid, { 'model': wizard.res_model, 'res_id': wizard.res_id, + 'email_from': self.pool['mail.message']._get_default_from(cr, uid, context=context), + 'reply_to': self.pool['mail.message']._get_default_from(cr, uid, context=context), 'subject': _('Invitation to follow %s: %s') % (model_name, document.name_get()[0][1]), 'body_html': '%s' % wizard.message, 'auto_delete': True, + 'message_id': self.pool['mail.message']._get_message_id(cr, uid, {'no_auto_thread': True}, context=context), 'recipient_ids': [(4, id) for id in new_follower_ids] - }, context=context) + }, context=context) mail_mail.send(cr, uid, [mail_id], context=context) return {'type': 'ir.actions.act_window_close'} diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index a33982b3860..a0577b6b86a 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -265,6 +265,7 @@ class mail_compose_message(osv.TransientModel): 'author_id': wizard.author_id.id, 'email_from': wizard.email_from, 'record_name': wizard.record_name, + 'no_auto_thread': wizard.no_auto_thread, } # mass mailing: rendering override wizard static values if mass_mail_mode and wizard.model: diff --git a/addons/mass_mailing/models/mail_mail.py b/addons/mass_mailing/models/mail_mail.py index 41be9c21cbf..03c7b155ad6 100644 --- a/addons/mass_mailing/models/mail_mail.py +++ b/addons/mass_mailing/models/mail_mail.py @@ -45,7 +45,7 @@ class MailMail(osv.Model): # TDE note: should be after 'all values computed', to have values (FIXME after merging other branch holding create refactoring) mail_id = super(MailMail, self).create(cr, uid, values, context=context) if values.get('statistics_ids'): - mail = self.browse(cr, SUPERUSER_ID, mail_id) + mail = self.browse(cr, SUPERUSER_ID, mail_id, context=context) for stat in mail.statistics_ids: self.pool['mail.mail.statistics'].write(cr, uid, [stat.id], {'message_id': mail.message_id}, context=context) return mail_id diff --git a/addons/mass_mailing/models/mail_thread.py b/addons/mass_mailing/models/mail_thread.py index 524341f88d7..7bfce705043 100644 --- a/addons/mass_mailing/models/mail_thread.py +++ b/addons/mass_mailing/models/mail_thread.py @@ -20,8 +20,8 @@ ############################################################################## import logging +import re -from openerp import tools from openerp.addons.mail.mail_message import decode from openerp.addons.mail.mail_thread import decode_header from openerp.osv import osv @@ -46,7 +46,11 @@ class MailThread(osv.AbstractModel): # 0. Verify whether this is a bounced email (wrong destination,...) -> use it to collect data, such as dead leads if bounce_alias in email_to: - bounce_match = tools.bounce_re.search(email_to) + # Bounce regex + # Typical form of bounce is bounce_alias-128-crm.lead-34@domain + # group(1) = the mail ID; group(2) = the model (if any); group(3) = the record ID + bounce_re = re.compile("%s-(\d+)-?([\w.]+)?-?(\d+)?" % re.escape(bounce_alias), re.UNICODE) + bounce_match = bounce_re.search(email_to) if bounce_match: bounced_model, bounced_thread_id = None, False bounced_mail_id = bounce_match.group(1) diff --git a/addons/mass_mailing/models/mass_mailing_stats.py b/addons/mass_mailing/models/mass_mailing_stats.py index 7e8c194f42e..c3cd4314fa6 100644 --- a/addons/mass_mailing/models/mass_mailing_stats.py +++ b/addons/mass_mailing/models/mass_mailing_stats.py @@ -21,6 +21,7 @@ from openerp.osv import osv, fields + class MailMailStats(osv.Model): """ MailMailStats models the statistics collected about emails. Those statistics are stored in a separated model and table to avoid bloating the mail_mail table @@ -33,7 +34,13 @@ class MailMailStats(osv.Model): _order = 'message_id' _columns = { - 'mail_mail_id': fields.many2one('mail.mail', 'Mail ID', ondelete='set null'), + 'mail_mail_id': fields.many2one('mail.mail', 'Mail', ondelete='set null'), + 'mail_mail_id_int': fields.integer( + 'Mail ID (tech)', + help='ID of the related mail_mail. This field is an integer field because' + 'the related mail_mail can be deleted separately from its statistics.' + 'However the ID is needed for several action and controllers.' + ), 'message_id': fields.char('Message-ID'), 'model': fields.char('Document model'), 'res_id': fields.integer('Document ID'), @@ -62,9 +69,15 @@ class MailMailStats(osv.Model): 'scheduled': fields.datetime.now, } + def create(self, cr, uid, values, context=None): + if 'mail_mail_id' in values: + values['mail_mail_id_int'] = values['mail_mail_id'] + res = super(MailMailStats, self).create(cr, uid, values, context=context) + return res + def _get_ids(self, cr, uid, ids=None, mail_mail_ids=None, mail_message_ids=None, domain=None, context=None): if not ids and mail_mail_ids: - base_domain = [('mail_mail_id', 'in', mail_mail_ids)] + base_domain = [('mail_mail_id_int', 'in', mail_mail_ids)] elif not ids and mail_message_ids: base_domain = [('message_id', 'in', mail_message_ids)] else: diff --git a/addons/mass_mailing/views/mass_mailing.xml b/addons/mass_mailing/views/mass_mailing.xml index 2939ebc3711..c37a2b045dd 100644 --- a/addons/mass_mailing/views/mass_mailing.xml +++ b/addons/mass_mailing/views/mass_mailing.xml @@ -19,6 +19,82 @@ + + + mail.mail.statistics.search + mail.mail.statistics + + + + + + + + + + + mail.mail.statistics.tree + mail.mail.statistics + + + + + + + + + + + + + + + mail.mail.statistics.form + mail.mail.statistics + +
+ + + + + + + + + + + + + + + + + + +
+
+
+ + + Mail Statistics + mail.mail.statistics + form + tree,form + + + + Mail Statistics + mail.mail.statistics + form + tree,form + {'search_default_mass_mailing_id': active_id} + + + + + mail.mass_mailing.contact.search @@ -207,28 +283,28 @@
- - - - -
-