From 46a5b63caddf857f38017ed4fb618f73a95a12a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 1 Mar 2013 15:48:27 +0100 Subject: [PATCH] [IMP] email_template: better management of attachments. In mass mail, we want attachments to be duplicated due to the ownership concept of attachments in OpenERP. bzr revid: tde@openerp.com-20130301144827-762362bgng5m4nye --- addons/email_template/tests/test_mail.py | 18 ++++++++--- .../wizard/mail_compose_message.py | 19 ++++++++++++ addons/mail/wizard/mail_compose_message.py | 31 +++++++++++-------- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/addons/email_template/tests/test_mail.py b/addons/email_template/tests/test_mail.py index 39b1023bc64..9e6ed15f904 100644 --- a/addons/email_template/tests/test_mail.py +++ b/addons/email_template/tests/test_mail.py @@ -48,8 +48,8 @@ class test_message_compose(TestMailBase): _body_html1 = 'Fans of Pigs, unite !' _body_html2 = 'I am angry !' _attachments = [ - {'name': 'First', 'datas_fname': 'first.txt', 'datas': base64.b64encode('My first attachment'), 'res_model': 'mail.group', 'res_id': self.group_pigs_id}, - {'name': 'Second', 'datas_fname': 'second.txt', 'datas': base64.b64encode('My second attachment'), 'res_model': 'mail.group', 'res_id': self.group_pigs_id} + {'name': 'First', 'datas_fname': 'first.txt', 'datas': base64.b64encode('My first attachment')}, + {'name': 'Second', 'datas_fname': 'second.txt', 'datas': base64.b64encode('My second attachment')}, ] _attachments_test = [('first.txt', 'My first attachment'), ('second.txt', 'My second attachment')] @@ -116,10 +116,18 @@ class test_message_compose(TestMailBase): self.assertIn(_body_html1, compose.body, 'mail.compose.message body incorrect') self.assertEqual(set(message_pids), set(partner_ids), 'mail.compose.message partner_ids incorrect') # Test: mail.compose.message: attachments - # Test: mail.message: attachments for attach in compose.attachment_ids: - self.assertEqual(attach.res_model, 'mail.group', 'mail.message attachment res_model through templat was overriden') - self.assertEqual(attach.res_id, self.group_pigs_id, 'mail.message attachment res_id incorrect') + self.assertEqual(attach.res_model, False, 'mail.compose.message attachment res_model through templat was overriden') + self.assertEqual(attach.res_id, 0, 'mail.compose.message attachment res_id incorrect') + self.assertIn((attach.datas_fname, base64.b64decode(attach.datas)), _attachments_test, + 'mail.message attachment name / data incorrect') + # Test: mail.message: attachments + mail_compose.send_mail(cr, uid, [compose_id]) + group_pigs.refresh() + message_pigs = group_pigs.message_ids[0] + for attach in message_pigs.attachment_ids: + self.assertEqual(attach.res_model, 'mail.group', 'mail.compose.message attachment res_model through templat was overriden') + self.assertEqual(attach.res_id, self.group_pigs_id, 'mail.compose.message attachment res_id incorrect') self.assertIn((attach.datas_fname, base64.b64decode(attach.datas)), _attachments_test, 'mail.message attachment name / data incorrect') diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index 397f913e912..5631b927f46 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -61,6 +61,25 @@ class mail_compose_message(osv.TransientModel): 'template_id': fields.selection(_get_templates, 'Template', size=-1), } + def send_mail(self, cr, uid, ids, context=None): + """ Override of send_mail to duplicate attachments linked to the email.template. + Indeed, basic mail.compose.message wizard duplicates attachments in mass + mailing mode. But in 'single post' mode, attachments of an email template + also have to be duplicated to avoid changing their ownership. """ + for wizard in self.browse(cr, uid, ids, context=context): + if not wizard.attachment_ids or wizard.composition_mode == 'mass_mail' or not wizard.template_id: + continue + active_model_pool_name = wizard.model if wizard.model else 'mail.thread' + template = self.pool.get('email.template').browse(cr, uid, wizard.template_id, context=context) + new_attachment_ids = [] + for attachment in wizard.attachment_ids: + if attachment in template.attachment_ids: + new_attachment_ids.append(self.pool.get('ir.attachment').copy(cr, uid, attachment.id, {'res_model': active_model_pool_name, 'res_id': wizard.res_id}, context=context)) + else: + new_attachment_ids.append(attachment.id) + self.write(cr, uid, wizard.id, {'attachment_ids': [(6, 0, new_attachment_ids)]}, context=context) + return super(mail_compose_message, self).send_mail(cr, uid, ids, context=context) + def onchange_template_id(self, cr, uid, ids, template_id, composition_mode, model, res_id, context=None): """ - mass_mailing: we cannot render, so return the template values - normal mode: return rendered values """ diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index bb084405c29..0ec5242937e 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -190,41 +190,46 @@ class mail_compose_message(osv.TransientModel): email(s), rendering any template patterns on the fly if needed. """ if context is None: context = {} + ir_attachment_obj = self.pool.get('ir.attachment') active_ids = context.get('active_ids') - is_log = context.get('mail_compose_log', False) for wizard in self.browse(cr, uid, ids, context=context): mass_mail_mode = wizard.composition_mode == 'mass_mail' - active_model_pool = self.pool.get(wizard.model if wizard.model else 'mail.thread') + active_model_pool_name = wizard.model if wizard.model else 'mail.thread' + active_model_pool = self.pool.get(active_model_pool_name) # wizard works in batch mode: [res_id] or active_ids res_ids = active_ids if mass_mail_mode and wizard.model and active_ids else [wizard.res_id] for res_id in res_ids: - # default values, according to the wizard options + # mail.message values, according to the wizard options post_values = { 'subject': wizard.subject, 'body': wizard.body, 'parent_id': wizard.parent_id and wizard.parent_id.id, 'partner_ids': [partner.id for partner in wizard.partner_ids], - 'attachments': [], 'attachment_ids': [attach.id for attach in wizard.attachment_ids], } # mass mailing: render and override default values if mass_mail_mode and wizard.model: email_dict = self.render_message(cr, uid, wizard, res_id, context=context) - new_partner_ids = email_dict.pop('partner_ids', []) - post_values['partner_ids'] += new_partner_ids - new_attachment_ids = email_dict.pop('attachment_ids', []) - post_values['attachment_ids'] += new_attachment_ids - new_attachments = email_dict.pop('attachments', []) - post_values['attachments'] += new_attachments + post_values['partner_ids'] += email_dict.pop('partner_ids', []) + post_values['attachments'] = email_dict.pop('attachments', []) + post_values['attachment_ids'] += email_dict.pop('attachment_ids', []) + # we must duplicate attachments, as each document will have its own copy of the attachment + attachment_ids = [] + for attach_id in post_values.pop('attachment_ids'): + new_attach_id = ir_attachment_obj.copy(cr, uid, attach_id, {'res_model': active_model_pool_name, 'res_id': res_id}, context=context) + attachment_ids.append(new_attach_id) + post_values['attachment_ids'] = attachment_ids post_values.update(email_dict) # post the message - subtype = 'mail.mt_comment' - if is_log: - subtype = False + subtype = 'mail.mt_comment' if not context.get('mail_compose_log', False) else False active_model_pool.message_post(cr, uid, [res_id], type='comment', subtype=subtype, context=context, **post_values) + # mass mailing: delete mail.compose.message attachments, added by the user and that have been duplicated + if mass_mail_mode and wizard.attachment_ids: + wizard.attachment_ids.unlink() + return {'type': 'ir.actions.act_window_close'} def render_message(self, cr, uid, wizard, res_id, context=None):