diff --git a/golem_mail/wizard/golem_mail_presend_wizard.py b/golem_mail/wizard/golem_mail_presend_wizard.py index 546dcd9..7ab5e3b 100644 --- a/golem_mail/wizard/golem_mail_presend_wizard.py +++ b/golem_mail/wizard/golem_mail_presend_wizard.py @@ -33,6 +33,7 @@ class GolemMailPresendWizard(models.TransientModel): self.ensure_one() wizard = self[0] emails = wizard.recipient_ids.filtered(lambda r: not r.partner_id).mapped('email') + semails = list(set([item.strip() for item in emails])) partners = wizard.recipient_ids.filtered(lambda r: not r.opt_out).mapped('partner_id').ids return { 'name' : _('Search results'), @@ -46,7 +47,7 @@ class GolemMailPresendWizard(models.TransientModel): 'default_no_auto_thread': False, 'default_from_presend_wizard': True, 'partners_from_wizard': partners, - 'emails_from_wizard': emails}, + 'emails_from_wizard': semails}, 'view_mode': 'form', 'target': 'new' } diff --git a/golem_mail/wizard/mail_compose_message.py b/golem_mail/wizard/mail_compose_message.py index fbecede..acfe106 100644 --- a/golem_mail/wizard/mail_compose_message.py +++ b/golem_mail/wizard/mail_compose_message.py @@ -82,15 +82,9 @@ class MailComposer(models.TransientModel): subtype_id = wizard.subtype_id.id else: subtype_id = self.sudo().env.ref('mail.mt_comment', raise_if_not_found=False).id - + batch_mails = Mail for res_ids in sliced_res_ids: - batch_mails = Mail - if wizard.from_presend_wizard: - emails_values, all_mail_values = wizard.get_mail_values(res_ids) - for email_val in emails_values: - batch_mails |= Mail.create(email_val) - else: - all_mail_values = wizard.get_mail_values(res_ids) + all_mail_values = wizard.get_mail_values(res_ids) for res_id, mail_values in all_mail_values.iteritems(): if wizard.composition_mode == 'mass_mail': batch_mails |= Mail.create(mail_values) @@ -99,84 +93,52 @@ class MailComposer(models.TransientModel): message_type=wizard.message_type, subtype_id=subtype_id, **mail_values) + if self.env.context.get('emails_from_wizard', False): + mails = self._context['emails_from_wizard'] + emails_values = wizard.get_mail_values_from_mails(mails) + for email_val in emails_values: + batch_mails |= Mail.create(email_val) - if wizard.composition_mode == 'mass_mail': - batch_mails.send(auto_commit=auto_commit) + if wizard.composition_mode == 'mass_mail': + batch_mails.send(auto_commit=auto_commit) return {'type': 'ir.actions.act_window_close'} @api.multi - def get_mail_values(self, res_ids): - """Generate the values that will be used by send_mail to create mail_messages - or mail_mails. """ + def get_mail_values_from_mails(self, mails): self.ensure_one() - results = dict.fromkeys(res_ids, False) - rendered_values = {} - mass_mail_mode = self.composition_mode == 'mass_mail' - - # render all template-based value at once - if mass_mail_mode and self.model: - rendered_values = self.render_message(res_ids) - # 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) - for res_id in res_ids: - # static wizard (mail.message) values - mail_values = { - 'subject': self.subject, - 'body': self.body or '', - 'parent_id': self.parent_id and self.parent_id.id, - 'partner_ids': [partner.id for partner in self.partner_ids], - 'attachment_ids': [attach.id for attach in self.attachment_ids], - 'author_id': self.author_id.id, - 'email_from': self.email_from, - 'record_name': self.record_name, - 'no_auto_thread': self.no_auto_thread, - 'mail_server_id': self.mail_server_id.id, + mail_values = { + 'subject': self.subject, + 'body': self.body or '', + 'parent_id': self.parent_id and self.parent_id.id, + 'partner_ids': [partner.id for partner in self.partner_ids], + 'attachment_ids': [attach.id for attach in self.attachment_ids], + 'author_id': self.author_id.id, + 'email_from': self.email_from, + 'record_name': self.record_name, + 'no_auto_thread': self.no_auto_thread, + 'mail_server_id': self.mail_server_id.id, } - - # 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()) - # 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 - if self.auto_delete or self.template_id.auto_delete: - mail_values['auto_delete'] = True - # rendered values using template - email_dict = rendered_values[res_id] - mail_values['partner_ids'] += email_dict.pop('partner_ids', []) - mail_values.update(email_dict) - if not self.no_auto_thread: - mail_values.pop('reply_to') - if reply_to_value.get(res_id): - mail_values['reply_to'] = reply_to_value[res_id] - if self.no_auto_thread and not mail_values.get('reply_to'): - mail_values['reply_to'] = mail_values['email_from'] - # mail_mail values: body -> body_html, partner_ids -> recipient_ids - mail_values['body_html'] = mail_values.get('body', '') - mail_values['recipient_ids'] = [(4, id) for id in mail_values.pop('partner_ids', [])] - - # process attachments: should not be encoded before being processed by message_post / mail_mail create - mail_values['attachments'] = [(name, base64.b64decode(enc_cont)) for name, enc_cont in email_dict.pop('attachments', list())] - attachment_ids = [] - for attach_id in mail_values.pop('attachment_ids'): - new_attach_id = self.env['ir.attachment'].browse(attach_id).copy({'res_model': self._name, 'res_id': self.id}) - attachment_ids.append(new_attach_id.id) - mail_values['attachment_ids'] = self.env['mail.thread']._message_preprocess_attachments( - mail_values.pop('attachments', []), - attachment_ids, 'mail.message', 0) - results[res_id] = mail_values + mail_values.update(notification=not self.auto_delete_message, + model=self.model, + record_name=False) + # auto deletion of mail_mail + if self.auto_delete or self.template_id.auto_delete: + mail_values['auto_delete'] = True + mail_values['reply_to'] = mail_values['email_from'] + mail_values['body_html'] = mail_values.get('body', '') + attachment_ids = [] + for attach_id in mail_values.pop('attachment_ids'): + new_attach_id = self.env['ir.attachment'].browse(attach_id).copy({ + 'res_model': self._name, + 'res_id': self.id + }) + attachment_ids.append(new_attach_id.id) + mail_values['attachment_ids'] = self.env['mail.thread']._message_preprocess_attachments( + mail_values.pop('attachments', []), + attachment_ids, 'mail.message', 0) emails_result = [] - if self.from_presend_wizard: - for email in self._context['emails_from_wizard']: - result = results[res_ids[0]] - result.pop('recipient_ids', []) - result.pop('res_id', []) - result['email_to'] = email - emails_result.append(dict(result)) - return emails_result, results - return results + for email in mails: + mail_values['email_to'] = email + emails_result.append(dict(mail_values)) + return emails_result