Dave Lasley
9 years ago
committed by
ernesto
11 changed files with 235 additions and 0 deletions
-
71email_template_qweb/README.rst
-
4email_template_qweb/__init__.py
-
21email_template_qweb/__openerp__.py
-
39email_template_qweb/demo/ir_ui_view.xml
-
10email_template_qweb/demo/mail_template.xml
-
4email_template_qweb/models/__init__.py
-
35email_template_qweb/models/mail_template.py
-
BINemail_template_qweb/static/description/icon.png
-
4email_template_qweb/tests/__init__.py
-
17email_template_qweb/tests/test_mail_template_qweb.py
-
30email_template_qweb/views/mail_template.xml
@ -0,0 +1,71 @@ |
|||
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
|||
:alt: License: AGPL-3 |
|||
|
|||
======================== |
|||
QWeb for email templates |
|||
======================== |
|||
|
|||
This module was written to allow you to write email templates in QWeb instead |
|||
of jinja2. The advantage here is that with QWeb, you can make use of |
|||
inheritance and the ``call`` statement, which allows you to reuse designs and |
|||
snippets in multiple templates, making your development process simpler. |
|||
|
|||
Usage |
|||
===== |
|||
|
|||
To use this module, you need to: |
|||
|
|||
* Select `QWeb` in the field `Body templating engine` |
|||
* Select a QWeb view to be used to render the body field |
|||
* Apart from QWeb's standard variables, you also have access to ``object`` and |
|||
``email_template``, which are browse records of the current object and the |
|||
email template in use, respectively. |
|||
|
|||
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas |
|||
:alt: Try me on Runbot |
|||
:target: https://runbot.odoo-community.org/runbot/149/8.0 |
|||
|
|||
Demo data contains an example on how to separate corporate identity from a |
|||
template's content. |
|||
|
|||
For further information, please visit: |
|||
|
|||
* https://www.odoo.com/forum/help-1 |
|||
|
|||
Bug Tracker |
|||
=========== |
|||
|
|||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/server-tools/issues>`_. |
|||
In case of trouble, please check there if your issue has already been reported. |
|||
If you spotted it first, help us smashing it by providing a detailed and welcomed feedback |
|||
`here <https://github.com/OCA/server-tools/issues/new?body=module:%20email_template_qweb%0Aversion:%209.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. |
|||
|
|||
Credits |
|||
======= |
|||
|
|||
Contributors |
|||
------------ |
|||
|
|||
* Holger Brunn <hbrunn@therp.nl> |
|||
* Dave Lasley <dave@laslabs.com> |
|||
|
|||
Do not contact contributors directly about help with questions or problems concerning |
|||
this addon, but use the `forum <https://www.odoo.com/forum/help-1>`_, |
|||
the `community mailing list <mailto:community@mail.odoo.com>`_, |
|||
or the `appropriate specialized mailinglist <https://odoo-community.org/groups>`_ for help, |
|||
and the bug tracker linked in `Bug Tracker`_ above for technical issues. |
|||
|
|||
Maintainer |
|||
---------- |
|||
|
|||
.. image:: https://odoo-community.org/logo.png |
|||
:alt: Odoo Community Association |
|||
:target: https://odoo-community.org |
|||
|
|||
This module is maintained by the OCA. |
|||
|
|||
OCA, or the Odoo Community Association, is a nonprofit organization whose |
|||
mission is to support the collaborative development of Odoo features and |
|||
promote its widespread use. |
|||
|
|||
To contribute to this module, please visit https://odoo-community.org. |
@ -0,0 +1,4 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Therp BV <http://therp.nl> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
from . import models |
@ -0,0 +1,21 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Therp BV <http://therp.nl> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
{ |
|||
"name": "QWeb for email templates", |
|||
"version": "9.0.1.0.0", |
|||
"author": "Therp BV,Odoo Community Association (OCA)", |
|||
"license": "AGPL-3", |
|||
"category": "Marketing", |
|||
"summary": "Use the QWeb templating mechanism for emails", |
|||
"depends": [ |
|||
'mail', |
|||
], |
|||
"demo": [ |
|||
"demo/ir_ui_view.xml", |
|||
"demo/mail_template.xml", |
|||
], |
|||
"data": [ |
|||
"views/mail_template.xml", |
|||
], |
|||
} |
@ -0,0 +1,39 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<odoo> |
|||
<template id="view_email_template_corporate_identity"> |
|||
<body> |
|||
<html> |
|||
<img style="float: right" t-attf-src="data:image;base64,{{env.user.company_id.logo}}" /> |
|||
<!-- if some template calling us sets this variable, |
|||
we print a h1 tag /--> |
|||
<h1 t-if="email_heading"><t t-esc="email_heading" /></h1> |
|||
<t t-raw="0" /> |
|||
<!-- use some standard footer if the user doesn't have |
|||
a signature /--> |
|||
<footer t-if="not email_use_user_signature"> |
|||
<p> |
|||
<a t-att-href="env.user.company_id.website"> |
|||
<t t-esc="env.user.company_id.name" /> |
|||
</a> |
|||
</p> |
|||
<p><t t-esc="env.user.company_id.phone" /></p> |
|||
</footer> |
|||
<footer t-if="email_use_user_signature"> |
|||
<t t-raw="env.user.signature" /> |
|||
</footer> |
|||
</html> |
|||
</body> |
|||
</template> |
|||
<template id="view_email_template_demo1"> |
|||
<!-- because we can simply call the ci here, we don't need to |
|||
repeat it /--> |
|||
<t t-call="email_template_qweb.view_email_template_corporate_identity"> |
|||
<!-- the template we call uses this as title if we set it /--> |
|||
<t t-set="email_heading" t-value="email_template.subject" /> |
|||
<h2>Dear <t t-esc="object.name" />,</h2> |
|||
<p> |
|||
This is an email template using qweb. |
|||
</p> |
|||
</t> |
|||
</template> |
|||
</odoo> |
@ -0,0 +1,10 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<odoo> |
|||
<record id="email_template_demo1" model="mail.template"> |
|||
<field name="name">QWeb demo</field> |
|||
<field name="body_type">qweb</field> |
|||
<field name="body_view_id" ref="view_email_template_demo1" /> |
|||
<field name="model_id" ref="base.model_res_users" /> |
|||
<field name="subject">QWeb demo email</field> |
|||
</record> |
|||
</odoo> |
@ -0,0 +1,4 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Therp BV <http://therp.nl> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
from . import mail_template |
@ -0,0 +1,35 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Therp BV <http://therp.nl> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
from openerp import api, fields, tools, models |
|||
|
|||
|
|||
class MailTemplate(models.Model): |
|||
_inherit = 'mail.template' |
|||
|
|||
body_type = fields.Selection( |
|||
[('jinja2', 'Jinja2'), ('qweb', 'QWeb')], 'Body templating engine', |
|||
default='jinja2', required=True) |
|||
body_view_id = fields.Many2one( |
|||
'ir.ui.view', 'Body view', domain=[('type', '=', 'qweb')]) |
|||
body_view_arch = fields.Text(related=['body_view_id', 'arch']) |
|||
|
|||
@api.multi |
|||
def generate_email(self, res_ids, fields=None): |
|||
result = super(MailTemplate, self).generate_email( |
|||
res_ids, fields=fields |
|||
) |
|||
for record_id, this in self.get_email_template(res_ids).iteritems(): |
|||
if this.body_type == 'qweb' and\ |
|||
(not fields or 'body_html' in fields): |
|||
for record in self.env[this.model].browse(record_id): |
|||
result[record_id]['body_html'] = self.render_post_process( |
|||
this.body_view_id.render({ |
|||
'object': record, |
|||
'email_template': this, |
|||
}) |
|||
) |
|||
result[record_id]['body'] = tools.html_sanitize( |
|||
result[record_id]['body_html'] |
|||
) |
|||
return result |
After Width: 128 | Height: 128 | Size: 9.2 KiB |
@ -0,0 +1,4 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Therp BV <http://therp.nl> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
from . import test_mail_template_qweb |
@ -0,0 +1,17 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 Therp BV <http://therp.nl> |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
from openerp.tests.common import TransactionCase |
|||
|
|||
|
|||
class TestMailTemplateQweb(TransactionCase): |
|||
def test_email_template_qweb(self): |
|||
template = self.env.ref('email_template_qweb.email_template_demo1') |
|||
mail_values = template.generate_email([self.env.user.id]) |
|||
self.assertTrue( |
|||
# this comes from the called template if everything worked |
|||
'<footer>' in mail_values[self.env.user.id]['body_html'], |
|||
'Did not rcv rendered template in response. Got: \n%s\n' % ( |
|||
mail_values[self.env.user.id]['body_html'] |
|||
) |
|||
) |
@ -0,0 +1,30 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<odoo> |
|||
<record id="email_template_form" model="ir.ui.view"> |
|||
<field name="model">mail.template</field> |
|||
<field name="inherit_id" ref="mail.email_template_form" /> |
|||
<field name="arch" type="xml"> |
|||
<field name="model_id" position="after"> |
|||
<field name="body_type" /> |
|||
</field> |
|||
<field name="body_html" position="before"> |
|||
<group attrs="{'invisible': [('body_type', '!=', 'qweb')]}"> |
|||
<field name="body_view_id" attrs="{'required': [('body_type', '=', 'qweb')]}" /> |
|||
<field name="body_view_arch" attrs="{'required': [('body_type', '=', 'qweb')], 'invisible': [('body_view_id', '=', False)]}" /> |
|||
</group> |
|||
</field> |
|||
<field name="body_html" position="attributes"> |
|||
<attribute name="attrs">{'invisible': [('body_type', '!=', 'jinja2')]}</attribute> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
<record id="email_template_tree" model="ir.ui.view"> |
|||
<field name="model">mail.template</field> |
|||
<field name="inherit_id" ref="mail.email_template_tree" /> |
|||
<field name="arch" type="xml"> |
|||
<field name="report_name" position="before"> |
|||
<field name="body_type" /> |
|||
</field> |
|||
</field> |
|||
</record> |
|||
</odoo> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue