diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bce4bb6..e36f86a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,3 @@ - - exclude: | (?x) # NOT INSTALLABLE ADDONS diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 9cd1629..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -# generated from manifests external_dependencies diff --git a/test-requirements.txt b/test-requirements.txt index d2fce6c..ccd75aa 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,3 +1,3 @@ -odoo-addon-module_change_auto_install +odoo-addon-module_change_auto_install @ git+https://github.com/OCA/server-tools.git@refs/pull/3384/head#subdirectory=module_change_auto_install # SKIP TEST openupgradelib lxml_html_clean diff --git a/text_element_base/README.rst b/text_element_base/README.rst new file mode 100644 index 0000000..744512f --- /dev/null +++ b/text_element_base/README.rst @@ -0,0 +1,114 @@ +=========================== +Text Elements - Base module +=========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:4ee6560fe2260f1f8eb8e93bc398b52647c3ab5d0d8b890fbb99ee0eb7f6c214 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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-jdidderen%2Fodoo--text--elements-lightgray.png?logo=github + :target: https://github.com/jdidderen/odoo-text-elements/tree/17.0/text_element_base + :alt: jdidderen/odoo-text-elements + +|badge1| |badge2| |badge3| + +The suite of **Text Element modules** allow for dynamic customization of +PDF documents in Odoo without requiring technical intervention. + +Every company has specific needs when it comes to commercial and +administrative documents. Whether it's adding legal notices, temporary +announcements, or personalized messages, this module provides an +intuitive and efficient solution to adapt document content based on the +business context. + +**Table of contents** + +.. contents:: + :local: + +Use Cases / Context +=================== + +This module was developed to enhance PDF documents and eliminate the +need for developers to add specific information to a document. + +**For example:** +---------------- + +- During the summer period, it allows you to add a note indicating a + closure. +- If your company has multiple departments with specific mentions or + texts for each, the module facilitates their customization based on + the relevant department. +- If legal mentions need to be added depending on the document’s status + (e.g., on a quotation), the module enables their automatic insertion. + +Configuration +============= + + + +Usage +===== + + + +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 +------- + +* Noviat +* Elneo + +Contributors +------------ + +- **Elneo** (https://www.elneo.com/) + + - Loic Grifnée (https://github.com/loicgrifnee) + +- **Noviat** (https://noviat.com/) + + - Benjamin Henquet (https://github.com/BenjaHe) + +- **NSI SA** (https://www.nsi-sa.be/) +- Jérémy Didderen (https://github.com/jdidderen) + +Other credits +------------- + +The module was initially developed by the company Elneo +(https://www.elneo.com/) in version 8.0 and later migrated to version +13.0. + +It was then taken over by Noviat, with Elneo's approval, to be +refactored and made generic. + +Maintainers +----------- + +This module is part of the `jdidderen/odoo-text-elements `_ project on GitHub. + +You are welcome to contribute. diff --git a/text_element_base/__init__.py b/text_element_base/__init__.py new file mode 100644 index 0000000..aee8895 --- /dev/null +++ b/text_element_base/__init__.py @@ -0,0 +1,2 @@ +from . import models +from . import wizards diff --git a/text_element_base/__manifest__.py b/text_element_base/__manifest__.py new file mode 100644 index 0000000..d288845 --- /dev/null +++ b/text_element_base/__manifest__.py @@ -0,0 +1,22 @@ +# Copyright 2009-2023 Noviat +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Text Elements - Base module", + "version": "19.0.1.0.0", + "license": "AGPL-3", + "author": "Noviat, Elneo", + "website": "https://www.noviat.com/", + "category": "Tools", + "depends": ["base", "web", "mail"], + "data": [ + "security/ir.model.access.csv", + "security/text_element_security.xml", + "views/menus.xml", + "views/ir_model_views.xml", + "views/report_templates.xml", + "views/text_element_views.xml", + "views/text_element_custom_views.xml", + "wizards/add_text_element_wizard.xml", + ], +} diff --git a/text_element_base/i18n/fr.po b/text_element_base/i18n/fr.po new file mode 100644 index 0000000..bc3370f --- /dev/null +++ b/text_element_base/i18n/fr.po @@ -0,0 +1,397 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * text_element_base +# +# Weblate Translation Memory , 2025. +# admin , 2025. +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-02-16 20:41+0000\n" +"PO-Revision-Date: 2025-10-21 09:47+0000\n" +"Last-Translator: Weblate Translation Memory \n" +"Language-Team: French \n" +"Language: fr\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 5.13.3\n" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__active +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__active +msgid "Active" +msgstr "Actif" + +#. module: text_element_base +#. odoo-python +#: code:addons/text_element_base/models/text_element_abstract.py:0 +#: code:addons/text_element_base/wizards/add_text_element_wizard.py:0 +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Add Text Element" +msgstr "Ajouter un élément de texte" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_add_text_element_wizard +msgid "Add Text Element on record" +msgstr "Ajouter un élément texte à l'enregistrement" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__page_break_after +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__page_break_after +msgid "Add a page break after element" +msgstr "Ajouter un saut de page après l'élément" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__page_break_before +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__page_break_before +msgid "Add a page break before element" +msgstr "Ajouter un saut de page avant l'élément" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Add and Close" +msgstr "Ajouter et fermer" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Add and Continue" +msgstr "Ajouter et continuer" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_simplified_list_view +msgid "Add text element to custom elements" +msgstr "Ajouter un élément de texte aux éléments personnalisés" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__after_line +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__after_line +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "After Lines (if applicable)" +msgstr "Après les lignes (le cas échéant)" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__after +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__after +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "After the document" +msgstr "Après le document" + +#. module: text_element_base +#: model:ir.ui.menu,name:text_element_base.text_element_menu_category +msgid "All Elements" +msgstr "Tous les éléments" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__model_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__model_id +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Applies to" +msgstr "S'applique à" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__filter_domain +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__filter_domain +msgid "Apply on" +msgstr "Appliquer sur" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Archived" +msgstr "Archivé" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__before_line +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__before_line +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Before Lines (if applicable)" +msgstr "Avant les lignes (le cas échéant)" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__before +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__before +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Before the document" +msgstr "Avant le document" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_ir_model__can_be_used_with_text_elements +msgid "Can Be Used With Text Elements" +msgstr "Peut être utilisé avec des éléments de texte" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Close" +msgstr "Fermer" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__company_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__company_id +msgid "Company" +msgstr "Société" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__content +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__content +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "Content" +msgstr "Contenu" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__context_params +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__context_params +msgid "Context Params" +msgstr "Paramètres de contexte" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__create_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element__create_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__create_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element__create_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: text_element_base +#: model:ir.actions.act_window,name:text_element_base.text_element_custom_action +#: model:ir.model.fields,field_description:text_element_base.field_text_element_abstract__text_element_custom_ids +#: model:ir.ui.menu,name:text_element_base.text_element_custom_menu +msgid "Custom Text Elements" +msgstr "Éléments de texte personnalisés" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_text_element_custom +msgid "Custom text elements" +msgstr "Éléments de texte personnalisés" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__default +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__default +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Default" +msgstr "Par défaut" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__display_name +#: model:ir.model.fields,field_description:text_element_base.field_text_element__display_name +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__display_name +msgid "Display Name" +msgstr "Nom d'affichage" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "Dynamic placerholder generator" +msgstr "Générateur de placeholder dynamique" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__field_placeholder_generator +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__field_placeholder_generator +msgid "Field Placeholder Generator" +msgstr "Générateur de placeholder dynamique" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__field_placeholder_generator_name +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__field_placeholder_generator_name +msgid "Field Placeholder Generator Name" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Group By" +msgstr "Regrouper par" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__id +#: model:ir.model.fields,field_description:text_element_base.field_text_element__id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__id +msgid "ID" +msgstr "Identifiant" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__write_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element__write_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__write_uid +msgid "Last Updated by" +msgstr "Mis à jour par" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__write_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element__write_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__write_date +msgid "Last Updated on" +msgstr "Mis à jour le" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_ir_model +msgid "Models" +msgstr "Modèles" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__name +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__name +msgid "Name" +msgstr "Nom" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__sequence +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__sequence +msgid "Order of displayed text elements in the report." +msgstr "Ordre d'affichage des éléments de texte dans le rapport." + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "Others informations" +msgstr "Autres informations" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__page_break_after +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__page_break_after +msgid "Page Break After" +msgstr "Saut de page après" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__page_break_before +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__page_break_before +msgid "Page Break Before" +msgstr "Saut de page avant" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__context_params +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__context_params +msgid "" +"Params have to be separated with semicolon and can be prefixed " +"withexclamation mark (e.g proforma;!proforma)" +msgstr "" +"Les paramètres doivent être séparés par un point-virgule et peuvent être " +"précédés d'un point d'exclamation (ex : proforma;!proforma)" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__position +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__position +msgid "Position" +msgstr "Position" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__res_id +msgid "Record ID" +msgstr "ID de l'enregistrement" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__model +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__model +msgid "Related Document Model" +msgstr "Modèle de document associé" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_simplified_list_view +msgid "Remove text element" +msgstr "Supprimer l'élément de texte" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__res_id +msgid "Res" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__sequence +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__sequence +msgid "Sequence" +msgstr "Séquence" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__text_element_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__text_element_id +msgid "Text Element" +msgstr "Élément de texte" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__text_element_domain +msgid "Text Element Domain" +msgstr "Domaine de l'élément de texte" + +#. module: text_element_base +#: model:ir.actions.act_window,name:text_element_base.text_element_action +#: model:ir.model.fields,field_description:text_element_base.field_text_element_abstract__text_element_ids +#: model:ir.ui.menu,name:text_element_base.text_element_menu +#: model:ir.ui.menu,name:text_element_base.text_element_menu_root +msgid "Text Elements" +msgstr "Éléments de texte" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_text_element +msgid "Text elements" +msgstr "Éléments de texte" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_text_element_abstract +msgid "Text elements (Abstract)" +msgstr "" + +#. module: text_element_base +#. odoo-python +#: code:addons/text_element_base/models/text_element.py:0 +msgid "The field %s must a many2one in order to use subfields" +msgstr "" +"Le champ %s doit être de type many2one afin de pouvoir utiliser des sous-" +"champs" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__user_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__user_id +msgid "User" +msgstr "Utilisateur" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "e.g. Contact" +msgstr "ex. : Contact" + +#~ msgid "Fields with several subfields is not supported (several dots)" +#~ msgstr "" +#~ "Les champs comportant plusieurs sous-champs ne sont pas pris en charge " +#~ "(plusieurs points)" + +#~ msgid "Edit Text Element" +#~ msgstr "Modifier l'élément de texte" + +#~ msgid "After" +#~ msgstr "Après" + +#~ msgid "After Lines" +#~ msgstr "Après les lignes" + +#~ msgid "Before" +#~ msgstr "Avant" + +#~ msgid "Before Lines" +#~ msgstr "Avant les lignes" + +#~ msgid "Custom Text Element" +#~ msgstr "Élément de texte personnalisé" + +#~ msgid "Edit and Close" +#~ msgstr "Modifier et fermer" + +#~ msgid "Edit and Continue" +#~ msgstr "Modifier et continuer" + +#~ msgid "Lang" +#~ msgstr "Langue" + +#~ msgid "Text Element Custom Domain" +#~ msgstr "Domaine personnalisé de l'élément de texte" diff --git a/text_element_base/i18n/nl.po b/text_element_base/i18n/nl.po new file mode 100644 index 0000000..4b85acf --- /dev/null +++ b/text_element_base/i18n/nl.po @@ -0,0 +1,357 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * text_element_base +# +# Weblate Translation Memory , 2025. +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-08-31 23:20+0000\n" +"PO-Revision-Date: 2025-10-21 09:47+0000\n" +"Last-Translator: Weblate Translation Memory \n" +"Language-Team: Dutch \n" +"Language: nl\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 5.13.3\n" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__active +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__active +msgid "Active" +msgstr "Actief" + +#. module: text_element_base +#. odoo-python +#: code:addons/text_element_base/models/text_element_abstract.py:0 +#: code:addons/text_element_base/wizards/add_text_element_wizard.py:0 +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Add Text Element" +msgstr "" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_add_text_element_wizard +msgid "Add Text Element on record" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__page_break_after +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__page_break_after +msgid "Add a page break after element" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__page_break_before +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__page_break_before +msgid "Add a page break before element" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Add and Close" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Add and Continue" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_simplified_list_view +msgid "Add text element to custom elements" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__after_line +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__after_line +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "After Lines (if applicable)" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__after +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__after +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "After the document" +msgstr "" + +#. module: text_element_base +#: model:ir.ui.menu,name:text_element_base.text_element_menu_category +msgid "All Elements" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__model_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__model_id +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Applies to" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__filter_domain +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__filter_domain +msgid "Apply on" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Archived" +msgstr "Gearchiveerd" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__before_line +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__before_line +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Before Lines (if applicable)" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__before +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__before +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Before the document" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_ir_model__can_be_used_with_text_elements +msgid "Can Be Used With Text Elements" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Close" +msgstr "Sluiten" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__company_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__company_id +msgid "Company" +msgstr "Bedrijf" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__content +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__content +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "Content" +msgstr "Inhoud" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__context_params +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__context_params +msgid "Context Params" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__create_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element__create_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__create_uid +msgid "Created by" +msgstr "Gemaakt door" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__create_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element__create_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__create_date +msgid "Created on" +msgstr "Gemaakt op" + +#. module: text_element_base +#: model:ir.actions.act_window,name:text_element_base.text_element_custom_action +#: model:ir.model.fields,field_description:text_element_base.field_text_element_abstract__text_element_custom_ids +#: model:ir.ui.menu,name:text_element_base.text_element_custom_menu +msgid "Custom Text Elements" +msgstr "Tekstelementen (op maat)" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_text_element_custom +msgid "Custom text elements" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__default +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__default +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Default" +msgstr "Standaard" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__display_name +#: model:ir.model.fields,field_description:text_element_base.field_text_element__display_name +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__display_name +msgid "Display Name" +msgstr "Weergavenaam" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "Dynamic placerholder generator" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__field_placeholder_generator +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__field_placeholder_generator +msgid "Field Placeholder Generator" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__field_placeholder_generator_name +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__field_placeholder_generator_name +msgid "Field Placeholder Generator Name" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Group By" +msgstr "Groeperen op" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__id +#: model:ir.model.fields,field_description:text_element_base.field_text_element__id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__id +msgid "ID" +msgstr "ID" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__write_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element__write_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__write_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element__write_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_ir_model +msgid "Models" +msgstr "Modellen" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__name +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__name +msgid "Name" +msgstr "Naam" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__sequence +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__sequence +msgid "Order of displayed text elements in the report." +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "Others informations" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__page_break_after +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__page_break_after +msgid "Page Break After" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__page_break_before +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__page_break_before +msgid "Page Break Before" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__context_params +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__context_params +msgid "" +"Params have to be separated with semicolon and can be prefixed " +"withexclamation mark (e.g proforma;!proforma)" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__position +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__position +msgid "Position" +msgstr "Positie" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__res_id +msgid "Record ID" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__model +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__model +msgid "Related Document Model" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_simplified_list_view +msgid "Remove text element" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__res_id +msgid "Res" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__sequence +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__sequence +msgid "Sequence" +msgstr "Reeks" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__text_element_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__text_element_id +msgid "Text Element" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__text_element_domain +msgid "Text Element Domain" +msgstr "" + +#. module: text_element_base +#: model:ir.actions.act_window,name:text_element_base.text_element_action +#: model:ir.model.fields,field_description:text_element_base.field_text_element_abstract__text_element_ids +#: model:ir.ui.menu,name:text_element_base.text_element_menu +#: model:ir.ui.menu,name:text_element_base.text_element_menu_root +msgid "Text Elements" +msgstr "Tekstelementen" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_text_element +msgid "Text elements" +msgstr "" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_text_element_abstract +msgid "Text elements (Abstract)" +msgstr "" + +#. module: text_element_base +#. odoo-python +#: code:addons/text_element_base/models/text_element.py:0 +msgid "The field %s must a many2one in order to use subfields" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__user_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__user_id +msgid "User" +msgstr "Gebruiker" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "e.g. Contact" +msgstr "" diff --git a/text_element_base/i18n/text_element_base.pot b/text_element_base/i18n/text_element_base.pot new file mode 100644 index 0000000..9884313 --- /dev/null +++ b/text_element_base/i18n/text_element_base.pot @@ -0,0 +1,350 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * text_element_base +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\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: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__active +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__active +msgid "Active" +msgstr "" + +#. module: text_element_base +#. odoo-python +#: code:addons/text_element_base/models/text_element_abstract.py:0 +#: code:addons/text_element_base/wizards/add_text_element_wizard.py:0 +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Add Text Element" +msgstr "" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_add_text_element_wizard +msgid "Add Text Element on record" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__page_break_after +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__page_break_after +msgid "Add a page break after element" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__page_break_before +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__page_break_before +msgid "Add a page break before element" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Add and Close" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Add and Continue" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_simplified_list_view +msgid "Add text element to custom elements" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__after_line +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__after_line +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "After Lines (if applicable)" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__after +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__after +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "After the document" +msgstr "" + +#. module: text_element_base +#: model:ir.ui.menu,name:text_element_base.text_element_menu_category +msgid "All Elements" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__model_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__model_id +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Applies to" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__filter_domain +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__filter_domain +msgid "Apply on" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Archived" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__before_line +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__before_line +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Before Lines (if applicable)" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element__position__before +#: model:ir.model.fields.selection,name:text_element_base.selection__text_element_custom__position__before +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Before the document" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_ir_model__can_be_used_with_text_elements +msgid "Can Be Used With Text Elements" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.add_text_element_wizard_form_view +msgid "Close" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__company_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__company_id +msgid "Company" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__content +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__content +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "Content" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__context_params +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__context_params +msgid "Context Params" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__create_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element__create_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__create_uid +msgid "Created by" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__create_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element__create_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__create_date +msgid "Created on" +msgstr "" + +#. module: text_element_base +#: model:ir.actions.act_window,name:text_element_base.text_element_custom_action +#: model:ir.model.fields,field_description:text_element_base.field_text_element_abstract__text_element_custom_ids +#: model:ir.ui.menu,name:text_element_base.text_element_custom_menu +msgid "Custom Text Elements" +msgstr "" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_text_element_custom +msgid "Custom text elements" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__default +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__default +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Default" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__display_name +#: model:ir.model.fields,field_description:text_element_base.field_text_element__display_name +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__display_name +msgid "Display Name" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "Dynamic placerholder generator" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__field_placeholder_generator +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__field_placeholder_generator +msgid "Field Placeholder Generator" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__field_placeholder_generator_name +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__field_placeholder_generator_name +msgid "Field Placeholder Generator Name" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_search_view +msgid "Group By" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__id +#: model:ir.model.fields,field_description:text_element_base.field_text_element__id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__id +msgid "ID" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__write_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element__write_uid +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__write_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element__write_date +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__write_date +msgid "Last Updated on" +msgstr "" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_ir_model +msgid "Models" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__name +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__name +msgid "Name" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__sequence +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__sequence +msgid "Order of displayed text elements in the report." +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "Others informations" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__page_break_after +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__page_break_after +msgid "Page Break After" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__page_break_before +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__page_break_before +msgid "Page Break Before" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,help:text_element_base.field_text_element__context_params +#: model:ir.model.fields,help:text_element_base.field_text_element_custom__context_params +msgid "" +"Params have to be separated with semicolon and can be prefixed " +"withexclamation mark (e.g proforma;!proforma)" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__position +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__position +msgid "Position" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__res_id +msgid "Record ID" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__model +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__model +msgid "Related Document Model" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_simplified_list_view +msgid "Remove text element" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__res_id +msgid "Res" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__sequence +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__sequence +msgid "Sequence" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__text_element_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__text_element_id +msgid "Text Element" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_add_text_element_wizard__text_element_domain +msgid "Text Element Domain" +msgstr "" + +#. module: text_element_base +#: model:ir.actions.act_window,name:text_element_base.text_element_action +#: model:ir.model.fields,field_description:text_element_base.field_text_element_abstract__text_element_ids +#: model:ir.ui.menu,name:text_element_base.text_element_menu +#: model:ir.ui.menu,name:text_element_base.text_element_menu_root +msgid "Text Elements" +msgstr "" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_text_element +msgid "Text elements" +msgstr "" + +#. module: text_element_base +#: model:ir.model,name:text_element_base.model_text_element_abstract +msgid "Text elements (Abstract)" +msgstr "" + +#. module: text_element_base +#. odoo-python +#: code:addons/text_element_base/models/text_element.py:0 +msgid "The field %s must a many2one in order to use subfields" +msgstr "" + +#. module: text_element_base +#: model:ir.model.fields,field_description:text_element_base.field_text_element__user_id +#: model:ir.model.fields,field_description:text_element_base.field_text_element_custom__user_id +msgid "User" +msgstr "" + +#. module: text_element_base +#: model_terms:ir.ui.view,arch_db:text_element_base.text_element_form_view +msgid "e.g. Contact" +msgstr "" diff --git a/text_element_base/models/__init__.py b/text_element_base/models/__init__.py new file mode 100644 index 0000000..4b7f9f6 --- /dev/null +++ b/text_element_base/models/__init__.py @@ -0,0 +1,4 @@ +from . import ir_model +from . import text_element +from . import text_element_abstract +from . import text_element_custom diff --git a/text_element_base/models/ir_model.py b/text_element_base/models/ir_model.py new file mode 100644 index 0000000..e5a0b41 --- /dev/null +++ b/text_element_base/models/ir_model.py @@ -0,0 +1,11 @@ +# Copyright 2009-2023 Noviat +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + + +from odoo import fields, models + + +class IrModel(models.Model): + _inherit = "ir.model" + + can_be_used_with_text_elements = fields.Boolean() diff --git a/text_element_base/models/text_element.py b/text_element_base/models/text_element.py new file mode 100644 index 0000000..2795f4f --- /dev/null +++ b/text_element_base/models/text_element.py @@ -0,0 +1,276 @@ +# Copyright 2009-2023 Noviat +# License AGPL-3.0 or later (httpS://www.gnu.org/licenses/agpl). + +import datetime +import logging +import re + +from odoo import Command, api, fields, models +from odoo.exceptions import UserError +from odoo.tools.safe_eval import safe_eval + +_logger = logging.getLogger(__name__) + + +class TextElement(models.Model): + _name = "text.element" + _description = "Text elements" + _order = "position desc, sequence, id" + _check_company_auto = True + + name = fields.Char(required=True, translate=True) + content = fields.Html( + translate=True, + sanitize=False, + ) + position = fields.Selection( + [ + ("before", "Before the document"), + ("before_line", "Before Lines (if applicable)"), + ("after_line", "After Lines (if applicable)"), + ("after", "After the document"), + ], + default="before", + ) + page_break_before = fields.Boolean(help="Add a page break before element") + page_break_after = fields.Boolean(help="Add a page break after element") + sequence = fields.Integer(help="Order of displayed text elements in the report.") + default = fields.Boolean() + company_id = fields.Many2one( + comodel_name="res.company", + default=lambda self: self.env.company, + ) + user_id = fields.Many2one( + comodel_name="res.users", + string="User", + required=False, + ) + active = fields.Boolean(default=True) + model_id = fields.Many2one( + comodel_name="ir.model", + string="Applies to", + ondelete="cascade", + domain="[('can_be_used_with_text_elements','=', True)]", + ) + model = fields.Char( + "Related Document Model", + related="model_id.model", + index=True, + store=True, + readonly=True, + ) + filter_domain = fields.Char( + string="Apply on", compute="_compute_filter_domain", store=True, readonly=False + ) + field_placeholder_generator = fields.Char(store=False) + field_placeholder_generator_name = fields.Char( + compute="_compute_field_placeholder_generator_name" + ) + context_params = fields.Char( + help="Params have to be separated with " + "semicolon and can be prefixed with" + "exclamation mark (e.g proforma;!proforma)" + ) + + @api.model + def _selection_lang_get(self): + return self.env["res.lang"].get_installed() + + @api.depends("model_id") + def _compute_filter_domain(self): + for record in self: + if not record.model_id: + record.filter_domain = False + + @api.depends( + "field_placeholder_generator", + ) + def _compute_field_placeholder_generator_name(self): + for record in self: + if record.field_placeholder_generator: + record.field_placeholder_generator_name = ( + f"[[{record.field_placeholder_generator}]]" + ) + else: + record.field_placeholder_generator_name = False + + def action_add_text_element_to_custom(self): + self.ensure_one() + model_id, current_record = self._get_active_record() + if model_id and current_record: + values = { + "name": self.name, + "content": self.content, + "position": self.position, + "page_break_before": self.page_break_before, + "page_break_after": self.page_break_after, + "sequence": self.sequence, + "model_id": model_id, + "res_id": self.env.context.get("active_id"), + "text_element_id": self.id, + } + self.env["text.element.custom"].create(values) + current_record.write({"text_element_ids": [Command.unlink(self.id)]}) + + def action_remove(self): + model_id, current_record = self._get_active_record() + if model_id and current_record: + current_record.write({"text_element_ids": [(3, self.id)]}) + return + + @api.model + def _get_formated_value(self, value, lang, field_type="str", options=""): + if value is None or value == "": + return "" + if field_type == "datetime": + if options == "date": + options = {"date_only": True} + elif options == "time": + options = {"time_only": True} + elif options == "full_date": + options = {"format": "d MMMM yyyy"} + else: + options = {} + return ( + self.env["ir.qweb.field.datetime"] + .with_context(lang=lang) + .value_to_html(value, options) + ) + elif field_type == "date": + if options == "full": + options = {"format": "d MMMM yyyy"} + else: + options = {} + return ( + self.env["ir.qweb.field.date"] + .with_context(lang=lang) + .value_to_html(value, options) + ) + elif field_type == "binary": + return self.env["ir.qweb.field.image"].value_to_html(value, {}) + elif isinstance(value, int): + return self.env["ir.qweb.field.integer"].value_to_html(value, {}) + elif isinstance(value, float): + return self.env["ir.qweb.field.float"].value_to_html( + value, {"precision": 2} + ) + elif not isinstance(value, str): + return str(value) + else: + return value + + def _get_content_interpreted(self, record): + self.ensure_one() + if self.content: + orm_fields = record.fields_get() + fields_found = re.findall(r"\[\[([^\]\]]*)\]\]*", self.content) + content_interpreted = self.content + for field_found in fields_found: + value = self._get_value_for_field( + record, field_found, orm_fields, self.env.lang + ) + if value: + content_interpreted = content_interpreted.replace( + "[[" + field_found + "]]", value + ) + else: + content_interpreted = content_interpreted.replace( + "[[" + field_found + "]]", "" + ) + return content_interpreted + return "" + + def _get_value_for_field(self, record, field_found, orm_fields, lang): + value = "" + sub_fields = field_found.split(".") + if len(sub_fields) > 2: + field_options = field_found.split("::") + if len(field_options) > 1: + field = safe_eval(f"record.{field_options[0]}", {"record": record}) + option = field_options[1] + value = self._get_formated_value( + field, + lang, + self._get_field_type(field), + option, + ) + else: + field = safe_eval(f"record.{field_found}", {"record": record}) + value = self._get_formated_value( + field, + lang, + self._get_field_type(field), + ) + return value + elif len(sub_fields) == 2: + field = sub_fields[0] + subfield = sub_fields[1] + if field in orm_fields and orm_fields[field].get("type", "") != "many2one": + raise UserError( + self.env._( + "The field %s must a many2one in order to use subfields", field + ) + ) + subrecord = getattr(record, field) + if subrecord: + orm_sub_fields = subrecord.fields_get() + subfield_options = subfield.split("::") + if len(subfield_options) > 1: + subfield = subfield_options[0] + subfield_option = subfield_options[1] + else: + subfield = subfield_options[0] + subfield_option = "" + value = self._get_formated_value( + getattr(subrecord, subfield), + lang, + orm_sub_fields[subfield].get("type", ""), + subfield_option, + ) + else: + field_options = field_found.split("::") + if len(field_options) > 1: + field = field_options[0] + option = field_options[1] + else: + field = field_options[0] + option = "" + value = self._get_formated_value( + getattr(record, field), + lang, + orm_fields[field].get("type", ""), + option, + ) + return value + + def _get_active_record(self): + if self.env.context.get("active_model", False): + model = self.env.context.get("active_model") + elif self.env.context.get("default_res_model", False): + model = self.env.context.get("default_res_model") + else: + model = False + if self.env.context.get("active_id", False): + active_id = self.env.context.get("active_id") + elif self.env.context.get("default_res_id", False): + active_id = self.env.context.get("default_res_id") + else: + active_id = False + if model: + model_id = self.env["ir.model"]._get_id(model) + else: + model_id = False + if model and active_id: + current_record = self.env[model].browse(active_id) + else: + current_record = False + return model_id, current_record + + @api.model + def _get_field_type(self, field_object): + if isinstance(field_object, datetime.datetime): + return "datetime" + if isinstance(field_object, datetime.date): + return "date" + else: + return "str" diff --git a/text_element_base/models/text_element_abstract.py b/text_element_base/models/text_element_abstract.py new file mode 100644 index 0000000..aea126f --- /dev/null +++ b/text_element_base/models/text_element_abstract.py @@ -0,0 +1,128 @@ +# Copyright 2009-2023 Noviat +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import logging + +from odoo import fields, models +from odoo.tools.safe_eval import safe_eval + +_logger = logging.getLogger(__name__) + + +class TextElement(models.AbstractModel): + _name = "text.element.abstract" + _description = "Text elements (Abstract)" + + text_element_ids = fields.Many2many( + comodel_name="text.element", + string="Text Elements", + copy=True, + compute="_compute_text_elements", + store=True, + readonly=False, + ) + text_element_custom_ids = fields.One2many( + comodel_name="text.element.custom", + inverse_name="res_id", + string="Custom Text Elements", + copy=True, + ) + + def _compute_text_elements(self): + for record in self: + elements = self.env["text.element"].search( + record._get_computed_elements_domain() + ) + record.text_element_ids = elements + + def action_add_element_wizard(self): + self.ensure_one() + return { + "name": self.env._("Add Text Element"), + "type": "ir.actions.act_window", + "view_mode": "form", + "res_model": "add.text.element.wizard", + "target": "new", + } + + def action_reload_default_text_elements(self): + self._compute_text_elements() + + def _get_computed_elements_domain(self): + self.ensure_one() + domain = [ + ("default", "=", True), + "|", + ("model", "=", self._name), + ("model", "=", False), + "|", + ("user_id", "=", False), + ("user_id", "=", self.env.user.id), + ] + if "company_id" in self._fields: + domain.append(("company_id", "in", (self.company_id.id, False))) + return domain + + def _get_text_elements(self, position): + self.ensure_one() + text_elements, custom_text_elements = self._get_text_element_records(position) + text_elements_list = [] + for element in text_elements: + text_elements_list.append(element) + for element in custom_text_elements: + text_elements_list.append(element) + return sorted(text_elements_list, key=lambda e: e.sequence) + + def _get_text_element_records(self, position): + text_elements = self.text_element_ids.filtered(lambda r: r.position == position) + custom_text_elements = self.text_element_custom_ids.filtered( + lambda r: r.position == position + ) + text_elements = self._get_text_element_records_filter_domain(text_elements) + custom_text_elements = self._get_text_element_records_filter_domain( + custom_text_elements + ) + text_elements = self._get_text_element_records_context_params(text_elements) + custom_text_elements = self._get_text_element_records_context_params( + custom_text_elements + ) + return text_elements, custom_text_elements + + def _get_text_element_records_filter_domain(self, text_elements): + if text_elements._name == "text.element": + new_text_elements = self.env["text.element"] + else: + new_text_elements = self.env["text.element.custom"] + for text_element in text_elements: + if text_element.filter_domain: + domain = safe_eval(text_element.filter_domain) + record = self.sudo().filtered_domain(domain) + if record: + new_text_elements |= text_element + else: + new_text_elements |= text_element + return new_text_elements + + def _get_text_element_records_context_params(self, text_elements): + if text_elements._name == "text.element": + new_text_elements = self.env["text.element"] + else: + new_text_elements = self.env["text.element.custom"] + for text_element in text_elements: + if text_element.context_params: + element_valid = True + for context_param in text_element.context_params.split(";"): + not_context = False + context = context_param + if context_param.startswith("!"): + not_context = True + context = context_param[1:] + if not_context and self.env.context.get(context, False): + element_valid = False + if not not_context and not self.env.context.get(context, False): + element_valid = False + if element_valid: + new_text_elements |= text_element + else: + new_text_elements |= text_element + return new_text_elements diff --git a/text_element_base/models/text_element_custom.py b/text_element_base/models/text_element_custom.py new file mode 100644 index 0000000..9efe2c3 --- /dev/null +++ b/text_element_base/models/text_element_custom.py @@ -0,0 +1,21 @@ +# Copyright 2009-2023 Noviat +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class TextElementCustom(models.Model): + _name = "text.element.custom" + _inherit = [ + "text.element", + ] + _description = "Custom text elements" + _order = "sequence, id" + _check_company_auto = True + + res_id = fields.Many2oneReference( + required=True, model_field="model", string="Record ID" + ) + text_element_id = fields.Many2one( + comodel_name="text.element", string="Text Element" + ) diff --git a/text_element_base/pyproject.toml b/text_element_base/pyproject.toml new file mode 100644 index 0000000..4231d0c --- /dev/null +++ b/text_element_base/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/text_element_base/readme/CONFIGURE.md b/text_element_base/readme/CONFIGURE.md new file mode 100644 index 0000000..e69de29 diff --git a/text_element_base/readme/CONTEXT.md b/text_element_base/readme/CONTEXT.md new file mode 100644 index 0000000..ff26b97 --- /dev/null +++ b/text_element_base/readme/CONTEXT.md @@ -0,0 +1,7 @@ +This module was developed to enhance PDF documents and eliminate the need for developers to add specific information to a document. + +## **For example:** + +* During the summer period, it allows you to add a note indicating a closure. +* If your company has multiple departments with specific mentions or texts for each, the module facilitates their customization based on the relevant department. +* If legal mentions need to be added depending on the document’s status (e.g., on a quotation), the module enables their automatic insertion. diff --git a/text_element_base/readme/CONTRIBUTORS.md b/text_element_base/readme/CONTRIBUTORS.md new file mode 100644 index 0000000..47c57eb --- /dev/null +++ b/text_element_base/readme/CONTRIBUTORS.md @@ -0,0 +1,6 @@ +* **Elneo** (https://www.elneo.com/) + * Loic Grifnée (https://github.com/loicgrifnee) +* **Noviat** (https://noviat.com/) + * Benjamin Henquet (https://github.com/BenjaHe) +* **NSI SA** (https://www.nsi-sa.be/) +* Jérémy Didderen (https://github.com/jdidderen) diff --git a/text_element_base/readme/CREDITS.md b/text_element_base/readme/CREDITS.md new file mode 100644 index 0000000..509080a --- /dev/null +++ b/text_element_base/readme/CREDITS.md @@ -0,0 +1,4 @@ +The module was initially developed by the company Elneo (https://www.elneo.com/) in version 8.0 and later migrated to version 13.0. + +It was then taken over by Noviat, with Elneo's approval, to be refactored and made generic. + diff --git a/text_element_base/readme/DESCRIPTION.md b/text_element_base/readme/DESCRIPTION.md new file mode 100644 index 0000000..720fb79 --- /dev/null +++ b/text_element_base/readme/DESCRIPTION.md @@ -0,0 +1,4 @@ +The suite of **Text Element modules** allow for dynamic customization of PDF documents in Odoo without requiring technical intervention. + +Every company has specific needs when it comes to commercial and administrative documents. +Whether it's adding legal notices, temporary announcements, or personalized messages, this module provides an intuitive and efficient solution to adapt document content based on the business context. diff --git a/text_element_base/readme/USAGE.md b/text_element_base/readme/USAGE.md new file mode 100644 index 0000000..e69de29 diff --git a/text_element_base/security/ir.model.access.csv b/text_element_base/security/ir.model.access.csv new file mode 100644 index 0000000..30a8720 --- /dev/null +++ b/text_element_base/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +text_element_base.access_text_element,access_text_element,text_element_base.model_text_element,base.group_user,1,1,1,1 +text_element_base.access_text_element_custom,access_text_element_custom,text_element_base.model_text_element_custom,base.group_user,1,1,1,1 +text_element_base.access_add_text_element_wizard,access_add_text_element_wizard,text_element_base.model_add_text_element_wizard,base.group_user,1,1,1,1 diff --git a/text_element_base/security/text_element_security.xml b/text_element_base/security/text_element_security.xml new file mode 100644 index 0000000..aa84854 --- /dev/null +++ b/text_element_base/security/text_element_security.xml @@ -0,0 +1,18 @@ + + + + + Text Element - Multi-Company + + ['|', ('company_id','=',False), ('company_id', 'in', company_ids)] + + + Custom Text Element - Multi-Company + + ['|', ('company_id','=',False), ('company_id', 'in', company_ids)] + + diff --git a/text_element_base/static/description/icon.png b/text_element_base/static/description/icon.png new file mode 100644 index 0000000..e44f715 Binary files /dev/null and b/text_element_base/static/description/icon.png differ diff --git a/text_element_base/static/description/index.html b/text_element_base/static/description/index.html new file mode 100644 index 0000000..1389a87 --- /dev/null +++ b/text_element_base/static/description/index.html @@ -0,0 +1,470 @@ + + + + + +Text Elements - Base module + + + +
+

Text Elements - Base module

+ + +

Beta License: AGPL-3 jdidderen/odoo-text-elements

+

The suite of Text Element modules allow for dynamic customization of +PDF documents in Odoo without requiring technical intervention.

+

Every company has specific needs when it comes to commercial and +administrative documents. Whether it’s adding legal notices, temporary +announcements, or personalized messages, this module provides an +intuitive and efficient solution to adapt document content based on the +business context.

+

Table of contents

+ +
+

Use Cases / Context

+

This module was developed to enhance PDF documents and eliminate the +need for developers to add specific information to a document.

+
+

For example:

+
    +
  • During the summer period, it allows you to add a note indicating a +closure.
  • +
  • If your company has multiple departments with specific mentions or +texts for each, the module facilitates their customization based on +the relevant department.
  • +
  • If legal mentions need to be added depending on the document’s status +(e.g., on a quotation), the module enables their automatic insertion.
  • +
+
+
+ +
+

Usage

+
+
+

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

+
    +
  • Noviat
  • +
  • Elneo
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

The module was initially developed by the company Elneo +(https://www.elneo.com/) in version 8.0 and later migrated to version +13.0.

+

It was then taken over by Noviat, with Elneo’s approval, to be +refactored and made generic.

+
+
+

Maintainers

+

This module is part of the jdidderen/odoo-text-elements project on GitHub.

+

You are welcome to contribute.

+
+
+
+ + diff --git a/text_element_base/static/description/text_element_base.png b/text_element_base/static/description/text_element_base.png new file mode 100644 index 0000000..2b308d6 Binary files /dev/null and b/text_element_base/static/description/text_element_base.png differ diff --git a/text_element_base/static/description/usage.mp4 b/text_element_base/static/description/usage.mp4 new file mode 100644 index 0000000..d7400fc Binary files /dev/null and b/text_element_base/static/description/usage.mp4 differ diff --git a/text_element_base/views/ir_model_views.xml b/text_element_base/views/ir_model_views.xml new file mode 100644 index 0000000..2f90d09 --- /dev/null +++ b/text_element_base/views/ir_model_views.xml @@ -0,0 +1,13 @@ + + + + ir.model.text.element.inherit.form + ir.model + + + + + + + + diff --git a/text_element_base/views/menus.xml b/text_element_base/views/menus.xml new file mode 100644 index 0000000..52acb99 --- /dev/null +++ b/text_element_base/views/menus.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/text_element_base/views/report_templates.xml b/text_element_base/views/report_templates.xml new file mode 100644 index 0000000..5529c8a --- /dev/null +++ b/text_element_base/views/report_templates.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + diff --git a/text_element_base/views/text_element_custom_views.xml b/text_element_base/views/text_element_custom_views.xml new file mode 100644 index 0000000..2be1e5a --- /dev/null +++ b/text_element_base/views/text_element_custom_views.xml @@ -0,0 +1,80 @@ + + + + text.element.custom.form + text.element.custom + + primary + + + 1 + + + + + + + + + text.element.custom.list + text.element.custom + + primary + + + + + + + + + text.element.custom.simplified.form + text.element.custom + + primary + 999 + + + 1 + + + 1 + + + + + + text.element.custom.simplified.list + text.element.custom + + primary + 999 + + + 1 + + + 1 + + + + + + Custom Text Elements + text.element.custom + list,form + + + + diff --git a/text_element_base/views/text_element_views.xml b/text_element_base/views/text_element_views.xml new file mode 100644 index 0000000..60f027a --- /dev/null +++ b/text_element_base/views/text_element_views.xml @@ -0,0 +1,236 @@ + + + + text.element.form + text.element + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + text.element.list + text.element + + + + + + + + + + + + + + + + + + + + text.element.search + text.element + + + + + + + + + + + + + + + + + + + + + + + text.element.simplified.form + text.element + + primary + 999 + + + 1 + + + + + + text.element.simplified.list + text.element + + primary + 999 + + + 1 + + +