From a3db9b35bd561bd00d7f5d1a90c0adb25a150be4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Mon, 3 Sep 2012 20:11:11 +0200 Subject: [PATCH] [WIP] email_template: WIP about debugging the use of email_templates. A method to get and handle values coming from generate_emial has been added. TODO: use it where necessary, clean the remaining of the code, add some tests. Added some new tests. bzr revid: tde@openerp.com-20120903181111-yy9y6omu4vyhdc11 --- addons/email_template/tests/test_mail.py | 41 +++++++-- .../wizard/mail_compose_message.py | 86 ++++++++++++------- 2 files changed, 89 insertions(+), 38 deletions(-) diff --git a/addons/email_template/tests/test_mail.py b/addons/email_template/tests/test_mail.py index 5ca608e6b81..05f8f81d76d 100644 --- a/addons/email_template/tests/test_mail.py +++ b/addons/email_template/tests/test_mail.py @@ -71,23 +71,50 @@ class test_message_compose(common.TransactionCase): _subject1 = 'Pigs' _subject2 = 'Bird' _body_text1 = 'Pigs rules' - _body_text_html1 = 'Pigs rules
Admin
' + _body_text_html1 = 'Fans of Pigs, unite !\n
Admin
\n' _body_text2 = 'I am angry !' _body_text_html2 = 'I am angry !
Admin
' - # CASE1: create in mass_mail composition mode that should work with email_template installed + # CASE1: create in comment + compose_id = mail_compose.create(cr, uid, + {'subject': 'Forget me subject', 'body': 'Dummy body'}, + {'default_composition_mode': 'comment', 'default_model': 'mail.group', + 'default_res_id': self.group_pigs_id, 'default_use_template': True, + 'active_ids': [self.group_pigs_id, group_bird_id] }) + compose = mail_compose.browse(cr, uid, compose_id) + + # Perform 'onchange_template_id' with 'use_template' set + values = mail_compose.onchange_template_id(cr, uid, [], compose.use_template, email_template_id, compose.composition_mode, compose.model, compose.res_id) + compose.write(values.get('value', {}), {'default_composition_mode': 'comment', 'default_model': 'mail.group'}) + compose.refresh() + message_pids = [partner.id for partner in compose.partner_ids] + partner_ids = self.res_partner.search(cr, uid, [('email', 'in', ['b@b.b', 'c@c.c', 'd@d.d'])]) + partners = self.res_partner.browse(cr, uid, partner_ids) + # Test: subject, body, partner_ids + self.assertEqual(compose.subject, _subject1, 'mail.compose.message subject incorrect') + self.assertEqual(compose.body, _body_text_html1, 'mail.compose.message body incorrect') + self.assertEqual(set(message_pids), set(partner_ids), 'mail.compose.message partner_ids incorrect') + + # Perform 'onchange_use_template': use_template is not set anymore + values = mail_compose.onchange_use_template(cr, uid, [], not compose.use_template, compose.template_id, compose.composition_mode, compose.model, compose.res_id) + compose.write(values.get('value', {}), {'default_composition_mode': 'comment', 'default_model': 'mail.group'}) + compose.refresh() + # Test: subject, body, partner_ids + self.assertEqual(compose.subject, False, 'mail.compose.message subject incorrect') + self.assertEqual(compose.body, '', 'mail.compose.message body incorrect') + + # CASE12 create in mass_mail composition compose_id = mail_compose.create(cr, uid, {'subject': 'Forget me subject', 'body': 'Dummy body'}, {'default_composition_mode': 'mass_mail', 'default_model': 'mail.group', 'default_res_id': -1, 'default_use_template': True, - 'active_ids': [self.group_pigs_id, group_bird_id], 'default_template_id': email_template_id}) + 'active_ids': [self.group_pigs_id, group_bird_id] }) compose = mail_compose.browse(cr, uid, compose_id) - # print compose.subject - - # Try the 'onchange_template_id' - values = mail_compose.onchange_template_id(cr, uid, [], compose.use_template, compose.template_id, compose.composition_mode, compose.model, compose.res_id) + # Test 'onchange_template_id' with 'use_template' set + values = mail_compose.onchange_template_id(cr, uid, [], compose.use_template, email_template_id, compose.composition_mode, compose.model, compose.res_id) print values + # self.assertEqual() # compose.write(values['value']) values = mail_compose.onchange_use_template(cr, uid, [], not compose.use_template, compose.template_id, compose.composition_mode, compose.model, compose.res_id) print values diff --git a/addons/email_template/wizard/mail_compose_message.py b/addons/email_template/wizard/mail_compose_message.py index 71586649f37..85dfe8bc843 100644 --- a/addons/email_template/wizard/mail_compose_message.py +++ b/addons/email_template/wizard/mail_compose_message.py @@ -28,15 +28,17 @@ from tools.translate import _ class mail_compose_message(osv.osv_memory): _inherit = 'mail.compose.message' + _compose_fields = ['body', 'body_html', 'subject', 'partner_ids', 'attachment_ids'] def _get_templates(self, cr, uid, context=None): if context is None: context = {} model = False email_template_obj= self.pool.get('email.template') + message_id = context.get('default_parent_id', context.get('message_id', context.get('active_id'))) - if context.get('default_composition_mode') == 'reply' and context.get('active_id'): - message_data = self.pool.get('mail.message').browse(cr, uid, int(context.get('active_id')), context) + if context.get('default_composition_mode') == 'reply' and message_id: + message_data = self.pool.get('mail.message').browse(cr, uid, message_id, context=context) if message_data: model = message_data.model else: @@ -62,32 +64,17 @@ class mail_compose_message(osv.osv_memory): def onchange_template_id(self, cr, uid, ids, use_template, template_id, composition_mode, model, res_id, context=None): """ - use_template not set: return default_get - - use_template set: - - mass_mailing: we cannot render, so return the template values - - else: return rendered values """ - fields = ['body', 'body_html', 'subject', 'partner_ids', 'email_to', 'email_cc'] + - use_template set in mass_mailing: we cannot render, so return the template values + - use_template set: return rendered values """ if use_template and template_id and composition_mode == 'mass_mail': - values = self.pool.get('email.template').read(cr, uid, template_id, fields, context) + values = self.pool.get('email.template').read(cr, uid, template_id, self._compose_fields, context) elif use_template and template_id: - values = self.pool.get('email.template').generate_email(cr, uid, template_id, res_id, context=context) - - values['attachment_ids'] = [] - attachment_obj = self.pool.get('ir.attachment') - for attach_fname, attach_datas in values.get('attachments', []): - data_attach = { - 'name': attach_fname, - 'datas': attach_datas, - 'datas_fname': attach_fname, - 'description': fname, - 'res_model': model, - 'res_id': res_id, - } - values['attachment_ids'].append(attachment_obj.create(cr, uid, data_attach), context=context) + values = self.generate_email_for_composer(cr, uid, template_id, res_id, context=context) else: - values = self.default_get(cr, uid, fields, context=context) + values = self.default_get(cr, uid, self._compose_fields, context=context) - if values.get('body_html') and not values.get('body'): - values['body'] = values.get('body_html') + if values.get('body_html'): + values['body'] = values.pop('body_html') values.update(use_template=use_template, template_id=template_id) return {'value': values} @@ -98,14 +85,17 @@ class mail_compose_message(osv.osv_memory): for record in self.browse(cr, uid, ids, context=context): onchange_res = self.onchange_use_template(cr, uid, ids, not record.use_template, record.template_id, record.composition_mode, record.model, record.res_id, context=context)['value'] - record.write(onchange_res) + record.write(onchange_res.get('value', {})) return True def onchange_use_template(self, cr, uid, ids, use_template, template_id, composition_mode, model, res_id, context=None): """ onchange_use_template (values: True or False). If use_template is False, we do like an onchange with template_id False for values """ - return self.onchange_template_id(cr, uid, ids, use_template, + values = self.onchange_template_id(cr, uid, ids, use_template, template_id, composition_mode, model, res_id, context=context) + if use_template: + values['content_subtype'] = 'html' + return values def save_as_template(self, cr, uid, ids, context=None): """ hit save as template button: current form value will be a new @@ -113,8 +103,7 @@ class mail_compose_message(osv.osv_memory): email_template = self.pool.get('email.template') ir_model_pool = self.pool.get('ir.model') for record in self.browse(cr, uid, ids, context=context): - model = record.model - model_ids = ir_model_pool.search(cr, uid, [('model', '=', model)]) + model_ids = ir_model_pool.search(cr, uid, [('model', '=', record.model)], context=context) model_id = model_ids and model_ids[0] or False model_name = '' if model_id: @@ -135,14 +124,49 @@ class mail_compose_message(osv.osv_memory): # Wizard validation and send #------------------------------------------------------ + def generate_email_for_composer(self, cr, uid, template_id, res_id, context=None): + """ Call email_template.generate_email(), get fields relevant for + mail.compose.message, transform email_cc and email_to into partner_ids """ + fields = ['body', 'body_html', 'subject', 'email_to', 'email_cc', 'attachment_ids'] + template_values = self.pool.get('email.template').generate_email(cr, uid, template_id, res_id, context=context) + values = {field: template_values[field] for field in fields if template_values.get(field)} + + # transform email_to, email_cc into partner_ids + values['partner_ids'] = [] + mails = tools.email_split(values.pop('email_to', '') + ' ' + values.pop('email_cc', '')) + for mail in mails: + partner_search_ids = self.pool.get('res.partner').search(cr, uid, [('email', 'ilike', mail)], context=context) + if partner_search_ids: + values['partner_ids'].append((4, partner_search_ids[0])) + else: + partner_id = self.pool.get('res.partner').name_create(cr, uid, mail, context=context)[0] + partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context) + values['partner_ids'].append((4, partner_id)) + + # transform attachments into attachment_ids + values['attachment_ids'] = [] + for attach_fname, attach_datas in template_values.get('attachments', []): + data_attach = { + 'name': attach_fname, + 'datas': attach_datas, + 'datas_fname': attach_fname, + 'res_model': model, + 'res_id': res_id, + } + values['attachment_ids'].append((0, 0, data_attach)) + + return values + def render_message(self, cr, uid, wizard, model, res_id, context=None): """ Generate an email from the template for given (model, res_id) pair. This method is meant to be inherited by email_template that will produce a more complete dictionary, with email_to, ... """ # render the template to get the email + fields = ['body', 'body_html', 'subject', 'email_to', 'email_cc', 'partner_ids', 'attachment_ids'] template_values = self.pool.get('email.template').generate_email(cr, uid, wizard.template_id, res_id, context=context) - # TDE TODO: handle fields to update / not to update (mail_server_id, auto_delete, ...) + template_values = {field: template_values[field] for field in fields if template_values.get(field)} + # transform email_to, email_cc into partner_ids partner_ids = [] mails = tools.email_split(template_values.pop('email_to', '') + ' ' + template_values.pop('email_cc', '')) @@ -154,10 +178,10 @@ class mail_compose_message(osv.osv_memory): partner_id = self.pool.get('res.partner').name_create(cr, uid, mail, context=context)[0] partner = self.pool.get('res.partner').browse(cr, uid, partner_id, context=context) partner_ids.append((4, partner_id)) + # get values to return email_dict = super(mail_compose_message, self).render_message(cr, uid, wizard, model, res_id, context) - email_dict.update(template_values) - email_dict.update(partner_ids=partner_ids, attachments=template_values.get('attachments')) + email_dict.update(template_values, partner_ids=partner_ids) return email_dict def render_template(self, cr, uid, template, model, res_id, context=None):