From 3ad005824adc290d7f39424ef0e6676b66968fb3 Mon Sep 17 00:00:00 2001 From: "Aung Ko Ko Lin (Quartile)" <45355704+AungKoKoLin1997@users.noreply.github.com> Date: Thu, 28 Nov 2024 09:32:24 +0700 Subject: [PATCH] [4851][ADD] template_content_swapper #168 [4851][ADD] template_content_swapper #168 --- .../odoo/addons/template_content_swapper | 1 + setup/template_content_swapper/setup.py | 6 + template_content_swapper/README.rst | 117 +++++ template_content_swapper/__init__.py | 1 + template_content_swapper/__manifest__.py | 16 + template_content_swapper/i18n/it.po | 142 ++++++ .../i18n/template_content_swapper.pot | 135 ++++++ template_content_swapper/models/__init__.py | 2 + template_content_swapper/models/ir_ui_view.py | 46 ++ .../models/template_content_mapping.py | 65 +++ template_content_swapper/readme/CONFIGURE.rst | 13 + .../readme/CONTRIBUTORS.rst | 5 + .../readme/DESCRIPTION.rst | 8 + template_content_swapper/readme/USAGE.rst | 9 + .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 458 ++++++++++++++++++ .../static/img/login_after.png | Bin 0 -> 31586 bytes .../static/img/login_before.png | Bin 0 -> 32017 bytes .../static/img/mapping.png | Bin 0 -> 32276 bytes template_content_swapper/tests/__init__.py | 1 + .../tests/test_template_content_swapper.py | 52 ++ .../views/template_content_mapping_views.xml | 81 ++++ 23 files changed, 1161 insertions(+) create mode 120000 setup/template_content_swapper/odoo/addons/template_content_swapper create mode 100644 setup/template_content_swapper/setup.py create mode 100644 template_content_swapper/README.rst create mode 100644 template_content_swapper/__init__.py create mode 100644 template_content_swapper/__manifest__.py create mode 100644 template_content_swapper/i18n/it.po create mode 100644 template_content_swapper/i18n/template_content_swapper.pot create mode 100644 template_content_swapper/models/__init__.py create mode 100644 template_content_swapper/models/ir_ui_view.py create mode 100644 template_content_swapper/models/template_content_mapping.py create mode 100644 template_content_swapper/readme/CONFIGURE.rst create mode 100644 template_content_swapper/readme/CONTRIBUTORS.rst create mode 100644 template_content_swapper/readme/DESCRIPTION.rst create mode 100644 template_content_swapper/readme/USAGE.rst create mode 100644 template_content_swapper/security/ir.model.access.csv create mode 100644 template_content_swapper/static/description/icon.png create mode 100644 template_content_swapper/static/description/index.html create mode 100644 template_content_swapper/static/img/login_after.png create mode 100644 template_content_swapper/static/img/login_before.png create mode 100644 template_content_swapper/static/img/mapping.png create mode 100644 template_content_swapper/tests/__init__.py create mode 100644 template_content_swapper/tests/test_template_content_swapper.py create mode 100644 template_content_swapper/views/template_content_mapping_views.xml diff --git a/setup/template_content_swapper/odoo/addons/template_content_swapper b/setup/template_content_swapper/odoo/addons/template_content_swapper new file mode 120000 index 00000000..0bf89e1a --- /dev/null +++ b/setup/template_content_swapper/odoo/addons/template_content_swapper @@ -0,0 +1 @@ +../../../../template_content_swapper \ No newline at end of file diff --git a/setup/template_content_swapper/setup.py b/setup/template_content_swapper/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/template_content_swapper/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) diff --git a/template_content_swapper/README.rst b/template_content_swapper/README.rst new file mode 100644 index 00000000..32f53e57 --- /dev/null +++ b/template_content_swapper/README.rst @@ -0,0 +1,117 @@ +======================== +Template Content Swapper +======================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:e37f2f6ea0333073814bf3941f71a14e7ab642f011bbd8bc9e8e5a37f0cef128 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fserver--ux-lightgray.png?logo=github + :target: https://github.com/OCA/server-ux/tree/16.0/template_content_swapper + :alt: OCA/server-ux +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-ux-16-0/server-ux-16-0-template_content_swapper + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/server-ux&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module offers a generic functionality for replacing QWeb view elements. +Typically, element replacements are conducted through a template using an XPATH replacement by creating a new module. +With this module, users don't need to do this; they simply need to create template.content.mapping records for the templates they wish to modify. + +Examples: + +* Replace 'Salesperson' label with 'Sales Representative' in the quotation print. +* Replace 'Add to Cart' button with 'Add to Basket' in the eCommerce product page. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Go to *Settings > Technical > User Interface > Template Content Mappings* to +create/maintain records. + +Following fields should be filled in: + +* **Report** (optional): Report record that includes the string you'd like to replace. + Setting a report record will automatically update the template field. +* **Template** (required): The main QWeb template (ir.ui.view record) that includes the + string you'd like to replace. +* **Language** (optional): Target language for string replacement. If left blank, the + replacement will be applied to all languages. +* **Content From** (required): An existing string to be replaced. +* **Content To** (optional): A new string to replace the existing string. + +Usage +===== + +To use this module, first configure the template content mappings. + +.. image:: https://raw.githubusercontent.com/OCA/server-ux/16.0/template_content_swapper/static/img/mapping.png + +Then, go to the UI where your configured template is utilized. + +.. image:: https://raw.githubusercontent.com/OCA/server-ux/16.0/template_content_swapper/static/img/login_before.png + +.. image:: https://raw.githubusercontent.com/OCA/server-ux/16.0/template_content_swapper/static/img/login_after.png + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Quartile Limited + +Contributors +~~~~~~~~~~~~ + +* `Quartile `_: + + * Aung Ko Ko Lin + * Yoshi Tashiro + * Tatsuki Kanda + +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/server-ux `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/template_content_swapper/__init__.py b/template_content_swapper/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/template_content_swapper/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/template_content_swapper/__manifest__.py b/template_content_swapper/__manifest__.py new file mode 100644 index 00000000..b2bde7b7 --- /dev/null +++ b/template_content_swapper/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2024 Quartile Limited +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Template Content Swapper", + "version": "16.0.1.0.1", + "author": "Quartile Limited, Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Tools", + "website": "https://github.com/OCA/server-ux", + "depends": ["base"], + "data": [ + "security/ir.model.access.csv", + "views/template_content_mapping_views.xml", + ], + "installable": True, +} diff --git a/template_content_swapper/i18n/it.po b/template_content_swapper/i18n/it.po new file mode 100644 index 00000000..93a7923c --- /dev/null +++ b/template_content_swapper/i18n/it.po @@ -0,0 +1,142 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * template_content_swapper +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-03-04 16:36+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__active_lang_count +msgid "Active Lang Count" +msgstr "Numero lingue attive" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__content_from +msgid "Content From" +msgstr "Contenuto file" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__content_to +msgid "Content To" +msgstr "Contenuto a" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: template_content_swapper +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Frontend" +msgstr "Frontend" + +#. module: template_content_swapper +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Group By" +msgstr "Raggruppa per" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__id +msgid "ID" +msgstr "ID" + +#. module: template_content_swapper +#: model:ir.model.fields,help:template_content_swapper.field_template_content_mapping__lang +msgid "" +"If no language is selected, the mapping will be applied to all languages." +msgstr "" +"Se non è selezionata una lingua, la mappatura verrà applicata a tutte le " +"lingue." + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__lang +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Language" +msgstr "Lingua" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__name +msgid "Name" +msgstr "Nome" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__report_id +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Report" +msgstr "Resoconto" + +#. module: template_content_swapper +#: model:ir.model.fields,help:template_content_swapper.field_template_content_mapping__template_id +msgid "Select the main template of the report / frontend page to be modified." +msgstr "" +"Selezionare il modello principale del resoconto / pagina frontend da " +"modificare." + +#. module: template_content_swapper +#: model:ir.model.fields,help:template_content_swapper.field_template_content_mapping__content_from +msgid "Set the content (string) to be replaced. e.g. 'Salesperson'." +msgstr "Impostare il contenuto (stringa) da sostituire. Es. 'Venditore'." + +#. module: template_content_swapper +#: model:ir.model.fields,help:template_content_swapper.field_template_content_mapping__content_to +msgid "Set your new content (string). e.g. 'Sales Representative'." +msgstr "Impostare il nuovo contenuto (stringa). Es. 'Rappresentante'." + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__template_id +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Template" +msgstr "Modello" + +#. module: template_content_swapper +#: model:ir.model,name:template_content_swapper.model_template_content_mapping +msgid "Template Content Mapping" +msgstr "Modello mappatura contenuto" + +#. module: template_content_swapper +#: model:ir.actions.act_window,name:template_content_swapper.action_template_content_mapping +#: model:ir.ui.menu,name:template_content_swapper.menu_template_content_mapping +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Template Content Mappings" +msgstr "Modello mappature contenuto" + +#. module: template_content_swapper +#: model:ir.model,name:template_content_swapper.model_ir_ui_view +msgid "View" +msgstr "Vista" diff --git a/template_content_swapper/i18n/template_content_swapper.pot b/template_content_swapper/i18n/template_content_swapper.pot new file mode 100644 index 00000000..0217ce13 --- /dev/null +++ b/template_content_swapper/i18n/template_content_swapper.pot @@ -0,0 +1,135 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * template_content_swapper +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__active_lang_count +msgid "Active Lang Count" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__content_from +msgid "Content From" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__content_to +msgid "Content To" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__create_uid +msgid "Created by" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__create_date +msgid "Created on" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__display_name +msgid "Display Name" +msgstr "" + +#. module: template_content_swapper +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Frontend" +msgstr "" + +#. module: template_content_swapper +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Group By" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__id +msgid "ID" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,help:template_content_swapper.field_template_content_mapping__lang +msgid "" +"If no language is selected, the mapping will be applied to all languages." +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__lang +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Language" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping____last_update +msgid "Last Modified on" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__write_date +msgid "Last Updated on" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__name +msgid "Name" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__report_id +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Report" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,help:template_content_swapper.field_template_content_mapping__template_id +msgid "Select the main template of the report / frontend page to be modified." +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,help:template_content_swapper.field_template_content_mapping__content_from +msgid "Set the content (string) to be replaced. e.g. 'Salesperson'." +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,help:template_content_swapper.field_template_content_mapping__content_to +msgid "Set your new content (string). e.g. 'Sales Representative'." +msgstr "" + +#. module: template_content_swapper +#: model:ir.model.fields,field_description:template_content_swapper.field_template_content_mapping__template_id +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Template" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model,name:template_content_swapper.model_template_content_mapping +msgid "Template Content Mapping" +msgstr "" + +#. module: template_content_swapper +#: model:ir.actions.act_window,name:template_content_swapper.action_template_content_mapping +#: model:ir.ui.menu,name:template_content_swapper.menu_template_content_mapping +#: model_terms:ir.ui.view,arch_db:template_content_swapper.view_template_content_mapping_search +msgid "Template Content Mappings" +msgstr "" + +#. module: template_content_swapper +#: model:ir.model,name:template_content_swapper.model_ir_ui_view +msgid "View" +msgstr "" diff --git a/template_content_swapper/models/__init__.py b/template_content_swapper/models/__init__.py new file mode 100644 index 00000000..6fe71417 --- /dev/null +++ b/template_content_swapper/models/__init__.py @@ -0,0 +1,2 @@ +from . import ir_ui_view +from . import template_content_mapping diff --git a/template_content_swapper/models/ir_ui_view.py b/template_content_swapper/models/ir_ui_view.py new file mode 100644 index 00000000..14219890 --- /dev/null +++ b/template_content_swapper/models/ir_ui_view.py @@ -0,0 +1,46 @@ +# Copyright 2024 Quartile Limited +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import re + +from markupsafe import Markup + +from odoo import models + + +class IrUiView(models.Model): + _inherit = "ir.ui.view" + + def _render_template(self, template, values=None): + result = super()._render_template(template, values) + result_str = str(result) + lang_code = "en_US" + request = values.get("request") + if request: + # For views + lang_code = request.env.lang + else: + # For reports + lang_match = re.search(r'data-oe-lang="([^"]+)"', result_str) + if lang_match: + lang_code = lang_match.group(1) + view = self._get(template).sudo() + content_mappings = ( + self.env["template.content.mapping"] + .sudo() + .search( + [ + ("template_id", "=", view.id), + "|", + ("lang", "=", lang_code), + ("lang", "=", False), + ] + ) + ) + if content_mappings: + for mapping in content_mappings: + content_from = mapping.content_from + content_to = mapping.content_to or "" + result_str = result_str.replace(content_from, content_to) + result = Markup(result_str) + return result diff --git a/template_content_swapper/models/template_content_mapping.py b/template_content_swapper/models/template_content_mapping.py new file mode 100644 index 00000000..92672965 --- /dev/null +++ b/template_content_swapper/models/template_content_mapping.py @@ -0,0 +1,65 @@ +# Copyright 2024 Quartile Limited +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class TemplateContentMapping(models.Model): + _name = "template.content.mapping" + _description = "Template Content Mapping" + _order = "template_id, content_from" + + @api.model + def _lang_get(self): + return self.env["res.lang"].get_installed() + + name = fields.Char(compute="_compute_name", store=True, readonly=True) + report_id = fields.Many2one("ir.actions.report") + template_id = fields.Many2one( + "ir.ui.view", + domain=[("type", "=", "qweb")], + required=True, + compute="_compute_template_id", + store=True, + readonly=False, + precompute=True, + help="Select the main template of the report / frontend page to be modified.", + ) + lang = fields.Selection( + _lang_get, + string="Language", + default=lambda self: self.env.lang, + help="If no language is selected, the mapping will be applied to all " + "languages.", + ) + active_lang_count = fields.Integer(compute="_compute_active_lang_count") + content_from = fields.Char( + required=True, + help="Set the content (string) to be replaced. e.g. 'Salesperson'.", + ) + content_to = fields.Char( + help="Set your new content (string). e.g. 'Sales Representative'.", + ) + + @api.depends("content_from", "content_to") + def _compute_name(self): + for record in self: + record.name = False + if record.content_from: + record.name = ( + f"{record.content_from or ''} -> {record.content_to or ''}" + ) + + @api.depends("report_id") + def _compute_template_id(self): + for rec in self: + rec.template_id = False + if rec.report_id: + report_name = rec.report_id.report_name + rec.template_id = self.env["ir.ui.view"]._get(report_name).sudo() + + @api.depends("lang") + def _compute_active_lang_count(self): + lang_count = len(self.env["res.lang"].get_installed()) + for rec in self: + rec.active_lang_count = lang_count diff --git a/template_content_swapper/readme/CONFIGURE.rst b/template_content_swapper/readme/CONFIGURE.rst new file mode 100644 index 00000000..5c62e975 --- /dev/null +++ b/template_content_swapper/readme/CONFIGURE.rst @@ -0,0 +1,13 @@ +Go to *Settings > Technical > User Interface > Template Content Mappings* to +create/maintain records. + +Following fields should be filled in: + +* **Report** (optional): Report record that includes the string you'd like to replace. + Setting a report record will automatically update the template field. +* **Template** (required): The main QWeb template (ir.ui.view record) that includes the + string you'd like to replace. +* **Language** (optional): Target language for string replacement. If left blank, the + replacement will be applied to all languages. +* **Content From** (required): An existing string to be replaced. +* **Content To** (optional): A new string to replace the existing string. diff --git a/template_content_swapper/readme/CONTRIBUTORS.rst b/template_content_swapper/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..cc3f36c3 --- /dev/null +++ b/template_content_swapper/readme/CONTRIBUTORS.rst @@ -0,0 +1,5 @@ +* `Quartile `_: + + * Aung Ko Ko Lin + * Yoshi Tashiro + * Tatsuki Kanda diff --git a/template_content_swapper/readme/DESCRIPTION.rst b/template_content_swapper/readme/DESCRIPTION.rst new file mode 100644 index 00000000..109b5629 --- /dev/null +++ b/template_content_swapper/readme/DESCRIPTION.rst @@ -0,0 +1,8 @@ +This module offers a generic functionality for replacing QWeb view elements. +Typically, element replacements are conducted through a template using an XPATH replacement by creating a new module. +With this module, users don't need to do this; they simply need to create template.content.mapping records for the templates they wish to modify. + +Examples: + +* Replace 'Salesperson' label with 'Sales Representative' in the quotation print. +* Replace 'Add to Cart' button with 'Add to Basket' in the eCommerce product page. diff --git a/template_content_swapper/readme/USAGE.rst b/template_content_swapper/readme/USAGE.rst new file mode 100644 index 00000000..ef0de92e --- /dev/null +++ b/template_content_swapper/readme/USAGE.rst @@ -0,0 +1,9 @@ +To use this module, first configure the template content mappings. + +.. image:: ../static/img/mapping.png + +Then, go to the UI where your configured template is utilized. + +.. image:: ../static/img/login_before.png + +.. image:: ../static/img/login_after.png diff --git a/template_content_swapper/security/ir.model.access.csv b/template_content_swapper/security/ir.model.access.csv new file mode 100644 index 00000000..30fa7dee --- /dev/null +++ b/template_content_swapper/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_template_content_mapping_all,template_content_mapping_all,model_template_content_mapping,,1,0,0,0 +access_template_content_mapping_system,template_content_mapping_system,model_template_content_mapping,base.group_system,1,1,1,1 diff --git a/template_content_swapper/static/description/icon.png b/template_content_swapper/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/template_content_swapper/static/description/index.html b/template_content_swapper/static/description/index.html new file mode 100644 index 00000000..3079d083 --- /dev/null +++ b/template_content_swapper/static/description/index.html @@ -0,0 +1,458 @@ + + + + + +Template Content Swapper + + + +
+

Template Content Swapper

+ + +

Beta License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

+

This module offers a generic functionality for replacing QWeb view elements. +Typically, element replacements are conducted through a template using an XPATH replacement by creating a new module. +With this module, users don’t need to do this; they simply need to create template.content.mapping records for the templates they wish to modify.

+

Examples:

+
    +
  • Replace ‘Salesperson’ label with ‘Sales Representative’ in the quotation print.
  • +
  • Replace ‘Add to Cart’ button with ‘Add to Basket’ in the eCommerce product page.
  • +
+

Table of contents

+ +
+

Configuration

+

Go to Settings > Technical > User Interface > Template Content Mappings to +create/maintain records.

+

Following fields should be filled in:

+
    +
  • Report (optional): Report record that includes the string you’d like to replace. +Setting a report record will automatically update the template field.
  • +
  • Template (required): The main QWeb template (ir.ui.view record) that includes the +string you’d like to replace.
  • +
  • Language (optional): Target language for string replacement. If left blank, the +replacement will be applied to all languages.
  • +
  • Content From (required): An existing string to be replaced.
  • +
  • Content To (optional): A new string to replace the existing string.
  • +
+
+
+

Usage

+

To use this module, first configure the template content mappings.

+https://raw.githubusercontent.com/OCA/server-ux/16.0/template_content_swapper/static/img/mapping.png +

Then, go to the UI where your configured template is utilized.

+https://raw.githubusercontent.com/OCA/server-ux/16.0/template_content_swapper/static/img/login_before.png +https://raw.githubusercontent.com/OCA/server-ux/16.0/template_content_swapper/static/img/login_after.png +
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Quartile Limited
  • +
+
+
+

Contributors

+
    +
  • Quartile:
      +
    • Aung Ko Ko Lin
    • +
    • Yoshi Tashiro
    • +
    • Tatsuki Kanda
    • +
    +
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

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/server-ux project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/template_content_swapper/static/img/login_after.png b/template_content_swapper/static/img/login_after.png new file mode 100644 index 0000000000000000000000000000000000000000..52ad45dad782728d78981bf33d96f540a0dbfee7 GIT binary patch literal 31586 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 G$o~Mk??JQx literal 0 HcmV?d00001 diff --git a/template_content_swapper/static/img/login_before.png b/template_content_swapper/static/img/login_before.png new file mode 100644 index 0000000000000000000000000000000000000000..391fc23c6e02ca9cf620d85e14c47bd5ac7470cd GIT binary patch literal 32017 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 literal 0 HcmV?d00001 diff --git a/template_content_swapper/static/img/mapping.png b/template_content_swapper/static/img/mapping.png new file mode 100644 index 0000000000000000000000000000000000000000..f60a8d13aba54363fa80cb869300cfb90f84afbc GIT binary patch literal 32276 zcmd?Q2UJtr_UNsmpwd(X>8Ld6kPwhAA|OZ+>D>UK1On1Khy@P)(0dW2CJ;K(QKTgF z8agVyOGzMv@`Cq&&OP^k?|t9>-h1PX@r`dV27{2j_Fikvxn}vzxkI08C{tc%ynf-r z1xl5tPhMQOa2Y}T`}8U)@%Nq5jQk51?p{!NBCq3haii&^mR2!!+4w9>?vqKWVQ%GC zmH+m1aZ1q|&cign;Cj7MJC9*$e&J3YdG)uj_!TXA9Sz@|D~ov&PlKxNH(#K85OV9? zt?S+l3j>#CbiO~k_NE}LLr+Wj<58XXeRcr*eRkJvX`7Y>S-(Cbo6RO5`~2db9}u|P zz-|$!aQODZ<+~RyUVU`o(v8=D`SVfaRli&%_Yb`P@ZY~*aD#&H$-fvzyx=+CC3?N; z>tqQ*f4}-KcWy0vO!BYqS$+RCSQq~4Im16q=GToV_(cDYKTx=a5?-s{J;Fe4_3D#e zPf^bm)o*d8a!GbT!eUCBxq0?wTd`l;;}+IhgrVyiVenr)o5lpp73HW)v?P5FAy|Fe zq`LFW`HvMvFkH$D9(_GL=qx3(MdA?M2hldKIxF^QKQF52#{Bs ziJ*FVMfW1*?u&8v{!lNL`_G{Uc=w0=(672B$~t)3^C=~`RUJD$XuG6zh!1ZAyfV*H zYjTZ2$lxZf0__IDxfY_ak~$+XA_(i=&7>kA9cnC)hi4D|w!+IgtH<9!{cUR*@4a@x zUkXFtc6pZ_@uh?7z(UGmc6$m>$d}#l3(7yDpms`<2feWm2F~;c)LAJlapMi!(7n;V zuJqSr75+=_pQ~MHEB;-*fdY<%*p89_+?Vb%Y;@fy{zA$n<@2>Hl@KluQ|k3<_WC-- z?Zh8j1k^`OV(IlLbNU?r_VnS)YHS^#gdrRk>5H10_@fPa6(^*}SjP3CHQBe8Iz`ge zhKtNXA&}?DB*=Q1QLx&?HDOC=(RQ!gc4i7D^FENl#1Pq>-Vg3C@n z%{9)pypSRBpkMm*wVL+a*O>{S@VSR6YFL-r{&WG?EFsiesUCCpy*nhtObSN=NK)Llo^bG=H7f#sc98A9H-CG~UD+|z)N**Y z1?kX@xi(*S&?}}rYuz0YlB8PN8|x-GTAQ}4A(d{^m*|@{$Hb$V-&cHWNM63Z9A9x%%2M-vl|a#a07-rC z6UPjf#F(QSoDhlLiJt80AwFKhx6*!-NKQQH>|a>1hYz_vwcEwF#SD5XkxkUqJRv>^M zB`__J^>LBG(h>z_NN#wP>8(%_U9FwzZIE)0x~p~T1n_E(q~fJzZ0Fc$w5_FeNBH(f ziSfSvkpyF_pMw(s&ry$wys`1gCR5UVpXbC8Q&AUhid>C#xTCIvVX156Ig@5DptlO)=sweVh6wY%$erM#DV9PE~X!y%gw6AOY=2H`lT4 z3eurq3>~T}M8Er+qwewv;M35G^C-A8UNn{UJ!{-2z3>H=fu}`+Ur(XRSIX1BaLkr>~7zgJ@wz$7lxK1*^h2 zu0}mnDIl&xs?g#3_axN*V<#B*9t`S;{+?8^&eJYYXdV&6JIAP)_O^Ynk?j6l~{i%#$%-{e>+=3O_q zmPf21UY|(AQI=cTjZAh!+)|^qACv)mh^`0}i~TNE5^QZeUPOSl@awfC(x(l1Lc_%v zrlZUZbS$3htRPZ$uVWkm!F`RGl4~{;eEojUpfU5gVt0gn4(>o>_WaaF?h*8G5-ejm zpTfGF#@4m;NXSgC=ZYYnEM&z>-`Un&7E6VlJLmX#8W3Wd_v1DtA9n|;{0jRw*_o0+ z9w0DC3EBBkTDj70W_D1U8Avl4k3H0|8L>z;h;?me07K}qvyN8iY#415Gd+K~YGJ)= z$7ZDZ66ASPt6O$#+;s=-1YT&CtI)L;t1x;!e89Vw-~|0B`}CBXlc+leD4D*1lsvUE z3vC#pBhus7MiV2V8@K55z!28M4DkHKpWeo~{C9qEK5YO6VWCP+Iv58&z8(o{GwxLYE?GiqLp`nXZ31!Yre455h8mg*fbsb-xn-UPT6KUFX+YWx+d2F-H+ z-Vjo7aBH~6#GDIQ6ibM0IzuJ~k=h%qGOM3`!A0JRM+Fu*ov+Ftxy@R4nN*~r46 z_YjYB%P8>oF?~?U8tZc=)iC?Kyj*LdOqKHOg|sbU3GIRV);&d-JFC_CBRON?`Ym_u zv5YzmaqfslDpPrXb#A9wqk>5JH0lHf66+By2bTP75K39wOrHWy&_lf(sNrvBOOBDf zlCHDqY8^NEkQgU@HASk*s^$0f&e^$J7xY0goMMC^w$+Rx`E*9+yd-dOE_-d3*;utJ z?)y3pcOmZm`Kt+4rkqYn(LUvF_NPT}H?mMtqgG!8m}VfuoJf_X8L_kz^Aj^1%!Jc5 zl1IwEx`8w)i!AF8v-S5t+x?!fY8zV3I86OoPj%Vh_vQ+4g6vnqdye7pbe?w~h%sp! zK)6zKcb(?MOsw!drpb?d%|8Dl^{a9U;I!1HWfJ56x_AYR1 zHO^N&b3dw=K`+GoX#}H_fIy7UzL40_x)nz!4%M_ScXbQ`3?K7FMCL0Ocd7;_49ahq z5Jqh0GHx9blY(^1A9jzdBddE}?Un6Z{O1KTUCI?h44FSjn-JQ=Y^fEHI?jADTIx3y znwXRp5Jj+>aqMkvBwb-T;9hJhH(Q#W;MP{q<`zYKjc`oG|3=Z6$lPE*-wzo}&jZMb ze^KQS8Djmt9mx{!-yn|82Dxj%lDyH(4X*O3{msAPf8G?ryOsevt&f`9rUI2ZtU&8- z#C!Onw<%jfh@mB_xAXLRdbihs2ZNVa%_(j3#cd3pmr<|dM(WXu(uDiBYzoI|7+rg9 z%cF7b%FOWx#+xIp;-rw5;1=n<8knK8$vitk?IoikjgM|=h~ID ze?BT1_l14hR7dxRJ*U-ewVF% zdGCPl>;UyN4RoW=BWsyvBU0*+gsv!5llHWpP(s~7ibwL5-h$rMByS;BY#`-UcwEIg zUUA~mPJVBL>@lFLCI_6Sgx@gXtc?F&Fy`e04b&@5Rl;>ZQj%M_eG@i#nIL*r1}cDhA>4YXM4Rf9W-q4({s7_O?rGhI#Y4qM)VrimhSKK6gAPZI#LnhO}u5ni~!PS;o_%3jHP zXw2eY_xMAfQ@vNeI?|^6PkH+zma96#h_&Z4J$DNgV1;et?9UzUwoe+d$z)C?nF=;KJ}pE*Pj<4v!Fw{c(OC{*gE}Mt8BI>wjd- ze?Wy_!(Lwvrse&+dH?Hog|x(xM(^LE|GfV{%;BZMhky9|=T$*QH(Se!bsrW|{L3d^ z2&QHHKmI^lTLYLkHhbEA9SDG-cQa4*Vb5XTssG9JoeM5|_OdD^ALM6G{o=OoWT8u> z*eIPE+=o1N@{btkui_1Q(FWy@K)6uyVa=*T<^H?;eyt?v=+*-e;&G)7!mrfnVIjl+ zy>GjyZbjbgq^lmAwS`428aw5{6@0=a!x_s;gA=P)X z8o8O4G?R8%+f)GV-`8C>;wDFSFTuMcCh+4Nx$6YTfOMkC%Nw?WM5zbey!o)YTr=Ov zVJj`^1E=HJ2Td_i&*ZM3)+qs<))KTuA9&|BllYm@x2k7}_T6=x0(BDQtYc;1f7B;c z5twws7Q6g{Ms*=KL+E2Z=A`H|HsN@wt|xuc|1s#R$d`10>04gEEKuObZDE9xYSjE6 zySl;^R0*hBP(oU+c-#t~J$r?^C&8rWYwOLCwU|Rlv7shzFmSP4oM!p%YJ}d(crax2 z`yL+5U?gtNWj^mQ_VxfXecx4_H31lzpXa}uNg>!s{K82+QDwI+Z99pw1+JiQBKeN` z)_iG`RzS^hNe67d(r%j@SdU&i2;oa*gCy8z0q&Et7EexHjj2?CTdi$ASjU-gS0}H24eiq5&Sc?!v5E8+SP%v?aNTn zQT^StJAk&LuCgOr8*ACT{Gp2ZoDOxK;cmw%To9wFyIEgom)!Q0RSh-D_w3n|)1S@! z(4oQ#e56?dys5@`o0wpo_JLNQoYpH&IF3zUy3u%lz)xyg-q8;qRW=-BIs;O^dcS&^&uZ$?CVA5990JvP(Sxt7 zI0$9KFRg<1QcuU^9I`S63Dj*lnYNNAo>1+qh?Wi!58n;xRZ$@{(Q_#&+!cY3*ydXR zi{ww&%;fF?lfty&6{#u(F3;^M*I#y1!lOMH*jFp#b}K|;c^UMyacC#mJ2Cwl=x0ZV z94)Tf%$gL%amsOn#vS8FZnnNq2SbJ8L3@#|A2M0TM+|k}j}|LV+mN8I4wP`@;#>X1 zZc2l$K4tS;iwXBKtk_rHfZbUbjA_gy%3~~2! zYSm*;#YfX`!~h9dalR(7zB&HRp#^KkJ{l&gskzzv^Su(^%2`p~E~f|z8Q+%Ufe2FO zGt4t9?)75Gy+sxxQ{Wt^+W8peQL5hS2j+~OPE#FD^^L3d2pJ}wvM^9j+kN9eXie52 zPka^wUMvAu!<;0m`%4Y;)QYXZ*l5T>MmOg~X0lGHHzcyq+B{baYB9fj_EH_LyhsXp z!9&uWtm{;y1wQ`Mi3PFVf93Hsg}P6{|L9c7(BL6aZwFSZ@=1eCyT359cRbi({o0=u zSJ`69r_HSvUnJDbZ6hbaXP$9K%dSK7lh)DP!+SO%(P$_L<{T#S*ue&uD(lUY5o%5M zd&|6p1i(*EgJp)_H48Rem?adA)*xuVh7P*J0H3D0Pzx4NnE&=mpv-Ce~cGJD4u zXPU$=v(D*IH0PKZkk|3JY7yYI|1RCfvw%Ncj7NkH`?7S25)LoT;yGc8Mw4+zp@Ta| zQmy4;-z$U;-WuZ$%@`hAw?fl|O+^Ijbb1vvKgjjTvj+y}14?m=VKSiDT5 z(&-Z|o%oZAFlx7Dn)H&KDB#z`(O*uA!t?rroX1*OK6}R|d&|Y1!noZs4ygF;e4tjZ z-$xUn+?6NUvEap5TAd)1J5yeY?b3l`IJLo)2=(Cux{)&EFT^gqnm{6NsV`<>;(37a7 z^n5&+OD?cFFjVYm$DFXa7_)kQqQCpD0K+H$*oYSY1P6ktg=G54=K5|j>qYBG%9aZ- zs8?_TNH79#Q6T?h($_lfh&FFE3S1E2yW)=_0!*j8r+3k>EUc6(Q+}H(8I|5oZIHE`fw*ah zy1`wkYLQjIp@G=6gjUB)z5EEE5x3owNPtYgGq$QWGawdYL>hJKKMMBQBC~sxmP73g zcxVjHCiM4W?wkjq_ktS1w9{$VDGNGs3r5@pm_f9OYylqY!?JBqw2NVJ!DdF1kgT@8 z>N4iIN7MW^qn>t6cTC{Tm_WSFDZcS(jmBu&Zd(7y$)Psh#_1xi>>1d3neqv~1w% zcUEt3yN{vuY1WMY3)yn^5=T=ZCx4$89D{*zt!!x@ zAxN9qnIcMFU1i9NO_|k*r;Gv5NVnATxr%)ZwE6g@MQ$VPKHviQJ8{MBJs9XbkLf)7 z(CmkcHoR7;<=%zD>~B&tZ`l@HUGtlk9*P(iuNx2jEpykV0220_m{ZT~)(@O=kLrmG2-=CDbVNP@9=zrS!<@ad&ec^%3}>}{&1 z>&!IGsGgals?oAkvBe~ppVT#a-fif#Tc6fh@Qb@WUaI*wi!J-ReVHmYQAc`E!W|bY z!Aa}FeQy3HZ_Re|)gQe84d35>GU_6vhVHh}hV0*#2dNL7 zuE*S$50JOp9YtjfA?bkBO4aXHm5%YA_K;#gP5_}i-C0RX{d8*CYVmj#wE{09U a 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 literal 0 HcmV?d00001 diff --git a/template_content_swapper/tests/__init__.py b/template_content_swapper/tests/__init__.py new file mode 100644 index 00000000..4d75ab6b --- /dev/null +++ b/template_content_swapper/tests/__init__.py @@ -0,0 +1 @@ +from . import test_template_content_swapper diff --git a/template_content_swapper/tests/test_template_content_swapper.py b/template_content_swapper/tests/test_template_content_swapper.py new file mode 100644 index 00000000..4957e475 --- /dev/null +++ b/template_content_swapper/tests/test_template_content_swapper.py @@ -0,0 +1,52 @@ +# Copyright 2024 Quartile Limited +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase + + +class TestTemplateStringSwapper(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.view_obj = cls.env["ir.ui.view"] + ja = ( + cls.env["res.lang"] + .with_context(active_test=False) + .search([("code", "=", "ja_JP")]) + ) + cls.env["base.language.install"].create({"lang_ids": ja.ids}).lang_install() + + def test_template_string_swapper(self): + template = "web.external_layout" + view = self.view_obj._get(template).sudo() + values = {"company": self.env.company, "report_type": "pdf", "o": view} + result = self.view_obj._render_template(template, values) + self.assertTrue("Page:" in str(result)) + self.env["template.content.mapping"].create( + { + "template_id": view.id, + "content_from": "Page:", + "content_to": "Page No.:", + "lang": "en_US", + } + ) + result = self.view_obj._render_template(template, values) + self.assertFalse("Page:" in str(result)) + self.assertTrue("Page No.:" in str(result)) + # Switch the language to Japanese + view_obj = self.view_obj.with_context(lang="ja_JP") + view = view_obj.browse(view.id) + values = {"company": self.env.company, "report_type": "pdf", "o": view} + result = view_obj._render_template(template, values) + self.assertTrue("ページ:" in str(result)) + self.env["template.content.mapping"].create( + { + "template_id": view.id, + "content_from": "ページ:", + "content_to": "ページ番号:", + "lang": "ja_JP", + } + ) + result = view_obj._render_template(template, values) + self.assertFalse("ページ:" in str(result)) + self.assertTrue("ページ番号:" in str(result)) diff --git a/template_content_swapper/views/template_content_mapping_views.xml b/template_content_swapper/views/template_content_mapping_views.xml new file mode 100644 index 00000000..0936ae60 --- /dev/null +++ b/template_content_swapper/views/template_content_mapping_views.xml @@ -0,0 +1,81 @@ + + + + template.content.mapping.tree + template.content.mapping + + + + + + + + + + + + + + template.content.mapping.search + template.content.mapping + + + + + + + + + + + + + + + + + + + + Template Content Mappings + template.content.mapping + tree + {} + + +