[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
This commit is contained in:
Thibault Delavallée 2012-09-03 20:11:11 +02:00
parent 88ce376c32
commit a3db9b35bd
2 changed files with 89 additions and 38 deletions

View File

@ -71,23 +71,50 @@ class test_message_compose(common.TransactionCase):
_subject1 = 'Pigs'
_subject2 = 'Bird'
_body_text1 = 'Pigs rules'
_body_text_html1 = 'Pigs rules<pre>Admin</pre>'
_body_text_html1 = 'Fans of Pigs, unite !\n<pre>Admin</pre>\n'
_body_text2 = 'I am angry !'
_body_text_html2 = 'I am angry !<pre>Admin</pre>'
# 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

View File

@ -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):