diff --git a/migrations/5.0.24.5.0/post-0002_activar_inliner.py b/migrations/5.0.24.5.0/post-0002_activar_inliner.py
new file mode 100644
index 0000000..dc13288
--- /dev/null
+++ b/migrations/5.0.24.5.0/post-0002_activar_inliner.py
@@ -0,0 +1,37 @@
+# coding=utf-8
+import logging
+import pooler
+
+from oopgrade.oopgrade import load_data_records
+
+
+def up(cursor, installed_version):
+ if not installed_version:
+ return
+
+ logger = logging.getLogger("openerp.migration")
+ logger.info("Creating pooler")
+ pool = pooler.get_pool(cursor.dbname)
+
+ # Afegir columna a poweremail.templates
+ logger.info("Updating table table: poweremail.templates")
+ pool.get("poweremail.templates")._auto_init(
+ cursor, context={"module": "poweremail"}
+ )
+ logger.info("Table updated succesfully.")
+
+ list_of_records = [
+ "poweremail_template_form",
+ ]
+ load_data_records(
+ cursor, "poweremail", "poweremail_template_view.xml",
+ list_of_records, mode="update"
+ )
+ logger.info("poweremail_template_view.xml successfully updated")
+
+
+def down(cursor, installed_version):
+ pass
+
+
+migrate = up
diff --git a/migrations/5.0.24.5.0/pre-0001_instalar_premailer.py b/migrations/5.0.24.5.0/pre-0001_instalar_premailer.py
new file mode 100644
index 0000000..a44475b
--- /dev/null
+++ b/migrations/5.0.24.5.0/pre-0001_instalar_premailer.py
@@ -0,0 +1,20 @@
+# coding=utf-8
+import logging
+from tools import pip_install
+
+
+def up(cursor, installed_version):
+ if not installed_version:
+ return
+
+ logger = logging.getLogger("openerp.migration")
+ logger.info('Installing premailer package...')
+ pip_install('premailer==2.9.6', '--force')
+ logger.info('Premailer package installed successfully!')
+
+
+def down(cursor, installed_version):
+ pass
+
+
+migrate = up
diff --git a/poweremail_send_wizard.py b/poweremail_send_wizard.py
index d3f3988..f31978a 100644
--- a/poweremail_send_wizard.py
+++ b/poweremail_send_wizard.py
@@ -31,6 +31,7 @@
import tools
from .poweremail_template import get_value
from .poweremail_core import filter_send_emails, _priority_selection
+from premailer import transform
class poweremail_send_wizard(osv.osv_memory):
@@ -138,7 +139,11 @@ def _get_template_value(self, cr, uid, field, context=None):
if len(context['src_rec_ids']) > 1: # Multiple Mail: Gets original template values for multiple email change
return getattr(template, field)
else: # Simple Mail: Gets computed template values
- return self.get_value(cr, uid, template, getattr(template, field), context)
+ value = self.get_value(cr, uid, template, getattr(template, field), context)
+ if template.inline and field == 'def_body_text':
+ value = transform(value)
+
+ return value
_columns = {
'state':fields.selection([
@@ -507,6 +512,9 @@ def save_to_mailbox(self, cr, uid, ids, context=None):
# Options:'multipart/mixed','multipart/alternative','text/plain','text/html'
}
ctx = context.copy()
+ if template.inline:
+ vals['pem_body_text'] = transform(vals['pem_body_text'])
+
mail_id = self.create_mail(cr, uid, screen_vals, src_rec_id, vals, context=ctx)
mail_ids.append(mail_id)
# Ensure report is rendered using template's language. If not found, user's launguage is used.
diff --git a/poweremail_template.py b/poweremail_template.py
index 3d40b16..c6bce70 100644
--- a/poweremail_template.py
+++ b/poweremail_template.py
@@ -71,6 +71,7 @@
import tools
import report
import pooler
+from premailer import transform
from .poweremail_core import get_email_default_lang, _priority_selection
from .utils import Localizer
@@ -527,6 +528,7 @@ def _get_model_data_name_search(
relation='ir.attachment',
string='Attachments'),
'attach_record_items': fields.boolean('Attach record items', select=2, help=u"Si es marca aquesta opcio, s'enviaran com a fitxers adjunts del email tots els adjunts del registre utilitzat per renderitzar el email."),
+ 'inline': fields.boolean('Inline HTML', help=u"If the option is checked, the CSS will be inlined inside the HTML"),
'record_attachment_categories': fields.many2many('ir.attachment.category',
'template_attachment_category_rel',
'templ_id', 'categ_id',
@@ -543,7 +545,8 @@ def _get_model_data_name_search(
_defaults = {
'ref_ir_act_window': False,
'ref_ir_value': False,
- 'def_priority': lambda *a: '1'
+ 'def_priority': lambda *a: '1',
+ 'inline': lambda *a: False
}
_sql_constraints = [
('name', 'unique (name)', _('The template name must be unique!'))
@@ -1063,6 +1066,10 @@ def _generate_mailbox_item_from_template(self, cursor, user, template, record_id
'priority': template.def_priority,
'template_id': template.id,
}
+
+ if template.inline:
+ mailbox_values['pem_body_text'] = transform(mailbox_values['pem_body_text'])
+
#Use signatures if allowed
if template.use_sign:
sign = users_obj.read(cursor, user, user, ['signature'], context=context)['signature']
diff --git a/poweremail_template_view.xml b/poweremail_template_view.xml
index f247594..0eccdd8 100644
--- a/poweremail_template_view.xml
+++ b/poweremail_template_view.xml
@@ -134,6 +134,7 @@
+
diff --git a/requirements.txt b/requirements.txt
index f568bad..19b758f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,4 @@
mako
qreu>=0.7.5
html2text
+premailer==2.9.6
diff --git a/tests/test_poweremail_mailbox.py b/tests/test_poweremail_mailbox.py
index 285a371..033b244 100644
--- a/tests/test_poweremail_mailbox.py
+++ b/tests/test_poweremail_mailbox.py
@@ -538,3 +538,105 @@ def test_save_to_mailbox(self, mock_function, mock_function_2, mock_function_3,
self.assertEqual(len(mail_created_vals['pem_attachments_ids']), 2)
self.assertIn(attachment_report_id, mail_created_vals['pem_attachments_ids'])
self.assertIn(attachment_id, mail_created_vals['pem_attachments_ids'])
+
+ def test_save_to_mailbox_inlining(self):
+ with Transaction().start(self.database) as txn:
+ uid = txn.user
+ cursor = txn.cursor
+ mailbox_obj = self.openerp.pool.get('poweremail.mailbox')
+ pm_tmp_obj = self.openerp.pool.get('poweremail.templates')
+ imd_obj = self.openerp.pool.get('ir.model.data')
+ pw_account_obj = self.openerp.pool.get('poweremail.core_accounts')
+ send_wizard_obj = self.openerp.pool.get('poweremail.send.wizard')
+
+ # Dummy value for an invoice id
+ fact_id = 6
+ # Agafem un template de prova per posar a l'attachment
+ template_id = imd_obj.get_object_reference(
+ cursor, uid, 'poweremail', 'default_template_poweremail'
+ )[1]
+
+ # Creem un wizard 'poweremail_send_wizard'
+ body_text = """
+
+
+Peter
+Hej
+
+ """
+
+ wizard_vals = {
+ 'rel_model_ref': fact_id,
+ 'requested': 1,
+ 'from': 1,
+ 'attachment_ids': [],
+ 'body_text': body_text,
+ 'cc': False,
+ 'body_html': False,
+ 'bcc': False,
+ 'priority': '1',
+ 'to': 'example@example.org',
+ 'state': 'single',
+ 'ref_template': template_id,
+ 'single_email': 0,
+ 'rel_model': 301,
+ 'signature': False,
+ 'report': False,
+ 'subject': 'Factura electricidad False',
+ 'generated': False,
+ 'full_success': False,
+ }
+
+ # Creem un mailbox
+ wizard_id = send_wizard_obj.create(cursor, uid, wizard_vals)
+
+ pw_account_id = pw_account_obj.create(cursor, uid, {
+ 'name': 'test',
+ 'user': 1,
+ 'email_id': 'test@email',
+ 'smtpserver': 'smtp.gmail.com',
+ 'smtpport': '587',
+ 'company': 'no',
+ 'state': 'approved',
+ })
+
+ # Escribim el que necessitem als templates
+ template_vals = {
+ 'enforce_from_account': pw_account_id,
+ 'inline': True
+ }
+ pm_tmp_obj.write(cursor, uid, template_id, template_vals)
+
+ mail_vals = {
+ 'pem_from': 'test@email',
+ 'pem_to': 'example@example.org',
+ 'pem_cc': False,
+ 'pem_bcc': False,
+ 'pem_subject': 'Factura electricidad False',
+ 'pem_body_text': body_text,
+ 'pem_body_html': False,
+ 'pem_account_id': 1,
+ 'priority': '1',
+ 'state': 'na',
+ }
+
+ mailbox_obj.create(cursor, uid, mail_vals)
+
+ context = {}
+ context['template_id'] = template_id
+ context['lang'] = False
+ context['src_rec_id'] = fact_id
+ context['tz'] = False
+ context['src_rec_ids'] = [fact_id]
+ context['active_ids'] = [fact_id]
+ context['type'] = 'out_invoice'
+ context['active_id'] = fact_id
+
+ inlined_html = '\n\n\nPeter
\nHej
\n\n\n'
+
+ mail_ids = send_wizard_obj.save_to_mailbox(cursor, uid, [wizard_id], context=context)
+ pem_body_text = mailbox_obj.read(cursor, uid, mail_ids[0], ['pem_body_text'])['pem_body_text']
+ self.assertEqual(pem_body_text, inlined_html)
diff --git a/tests/test_poweremail_templates.py b/tests/test_poweremail_templates.py
index a379275..b5e4c8d 100644
--- a/tests/test_poweremail_templates.py
+++ b/tests/test_poweremail_templates.py
@@ -98,6 +98,168 @@ def test_send_wizards_gets_default_priority_from_template(self):
wiz = send_obj.browse(cursor, uid, wiz_id)
self.assertEqual(wiz.priority, '2')
+ def test_inliner_from_template_send_wizard(self):
+ imd_obj = self.openerp.pool.get('ir.model.data')
+ tmpl_obj = self.openerp.pool.get('poweremail.templates')
+ send_obj = self.openerp.pool.get('poweremail.send.wizard')
+
+ cursor = self.cursor
+ uid = self.uid
+
+ partner_id = imd_obj.get_object_reference(
+ cursor, uid, 'base', 'res_partner_asus'
+ )[1]
+ tmpl_id = self.create_template()
+
+ example_html = """
+
+
+Peter
+Hej
+
+ """
+
+ write_vals = {
+ 'def_body_text': example_html,
+ 'inline': True
+ }
+
+ tmpl_obj.write(cursor, uid, tmpl_id, write_vals)
+
+ wiz_id = send_obj.create(cursor, uid, {}, context={
+ 'active_id': partner_id,
+ 'active_ids': [partner_id],
+ 'src_rec_ids': [partner_id],
+ 'src_model': 'res.partner',
+ 'template_id': tmpl_id
+ })
+
+ wiz = send_obj.browse(cursor, uid, wiz_id)
+
+ inlined_html = '\n\n\nPeter
\nHej
\n\n\n'
+
+ self.assertEqual(wiz.body_text, inlined_html)
+
+ def test_no_inliner_from_template_send_wizard(self):
+ imd_obj = self.openerp.pool.get('ir.model.data')
+ tmpl_obj = self.openerp.pool.get('poweremail.templates')
+ send_obj = self.openerp.pool.get('poweremail.send.wizard')
+
+ cursor = self.cursor
+ uid = self.uid
+
+ partner_id = imd_obj.get_object_reference(
+ cursor, uid, 'base', 'res_partner_asus'
+ )[1]
+ tmpl_id = self.create_template()
+
+ example_html = """
+
+
+Peter
+Hej
+
+ """
+
+ write_vals = {
+ 'def_body_text': example_html,
+ 'inline': False
+ }
+
+ tmpl_obj.write(cursor, uid, tmpl_id, write_vals)
+
+ wiz_id = send_obj.create(cursor, uid, {}, context={
+ 'active_id': partner_id,
+ 'active_ids': [partner_id],
+ 'src_rec_ids': [partner_id],
+ 'src_model': 'res.partner',
+ 'template_id': tmpl_id
+ })
+
+ wiz = send_obj.browse(cursor, uid, wiz_id)
+
+ self.assertEqual(wiz.body_text, example_html)
+
+ def test_no_inliner_from_template(self):
+ imd_obj = self.openerp.pool.get('ir.model.data')
+ tmpl_obj = self.openerp.pool.get('poweremail.templates')
+ mailbox_obj = self.openerp.pool.get('poweremail.mailbox')
+
+ cursor = self.cursor
+ uid = self.uid
+
+ partner_id = imd_obj.get_object_reference(
+ cursor, uid, 'base', 'res_partner_asus'
+ )[1]
+ tmpl_id = self.create_template()
+
+ example_html = """
+
+
+Peter
+Hej
+
+ """
+
+ write_vals = {
+ 'def_body_text': example_html,
+ 'inline': False
+ }
+
+ tmpl_obj.write(cursor, uid, tmpl_id, write_vals)
+
+ mail_id = tmpl_obj.generate_mail(cursor, uid, tmpl_id, [partner_id])
+ pem_body_text = mailbox_obj.read(cursor, uid, mail_id, ['pem_body_text'])['pem_body_text']
+
+ self.assertEqual(pem_body_text, example_html)
+
+ def test_inliner_from_template(self):
+ imd_obj = self.openerp.pool.get('ir.model.data')
+ tmpl_obj = self.openerp.pool.get('poweremail.templates')
+ mailbox_obj = self.openerp.pool.get('poweremail.mailbox')
+
+ cursor = self.cursor
+ uid = self.uid
+
+ partner_id = imd_obj.get_object_reference(
+ cursor, uid, 'base', 'res_partner_asus'
+ )[1]
+ tmpl_id = self.create_template()
+
+ example_html = """
+
+
+Peter
+Hej
+
+ """
+
+ write_vals = {
+ 'def_body_text': example_html,
+ 'inline': True
+ }
+
+ tmpl_obj.write(cursor, uid, tmpl_id, write_vals)
+
+ mail_id = tmpl_obj.generate_mail(cursor, uid, tmpl_id, [partner_id])
+ pem_body_text = mailbox_obj.read(cursor, uid, mail_id, ['pem_body_text'])['pem_body_text']
+
+ inlined_html = '\n\n\nPeter
\nHej
\n\n\n'
+
+ self.assertEqual(pem_body_text, inlined_html)
+
def test_remove_action_reference(self):
tmpl_obj = self.openerp.pool.get('poweremail.templates')
cursor = self.cursor