From 1ac8e7cdfddbf8ac6b7c4b843582392705f10a73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Thu, 20 Feb 2014 16:29:45 +0100 Subject: [IMP] mail, email_template: mass mailing feature cleaning - now differentiates mass mailing and mass post. - mass mailing is a true mass mailing - using same_thread log a copy in the document, without using message_post (using notification field, + model and res_id) - improved form view of composer, adding a filed explaining a bit the various recipients - removed unnecessary fields coming from the template (partner_to, ...) because they are confusing -> composer should be easier to understand and use - removed some unnecessary code - removed double body computation when using templates (one for tmeplate, then the wizard -> not necessary) This commit will be followed by other to try to improve the mass mailing and mass post. bzr revid: tde@openerp.com-20140220152945-ash0hfkzevzamihq --- .../email_template/wizard/mail_compose_message.py | 38 +++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'addons/email_template/wizard/mail_compose_message.py') diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index beede1122dc..959fea94420 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -55,14 +55,23 @@ class mail_compose_message(osv.TransientModel): ) return res + def get_recipients_data(self, cr, uid, values, context=None): + if values['composition_mode'] != 'mass_mail': + return super(mail_compose_message, self).get_recipients_data(cr, uid, values, context=context) + model, res_id, template_id = values['model'], values['res_id'], values.get('template_id') + active_ids = context.get('active_ids', list()) + if not active_ids or not template_id: + return False + template = self.pool['email.template'].browse(cr, uid, template_id, context=context) + partner_to = self.render_template_batch(cr, uid, template.partner_to, model, active_ids[:3], context=context) + partner_ids = [int(data) for key, data in partner_to.iteritems() if data] + rec_names = [rec_name[1] for rec_name in self.pool['res.partner'].name_get(cr, SUPERUSER_ID, partner_ids, context=context)] + recipients = ', '.join(rec_names) + recipients += ' and %d more.' % (len(active_ids) - 3) if len(active_ids) > 3 else '.' + return recipients + _columns = { 'template_id': fields.many2one('email.template', 'Use template', select=True), - 'partner_to': fields.char('To (Partner IDs)', - help="Comma-separated list of recipient partners ids (placeholders may be used here)"), - 'email_to': fields.char('To (Emails)', - help="Comma-separated recipient addresses (placeholders may be used here)",), - 'email_cc': fields.char('Cc (Emails)', - help="Carbon copy recipients (placeholders may be used here)"), } def send_mail(self, cr, uid, ids, context=None): @@ -92,7 +101,7 @@ class mail_compose_message(osv.TransientModel): """ - mass_mailing: we cannot render, so return the template values - normal mode: return rendered values """ if template_id and composition_mode == 'mass_mail': - fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids', 'mail_server_id'] + fields = ['subject', 'body_html', 'email_from', 'reply_to', 'attachment_ids', 'mail_server_id'] template_values = self.pool.get('email.template').read(cr, uid, template_id, fields, context) values = dict((field, template_values[field]) for field in fields if template_values.get(field)) elif template_id: @@ -162,16 +171,18 @@ class mail_compose_message(osv.TransientModel): partner_ids += self.pool['res.partner'].exists(cr, SUPERUSER_ID, tpl_partner_ids, context=context) return partner_ids - def generate_email_for_composer_batch(self, cr, uid, template_id, res_ids, context=None): + def generate_email_for_composer_batch(self, cr, uid, template_id, res_ids, fields=None, context=None): """ Call email_template.generate_email(), get fields relevant for mail.compose.message, transform email_cc and email_to into partner_ids """ # filter template values - fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids', 'attachments', 'mail_server_id'] + if fields is None: + fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids', 'mail_server_id'] + returned_fields = fields + ['attachments'] values = dict.fromkeys(res_ids, False) - template_values = self.pool.get('email.template').generate_email_batch(cr, uid, template_id, res_ids, context=context) + template_values = self.pool.get('email.template').generate_email_batch(cr, uid, template_id, res_ids, fields=fields, context=context) for res_id in res_ids: - res_id_values = dict((field, template_values[res_id][field]) for field in fields if template_values[res_id].get(field)) + res_id_values = dict((field, template_values[res_id][field]) for field in returned_fields if template_values[res_id].get(field)) res_id_values['body'] = res_id_values.pop('body_html', '') # transform email_to, email_cc into partner_ids @@ -189,7 +200,10 @@ class mail_compose_message(osv.TransientModel): """ Override to handle templates. """ # generate template-based values if wizard.template_id: - template_values = self.generate_email_for_composer_batch(cr, uid, wizard.template_id.id, res_ids, context=context) + template_values = self.generate_email_for_composer_batch( + cr, uid, wizard.template_id.id, res_ids, + fields=['email_to', 'partner_to', 'email_cc', 'attachment_ids', 'mail_server_id'], + context=context) else: template_values = dict.fromkeys(res_ids, dict()) # generate composer values -- cgit v1.2.3 From 1ce1468cea3c0021abd948e9487a06e68da80b40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Fri, 21 Mar 2014 18:20:25 +0100 Subject: [CLEAN] email_template: mail_compose_message: small code cleaning and dead code removal bzr revid: tde@openerp.com-20140321172025-ntwxfakem8odo2nt --- addons/email_template/wizard/mail_compose_message.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) (limited to 'addons/email_template/wizard/mail_compose_message.py') diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index c1a68791e50..10e8b9c5fc6 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -42,7 +42,8 @@ class mail_compose_message(osv.TransientModel): _inherit = 'mail.compose.message' def default_get(self, cr, uid, fields, context=None): - """ Override to pre-fill the data when having a template in single-email mode """ + """ Override to pre-fill the data when having a template in single-email mode + and not going through the view: the on_change is not called in that case. """ if context is None: context = {} res = super(mail_compose_message, self).default_get(cr, uid, fields, context=context) @@ -50,7 +51,7 @@ class mail_compose_message(osv.TransientModel): res.update( self.onchange_template_id( cr, uid, [], context['default_template_id'], res.get('composition_mode'), - res.get('model'), res.get('res_id', context.get('active_id')), context=context + res.get('model'), res.get('res_id'), context=context )['value'] ) return res @@ -108,7 +109,6 @@ class mail_compose_message(osv.TransientModel): values = self.generate_email_for_composer_batch(cr, uid, template_id, [res_id], context=context)[res_id] # transform attachments into attachment_ids; not attached to the document because this will # be done further in the posting process, allowing to clean database if email not send - values['attachment_ids'] = values.pop('attachment_ids', []) ir_attach_obj = self.pool.get('ir.attachment') for attach_fname, attach_datas in values.pop('attachments', []): data_attach = { @@ -119,7 +119,7 @@ class mail_compose_message(osv.TransientModel): 'res_id': 0, 'type': 'binary', # override default_type from context, possibly meant for another model! } - values['attachment_ids'].append(ir_attach_obj.create(cr, uid, data_attach, context=context)) + values.setdefault('attachment_ids', list()).append(ir_attach_obj.create(cr, uid, data_attach, context=context)) else: values = self.default_get(cr, uid, ['subject', 'body', 'email_from', 'email_to', 'email_cc', 'partner_to', 'reply_to', 'attachment_ids', 'mail_server_id'], context=context) @@ -212,10 +212,6 @@ class mail_compose_message(osv.TransientModel): for res_id in res_ids: # remove attachments from template values as they should not be rendered template_values[res_id].pop('attachment_ids', None) - # remove some keys from composer that are readonly - composer_values[res_id].pop('email_to', None) - composer_values[res_id].pop('email_cc', None) - composer_values[res_id].pop('partner_to', None) # update template values by composer values template_values[res_id].update(composer_values[res_id]) return template_values -- cgit v1.2.3 From 97d49659d069e5cee1a24d5153272059abd270b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 25 Mar 2014 15:03:24 +0100 Subject: [IMP] email_template: added an option to automatically generate recipients instead of using template-based values. This should be the default way of using templates actually, to avoid confusion with mako, ill-defined templates, ... email_template code has been updated to handle recipient_ids when creating an email, depending on its generated template values or default recipients. mail_compose_message has also been updated, delegating the calculation of recipient when having a template to the template itself, using some context keys to force the use of partners instead of email_to and email_cc. Also updated email_template form view to be a bit less confusing. bzr revid: tde@openerp.com-20140325140324-bljvybigk3zv5ugm --- .../email_template/wizard/mail_compose_message.py | 41 +++++++--------------- 1 file changed, 13 insertions(+), 28 deletions(-) (limited to 'addons/email_template/wizard/mail_compose_message.py') diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index 10e8b9c5fc6..61a7a7045a4 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -157,47 +157,29 @@ class mail_compose_message(osv.TransientModel): # Wizard validation and send #------------------------------------------------------ - def _get_or_create_partners_from_values(self, cr, uid, rendered_values, context=None): - """ Check for email_to, email_cc, partner_to """ - partner_ids = [] - mails = tools.email_split(rendered_values.pop('email_to', '')) + tools.email_split(rendered_values.pop('email_cc', '')) - for mail in mails: - partner_id = self.pool.get('res.partner').find_or_create(cr, uid, mail, context=context) - partner_ids.append(partner_id) - partner_to = rendered_values.pop('partner_to', '') - if partner_to: - # placeholders could generate '', 3, 2 due to some empty field values - tpl_partner_ids = [pid for pid in partner_to.split(',') if pid] - partner_ids += self.pool['res.partner'].exists(cr, SUPERUSER_ID, tpl_partner_ids, context=context) - return partner_ids - def generate_email_for_composer_batch(self, cr, uid, template_id, res_ids, context=None, fields=None): """ Call email_template.generate_email(), get fields relevant for mail.compose.message, transform email_cc and email_to into partner_ids """ - # filter template values + if context is None: + context = {} if fields is None: fields = ['subject', 'body_html', 'email_from', 'email_to', 'partner_to', 'email_cc', 'reply_to', 'attachment_ids', 'mail_server_id'] - returned_fields = fields + ['attachments'] + returned_fields = fields + ['partner_ids', 'attachments'] values = dict.fromkeys(res_ids, False) - template_values = self.pool.get('email.template').generate_email_batch(cr, uid, template_id, res_ids, fields=fields, context=context) + ctx = dict(context, tpl_partners_only=True) + template_values = self.pool.get('email.template').generate_email_batch(cr, uid, template_id, res_ids, fields=fields, context=ctx) for res_id in res_ids: res_id_values = dict((field, template_values[res_id][field]) for field in returned_fields if template_values[res_id].get(field)) res_id_values['body'] = res_id_values.pop('body_html', '') - - # transform email_to, email_cc into partner_ids - ctx = dict((k, v) for k, v in (context or {}).items() if not k.startswith('default_')) - partner_ids = self._get_or_create_partners_from_values(cr, uid, res_id_values, context=ctx) - # legacy template behavior: void values do not erase existing values and the - # related key is removed from the values dict - if partner_ids: - res_id_values['partner_ids'] = list(partner_ids) - values[res_id] = res_id_values return values def render_message_batch(self, cr, uid, wizard, res_ids, context=None): """ Override to handle templates. """ + # generate composer values + composer_values = super(mail_compose_message, self).render_message_batch(cr, uid, wizard, res_ids, context) + # generate template-based values if wizard.template_id: template_values = self.generate_email_for_composer_batch( @@ -206,10 +188,13 @@ class mail_compose_message(osv.TransientModel): context=context) else: template_values = dict.fromkeys(res_ids, dict()) - # generate composer values - composer_values = super(mail_compose_message, self).render_message_batch(cr, uid, wizard, res_ids, context) for res_id in res_ids: + if wizard.template_id: + # recipients are managed by the template + composer_values[res_id].pop('partner_ids') + composer_values[res_id].pop('email_to') + composer_values[res_id].pop('email_cc') # remove attachments from template values as they should not be rendered template_values[res_id].pop('attachment_ids', None) # update template values by composer values -- cgit v1.2.3 From 55fc583f36b4764592d196e2f5d3c7b8ded50077 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 15 Apr 2014 16:33:43 +0200 Subject: [REM] mail: compose message: removed unnecessary code bzr revid: tde@openerp.com-20140415143343-on2d3j92o6zifq59 --- addons/email_template/wizard/mail_compose_message.py | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'addons/email_template/wizard/mail_compose_message.py') diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index 61a7a7045a4..00858e654bf 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -56,21 +56,6 @@ class mail_compose_message(osv.TransientModel): ) return res - def get_recipients_data(self, cr, uid, values, context=None): - if values['composition_mode'] != 'mass_mail': - return super(mail_compose_message, self).get_recipients_data(cr, uid, values, context=context) - model, res_id, template_id = values['model'], values['res_id'], values.get('template_id') - active_ids = context.get('active_ids', list()) - if not active_ids or not template_id: - return False - template = self.pool['email.template'].browse(cr, uid, template_id, context=context) - partner_to = self.render_template_batch(cr, uid, template.partner_to, model, active_ids[:3], context=context) - partner_ids = [int(data) for key, data in partner_to.iteritems() if data] - rec_names = [rec_name[1] for rec_name in self.pool['res.partner'].name_get(cr, SUPERUSER_ID, partner_ids, context=context)] - recipients = ', '.join(rec_names) - recipients += ' and %d more.' % (len(active_ids) - 3) if len(active_ids) > 3 else '.' - return recipients - _columns = { 'template_id': fields.many2one('email.template', 'Use template', select=True), } -- cgit v1.2.3 From 3eaeae55a03da0244d5eef821dfa81cd0c911764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 15 Apr 2014 17:47:00 +0200 Subject: [IMP] mail, mass_mailing: better recipientsz computation for mass mailing, composer and template. This allows to have one method computing recipints and avoid repetiting myself. bzr revid: tde@openerp.com-20140415154700-zu2izvxfjq1k4h4a --- addons/email_template/wizard/mail_compose_message.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'addons/email_template/wizard/mail_compose_message.py') diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index 00858e654bf..8bfc2599cd9 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -152,7 +152,7 @@ class mail_compose_message(osv.TransientModel): returned_fields = fields + ['partner_ids', 'attachments'] values = dict.fromkeys(res_ids, False) - ctx = dict(context, tpl_partners_only=True) + ctx = dict(context) template_values = self.pool.get('email.template').generate_email_batch(cr, uid, template_id, res_ids, fields=fields, context=ctx) for res_id in res_ids: res_id_values = dict((field, template_values[res_id][field]) for field in returned_fields if template_values[res_id].get(field)) @@ -172,16 +172,18 @@ class mail_compose_message(osv.TransientModel): fields=['email_to', 'partner_to', 'email_cc', 'attachment_ids', 'mail_server_id'], context=context) else: - template_values = dict.fromkeys(res_ids, dict()) + template_values = {} for res_id in res_ids: - if wizard.template_id: + if template_values.get(res_id): # recipients are managed by the template composer_values[res_id].pop('partner_ids') composer_values[res_id].pop('email_to') composer_values[res_id].pop('email_cc') - # remove attachments from template values as they should not be rendered - template_values[res_id].pop('attachment_ids', None) + # remove attachments from template values as they should not be rendered + template_values[res_id].pop('attachment_ids', None) + else: + template_values[res_id] = dict() # update template values by composer values template_values[res_id].update(composer_values[res_id]) return template_values -- cgit v1.2.3 From f9b2b667a0e3ac63aff55f48a98e5b47938c187a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Wed, 16 Apr 2014 10:39:46 +0200 Subject: [FIX] email_template: back to partner_ids generation when using templates bzr revid: tde@openerp.com-20140416083946-2qlv0liu8doshh9q --- addons/email_template/wizard/mail_compose_message.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'addons/email_template/wizard/mail_compose_message.py') diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index 8bfc2599cd9..676f11b23e3 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -152,7 +152,7 @@ class mail_compose_message(osv.TransientModel): returned_fields = fields + ['partner_ids', 'attachments'] values = dict.fromkeys(res_ids, False) - ctx = dict(context) + ctx = dict(context, tpl_partners_only=True) template_values = self.pool.get('email.template').generate_email_batch(cr, uid, template_id, res_ids, fields=fields, context=ctx) for res_id in res_ids: res_id_values = dict((field, template_values[res_id][field]) for field in returned_fields if template_values[res_id].get(field)) -- cgit v1.2.3