diff --git a/mail_layout_preview/README.rst b/mail_layout_preview/README.rst new file mode 100644 index 000000000..9ab4c4329 --- /dev/null +++ b/mail_layout_preview/README.rst @@ -0,0 +1,92 @@ +============ +Mail Preview +============ + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github + :target: https://github.com/OCA/social/tree/13.0/mail_layout_preview + :alt: OCA/social +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/social-13-0/social-13-0-mail_layout_preview + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/205/13.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +The purpose of this module is to help development of email templates +allowing to render the full layout preview of each of them. + +Odoo already allows you do preview emails but they are wrapped into Odoo backend theme. + +NOTE: to make work properly your emails it's strongly recommended to use `mail_inline_css` to include all styles in the body of the email. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +* Go to a template and click on the preview button +* Select desired params and click on "Full layout preview" link +* You'll get to the preview + +As a developer, you can see a list of all templates for a model by going to: + + /email-preview/$model.name + +You'll get a list of all the templates. +Follow the instructions there on how to use the links. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues <https://github.com/OCA/social/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 <https://github.com/OCA/social/issues/new?body=module:%20mail_layout_preview%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Camptocamp SA + +Contributors +~~~~~~~~~~~~ + +* Simone Orsi <simahawk@gmail.com> + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +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. + +This module is part of the `OCA/social <https://github.com/OCA/social/tree/13.0/mail_layout_preview>`_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mail_layout_preview/__init__.py b/mail_layout_preview/__init__.py new file mode 100644 index 000000000..9b7fdc981 --- /dev/null +++ b/mail_layout_preview/__init__.py @@ -0,0 +1,2 @@ +from . import controllers +from . import wizard diff --git a/mail_layout_preview/__manifest__.py b/mail_layout_preview/__manifest__.py new file mode 100644 index 000000000..a63cb3818 --- /dev/null +++ b/mail_layout_preview/__manifest__.py @@ -0,0 +1,15 @@ +# Copyright 2020 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Mail Preview", + "summary": """ + Preview email templates in the browser""", + "version": "13.0.1.0.0", + "license": "AGPL-3", + "author": "Camptocamp SA,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/social", + "depends": ["mail"], + "data": ["templates/email_preview.xml", "wizard/email_template_preview.xml"], + "development_status": "Beta", +} diff --git a/mail_layout_preview/controllers/__init__.py b/mail_layout_preview/controllers/__init__.py new file mode 100644 index 000000000..07dab3c8e --- /dev/null +++ b/mail_layout_preview/controllers/__init__.py @@ -0,0 +1 @@ +from . import layout_preview diff --git a/mail_layout_preview/controllers/layout_preview.py b/mail_layout_preview/controllers/layout_preview.py new file mode 100644 index 000000000..b2e72d85d --- /dev/null +++ b/mail_layout_preview/controllers/layout_preview.py @@ -0,0 +1,47 @@ +# Copyright 2020 Simone Orsi - Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +from odoo import http +from odoo.http import request + + +class Preview(http.Controller): + + _list_template = "mail_layout_preview.email_templates_list" + + @http.route( + ["/email-preview/<string:model>"], type="http", auth="user", website=True + ) + def template_list(self, model, **kw): + env = request.env + templates = env["mail.template"].search([("model_id.model", "=", model)]) + xids = templates.get_external_id() + return request.render( + self._list_template, {"model": model, "templates": templates, "xids": xids} + ) + + @http.route( + ["/email-preview/<string:model>/<string:templ_id>/<int:rec_id>"], + type="http", + auth="user", + website=True, + ) + def preview(self, model, templ_id, rec_id, **kw): + """Render an email template to verify look and feel. + + Provide model, record id and an email template to render. + + Example for event registration email: + + /email-preview/event.registration/event.event_subscription/5 + """ + env = request.env + record = env[model].browse(rec_id) + if templ_id.isdigit(): + # got an ID + template = env["mail.template"].browse(int(templ_id)) + else: + # got a XID + template = env.ref(templ_id.strip()) + result = template.generate_email(record.id) + return request.make_response(result["body_html"]) diff --git a/mail_layout_preview/i18n/mail_layout_preview.pot b/mail_layout_preview/i18n/mail_layout_preview.pot new file mode 100644 index 000000000..49aef304c --- /dev/null +++ b/mail_layout_preview/i18n/mail_layout_preview.pot @@ -0,0 +1,86 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mail_layout_preview +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "<strong>Link:</strong>" +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "<strong>Name:</strong>" +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "<strong>XMLID:</strong>" +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "Copy the link" +msgstr "" + +#. module: mail_layout_preview +#: model:ir.model,name:mail_layout_preview.model_email_template_preview +msgid "Email Template Preview" +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "Email templates for:" +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "Find your template" +msgstr "" + +#. module: mail_layout_preview +#: model:ir.model.fields,field_description:mail_layout_preview.field_email_template_preview__layout_preview_url +msgid "Full layout preview" +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "Here you find all the template for the given model." +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "Load it" +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "No template found." +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "" +"Paste into the address bar and change the record ID (the last value in the URL).\n" +" <br/>If you don't know the ID of the record, just browse to the record via odoo interface and check its ID in the address bar `#id=XXX`." +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "Preview" +msgstr "" + +#. module: mail_layout_preview +#: model_terms:ir.ui.view,arch_db:mail_layout_preview.email_templates_list +msgid "View in backend" +msgstr "" diff --git a/mail_layout_preview/readme/CONTRIBUTORS.rst b/mail_layout_preview/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..f583948be --- /dev/null +++ b/mail_layout_preview/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Simone Orsi <simahawk@gmail.com> diff --git a/mail_layout_preview/readme/DESCRIPTION.rst b/mail_layout_preview/readme/DESCRIPTION.rst new file mode 100644 index 000000000..bf89037bb --- /dev/null +++ b/mail_layout_preview/readme/DESCRIPTION.rst @@ -0,0 +1,6 @@ +The purpose of this module is to help development of email templates +allowing to render the full layout preview of each of them. + +Odoo already allows you do preview emails but they are wrapped into Odoo backend theme. + +NOTE: to make work properly your emails it's strongly recommended to use `mail_inline_css` to include all styles in the body of the email. diff --git a/mail_layout_preview/readme/USAGE.rst b/mail_layout_preview/readme/USAGE.rst new file mode 100644 index 000000000..26448e954 --- /dev/null +++ b/mail_layout_preview/readme/USAGE.rst @@ -0,0 +1,10 @@ +* Go to a template and click on the preview button +* Select desired params and click on "Full layout preview" link +* You'll get to the preview + +As a developer, you can see a list of all templates for a model by going to: + + /email-preview/$model.name + +You'll get a list of all the templates. +Follow the instructions there on how to use the links. diff --git a/mail_layout_preview/static/description/icon.png b/mail_layout_preview/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/mail_layout_preview/static/description/icon.png differ diff --git a/mail_layout_preview/static/description/index.html b/mail_layout_preview/static/description/index.html new file mode 100644 index 000000000..5bc5b846b --- /dev/null +++ b/mail_layout_preview/static/description/index.html @@ -0,0 +1,436 @@ +<?xml version="1.0" encoding="utf-8" ?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> +<head> +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> +<meta name="generator" content="Docutils 0.15.1: http://docutils.sourceforge.net/" /> +<title>Mail Preview</title> +<style type="text/css"> + +/* +:Author: David Goodger (goodger@python.org) +:Id: $Id: html4css1.css 7952 2016-07-26 18:15:59Z milde $ +:Copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the HTML output of Docutils. + +See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to +customize this style sheet. +*/ + +/* used to remove borders from tables and images */ +.borderless, table.borderless td, table.borderless th { + border: 0 } + +table.borderless td, table.borderless th { + /* Override padding for "table.docutils td" with "! important". + The right padding separates the table cells. */ + padding: 0 0.5em 0 0 ! important } + +.first { + /* Override more specific margin styles with "! important". */ + margin-top: 0 ! important } + +.last, .with-subtitle { + margin-bottom: 0 ! important } + +.hidden { + display: none } + +.subscript { + vertical-align: sub; + font-size: smaller } + +.superscript { + vertical-align: super; + font-size: smaller } + +a.toc-backref { + text-decoration: none ; + color: black } + +blockquote.epigraph { + margin: 2em 5em ; } + +dl.docutils dd { + margin-bottom: 0.5em } + +object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { + overflow: hidden; +} + +/* Uncomment (and remove this text!) to get bold-faced definition list terms +dl.docutils dt { + font-weight: bold } +*/ + +div.abstract { + margin: 2em 5em } + +div.abstract p.topic-title { + font-weight: bold ; + text-align: center } + +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title, .code .error { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +/* Uncomment (and remove this text!) to get reduced vertical space in + compound paragraphs. +div.compound .compound-first, div.compound .compound-middle { + margin-bottom: 0.5em } + +div.compound .compound-last, div.compound .compound-middle { + margin-top: 0.5em } +*/ + +div.dedication { + margin: 2em 5em ; + text-align: center ; + font-style: italic } + +div.dedication p.topic-title { + font-weight: bold ; + font-style: normal } + +div.figure { + margin-left: 2em ; + margin-right: 2em } + +div.footer, div.header { + clear: both; + font-size: smaller } + +div.line-block { + display: block ; + margin-top: 1em ; + margin-bottom: 1em } + +div.line-block div.line-block { + margin-top: 0 ; + margin-bottom: 0 ; + margin-left: 1.5em } + +div.sidebar { + margin: 0 0 0.5em 1em ; + border: medium outset ; + padding: 1em ; + background-color: #ffffee ; + width: 40% ; + float: right ; + clear: right } + +div.sidebar p.rubric { + font-family: sans-serif ; + font-size: medium } + +div.system-messages { + margin: 5em } + +div.system-messages h1 { + color: red } + +div.system-message { + border: medium outset ; + padding: 1em } + +div.system-message p.system-message-title { + color: red ; + font-weight: bold } + +div.topic { + margin: 2em } + +h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, +h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { + margin-top: 0.4em } + +h1.title { + text-align: center } + +h2.subtitle { + text-align: center } + +hr.docutils { + width: 75% } + +img.align-left, .figure.align-left, object.align-left, table.align-left { + clear: left ; + float: left ; + margin-right: 1em } + +img.align-right, .figure.align-right, object.align-right, table.align-right { + clear: right ; + float: right ; + margin-left: 1em } + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left } + +.align-center { + clear: both ; + text-align: center } + +.align-right { + text-align: right } + +/* reset inner alignment in figures */ +div.align-right { + text-align: inherit } + +/* div.align-center * { */ +/* text-align: left } */ + +.align-top { + vertical-align: top } + +.align-middle { + vertical-align: middle } + +.align-bottom { + vertical-align: bottom } + +ol.simple, ul.simple { + margin-bottom: 1em } + +ol.arabic { + list-style: decimal } + +ol.loweralpha { + list-style: lower-alpha } + +ol.upperalpha { + list-style: upper-alpha } + +ol.lowerroman { + list-style: lower-roman } + +ol.upperroman { + list-style: upper-roman } + +p.attribution { + text-align: right ; + margin-left: 50% } + +p.caption { + font-style: italic } + +p.credits { + font-style: italic ; + font-size: smaller } + +p.label { + white-space: nowrap } + +p.rubric { + font-weight: bold ; + font-size: larger ; + color: maroon ; + text-align: center } + +p.sidebar-title { + font-family: sans-serif ; + font-weight: bold ; + font-size: larger } + +p.sidebar-subtitle { + font-family: sans-serif ; + font-weight: bold } + +p.topic-title { + font-weight: bold } + +pre.address { + margin-bottom: 0 ; + margin-top: 0 ; + font: inherit } + +pre.literal-block, pre.doctest-block, pre.math, pre.code { + margin-left: 2em ; + margin-right: 2em } + +pre.code .ln { color: grey; } /* line numbers */ +pre.code, code { background-color: #eeeeee } +pre.code .comment, code .comment { color: #5C6576 } +pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } +pre.code .literal.string, code .literal.string { color: #0C5404 } +pre.code .name.builtin, code .name.builtin { color: #352B84 } +pre.code .deleted, code .deleted { background-color: #DEB0A1} +pre.code .inserted, code .inserted { background-color: #A3D289} + +span.classifier { + font-family: sans-serif ; + font-style: oblique } + +span.classifier-delimiter { + font-family: sans-serif ; + font-weight: bold } + +span.interpreted { + font-family: sans-serif } + +span.option { + white-space: nowrap } + +span.pre { + white-space: pre } + +span.problematic { + color: red } + +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80% } + +table.citation { + border-left: solid 1px gray; + margin-left: 1px } + +table.docinfo { + margin: 2em 4em } + +table.docutils { + margin-top: 0.5em ; + margin-bottom: 0.5em } + +table.footnote { + border-left: solid 1px black; + margin-left: 1px } + +table.docutils td, table.docutils th, +table.docinfo td, table.docinfo th { + padding-left: 0.5em ; + padding-right: 0.5em ; + vertical-align: top } + +table.docutils th.field-name, table.docinfo th.docinfo-name { + font-weight: bold ; + text-align: left ; + white-space: nowrap ; + padding-left: 0 } + +/* "booktabs" style (no vertical lines) */ +table.docutils.booktabs { + border: 0px; + border-top: 2px solid; + border-bottom: 2px solid; + border-collapse: collapse; +} +table.docutils.booktabs * { + border: 0px; +} +table.docutils.booktabs th { + border-bottom: thin solid; + text-align: left; +} + +h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, +h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { + font-size: 100% } + +ul.auto-toc { + list-style-type: none } + +</style> +</head> +<body> +<div class="document" id="mail-preview"> +<h1 class="title">Mail Preview</h1> + +<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!! This file is generated by oca-gen-addon-readme !! +!! changes will be overwritten. !! +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> +<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/social/tree/13.0/mail_layout_preview"><img alt="OCA/social" src="https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/social-13-0/social-13-0-mail_layout_preview"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/205/13.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p> +<p>The purpose of this module is to help development of email templates +allowing to render the full layout preview of each of them.</p> +<p>Odoo already allows you do preview emails but they are wrapped into Odoo backend theme.</p> +<p>NOTE: to make work properly your emails it’s strongly recommended to use <cite>mail_inline_css</cite> to include all styles in the body of the email.</p> +<p><strong>Table of contents</strong></p> +<div class="contents local topic" id="contents"> +<ul class="simple"> +<li><a class="reference internal" href="#usage" id="id1">Usage</a></li> +<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li> +<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul> +<li><a class="reference internal" href="#authors" id="id4">Authors</a></li> +<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li> +<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li> +</ul> +</li> +</ul> +</div> +<div class="section" id="usage"> +<h1><a class="toc-backref" href="#id1">Usage</a></h1> +<ul class="simple"> +<li>Go to a template and click on the preview button</li> +<li>Select desired params and click on “Full layout preview” link</li> +<li>You’ll get to the preview</li> +</ul> +<p>As a developer, you can see a list of all templates for a model by going to:</p> +<blockquote> +/email-preview/$model.name</blockquote> +<p>You’ll get a list of all the templates. +Follow the instructions there on how to use the links.</p> +</div> +<div class="section" id="bug-tracker"> +<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1> +<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/social/issues">GitHub Issues</a>. +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 +<a class="reference external" href="https://github.com/OCA/social/issues/new?body=module:%20mail_layout_preview%0Aversion:%2013.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p> +<p>Do not contact contributors directly about support or help with technical issues.</p> +</div> +<div class="section" id="credits"> +<h1><a class="toc-backref" href="#id3">Credits</a></h1> +<div class="section" id="authors"> +<h2><a class="toc-backref" href="#id4">Authors</a></h2> +<ul class="simple"> +<li>Camptocamp SA</li> +</ul> +</div> +<div class="section" id="contributors"> +<h2><a class="toc-backref" href="#id5">Contributors</a></h2> +<ul class="simple"> +<li>Simone Orsi <<a class="reference external" href="mailto:simahawk@gmail.com">simahawk@gmail.com</a>></li> +</ul> +</div> +<div class="section" id="maintainers"> +<h2><a class="toc-backref" href="#id6">Maintainers</a></h2> +<p>This module is maintained by the OCA.</p> +<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a> +<p>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.</p> +<p>This module is part of the <a class="reference external" href="https://github.com/OCA/social/tree/13.0/mail_layout_preview">OCA/social</a> project on GitHub.</p> +<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p> +</div> +</div> +</div> +</body> +</html> diff --git a/mail_layout_preview/templates/email_preview.xml b/mail_layout_preview/templates/email_preview.xml new file mode 100644 index 000000000..bf6d311e7 --- /dev/null +++ b/mail_layout_preview/templates/email_preview.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> +<odoo> + + <template id="email_templates_list"> + <t t-call="web.layout"> + <h1> + Email templates for: <span t-esc="model" /> + </h1> + <t t-if="not templates"> + <p>No template found.</p> + </t> + <t t-if="templates"> + <div class="instructions"> + <p>Here you find all the template for the given model.</p> + <ol> + <li>Find your template</li> + <li>Copy the link</li> + <li> + Paste into the address bar and change the record ID (the last value in the URL). + <br />If you don't know the ID of the record, just browse to the record via odoo interface and check its ID in the address bar `#id=XXX`. + </li> + <li>Load it</li> + </ol> + </div> + <ol class="email-template-list"> + <t t-foreach="templates" t-as="tmpl"> + <t t-set="xid" t-value="xids.get(tmpl.id)" /> + <li class="email-template-item" style="padding:0.5em"> + <strong>Name:</strong> <span class="name" t-field="tmpl.name" /><br /> + <t t-if="xid"> + <strong>XMLID:</strong> <span class="xid" t-esc="xid" /><br /> + </t> + <strong>Link:</strong> + <a class="preview" t-attf-href="/email-preview/#{model}/#{xid or tmpl.id}/1"> + Preview + </a><br /> + <a class="preview" t-attf-href="/web#id=#{tmpl.id}&view_type=form&model=mail.template"> + View in backend + </a> + </li> + </t> + </ol> + </t> + </t> + </template> + +</odoo> diff --git a/mail_layout_preview/tests/__init__.py b/mail_layout_preview/tests/__init__.py new file mode 100644 index 000000000..365703cfa --- /dev/null +++ b/mail_layout_preview/tests/__init__.py @@ -0,0 +1 @@ +from . import test_layout_preview diff --git a/mail_layout_preview/tests/test_layout_preview.py b/mail_layout_preview/tests/test_layout_preview.py new file mode 100644 index 000000000..bdfa1ef78 --- /dev/null +++ b/mail_layout_preview/tests/test_layout_preview.py @@ -0,0 +1,77 @@ +# Copyright 2020 Camptocamp SA (http://www.camptocamp.com) +# Simone Orsi <simahawk@gmail.com> +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from lxml import etree + +from odoo import tools +from odoo.tests.common import HttpCase, SavepointCase, tagged + + +class TestLayoutMixin(object): + @staticmethod + def _create_template(env, model, **kw): + vals = { + "name": "Test Preview Template", + "subject": "Preview ${object.name}", + "body_html": "<p>Hello ${object.name}</p>", + "model_id": env["ir.model"]._get(model).id, + "user_signature": False, + } + vals.update(kw) + return env["mail.template"].create(vals) + + +@tagged("-at_install", "post_install") +class TestLayoutPreview(SavepointCase, TestLayoutMixin): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.wiz_model = cls.env["email_template.preview"] + cls.partner = cls.env.ref("base.res_partner_4") + cls.tmpl = cls._create_template(cls.env, cls.partner._name) + + def test_wizard_preview_url(self): + wiz = self.wiz_model.with_context( + template_id=self.tmpl.id, default_res_id=self.partner.id + ).create({}) + self.assertEqual( + wiz.layout_preview_url, + "/email-preview/res.partner/{}/{}/".format(self.tmpl.id, self.partner.id), + ) + + +@tagged("-at_install", "post_install") +class TestController(HttpCase, TestLayoutMixin): + @classmethod + def setUpClass(cls): + super().setUpClass() + host = "127.0.0.1" + port = tools.config["http_port"] + cls.base_url = "http://%s:%d/email-preview/" % (host, port) + + def test_controller1(self): + self.authenticate("admin", "admin") + model = "res.partner" + response = self.url_open(self.base_url + model) + content = response.content + tree = etree.fromstring(content) + list_items = tree.xpath("//ol[@class='email-template-list']/li/a") + templates = self.env["mail.template"].search([("model_id.model", "=", model)]) + url_pattern = "/email-preview/res.partner/mail.email_template_partner/{}" + for el, tmpl in zip(list_items, templates): + self.assertEqual( + el.attrib, {"class": "preview", "href": url_pattern.format(tmpl.id)} + ) + + def test_controller2(self): + self.authenticate("admin", "admin") + partner = self.env.ref("base.res_partner_4") + model = partner._name + tmpl = self._create_template(self.env, model) + response = self.url_open( + self.base_url + "{}/{}/{}/".format(model, tmpl.id, partner.id) + ) + content = response.content.decode() + self.assertIn("<p>Hello {}</p>".format(partner.name), content) diff --git a/mail_layout_preview/wizard/__init__.py b/mail_layout_preview/wizard/__init__.py new file mode 100644 index 000000000..134743a98 --- /dev/null +++ b/mail_layout_preview/wizard/__init__.py @@ -0,0 +1 @@ +from . import email_template_preview diff --git a/mail_layout_preview/wizard/email_template_preview.py b/mail_layout_preview/wizard/email_template_preview.py new file mode 100644 index 000000000..ee22b15c4 --- /dev/null +++ b/mail_layout_preview/wizard/email_template_preview.py @@ -0,0 +1,26 @@ +# Copyright 2020 Simone Orsi - Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +from odoo import api, fields, models + + +class TemplatePreview(models.TransientModel): + _inherit = "email_template.preview" + + _url_pattern = "/email-preview/{model}/{templ_id}/{rec_id}/" + + layout_preview_url = fields.Char( + string="Full layout preview", compute="_compute_layout_preview_url" + ) + + @api.depends("res_id") + def _compute_layout_preview_url(self): + for rec in self: + if self.env.context.get("template_id"): + rec.layout_preview_url = self._url_pattern.format( + model=rec.model_id.model, + templ_id=self.env.context["template_id"], + rec_id=rec.res_id, + ) + else: + rec.layout_preview_url = "" diff --git a/mail_layout_preview/wizard/email_template_preview.xml b/mail_layout_preview/wizard/email_template_preview.xml new file mode 100644 index 000000000..8070a1a0a --- /dev/null +++ b/mail_layout_preview/wizard/email_template_preview.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<odoo> + <record model="ir.ui.view" id="email_template_preview_form"> + <field name="model">email_template.preview</field> + <field name="inherit_id" ref="mail.email_template_preview_form" /> + <field name="arch" type="xml"> + <footer position="before"> + <hr /> + <label for="layout_preview_url"/> + <field name="layout_preview_url" widget="url" /> + </footer> + </field> + </record> +</odoo>