diff --git a/sale_order_note_template/README.rst b/sale_order_note_template/README.rst new file mode 100644 index 00000000000..0b6bd3031be --- /dev/null +++ b/sale_order_note_template/README.rst @@ -0,0 +1,73 @@ +========================================== +Sale Orders Terms and conditions Templates +========================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/sale-workflow/tree/14.0/sale_order_note_template + :alt: OCA/sale-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/sale-workflow-14-0/sale-workflow-14-0-sale_order_note_template + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/167/14.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module add sale order terms and conditions templates and change existing +terms and conditions (`sale_order.note`) field type from `Text` to `Html`. + +Users will be able to select *terms and conditions template* to fulfill *terms and +conditions* likes in mail composer users can configure their template using +`jinja2`. + +**Table of contents** + +.. contents:: + :local: + +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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Pierre Verkest + +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/sale-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_order_note_template/__init__.py b/sale_order_note_template/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/sale_order_note_template/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/sale_order_note_template/__manifest__.py b/sale_order_note_template/__manifest__.py new file mode 100644 index 00000000000..4b31b2bf8b7 --- /dev/null +++ b/sale_order_note_template/__manifest__.py @@ -0,0 +1,22 @@ +# © 2020 Pierre Verkest ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Sale Orders Terms and conditions Templates", + "summary": "Add sale orders terms and conditions template that can be " + "used to quickly fullfill sale order terms and conditions", + "category": "Sales/Sales", + "version": "14.0.1.0.0", + "author": "Pierre Verkest,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/sale-workflow", + "license": "AGPL-3", + "depends": [ + "sale_management", + ], + "data": [ + "views/sale_terms_template.xml", + "views/sale_views.xml", + "security/ir.model.access.csv", + ], + "installable": True, +} diff --git a/sale_order_note_template/models/__init__.py b/sale_order_note_template/models/__init__.py new file mode 100644 index 00000000000..e2c356f3376 --- /dev/null +++ b/sale_order_note_template/models/__init__.py @@ -0,0 +1 @@ +from . import sale_terms_template, sale_order diff --git a/sale_order_note_template/models/sale_order.py b/sale_order_note_template/models/sale_order.py new file mode 100644 index 00000000000..0f66f9daaa4 --- /dev/null +++ b/sale_order_note_template/models/sale_order.py @@ -0,0 +1,22 @@ +# Copyright 2021 Pierre Verkest +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class SaleOrder(models.Model): + + _inherit = "sale.order" + + terms_template_id = fields.Many2one( + "sale.terms_template", + string="Terms and conditions template", + readonly=True, + states={"draft": [("readonly", False)]}, + ) + note = fields.Html(readonly=True, states={"draft": [("readonly", False)]}) + + @api.onchange("terms_template_id") + def _onchange_terms_template_id(self): + if self.terms_template_id: + self.note = self.terms_template_id.get_value(self) diff --git a/sale_order_note_template/models/sale_terms_template.py b/sale_order_note_template/models/sale_terms_template.py new file mode 100644 index 00000000000..d6635c1f031 --- /dev/null +++ b/sale_order_note_template/models/sale_terms_template.py @@ -0,0 +1,50 @@ +# Copyright 2014 Guewen Baconnier (Camptocamp SA) +# Copyright 2013-2014 Nicolas Bessi (Camptocamp SA) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import fields, models + + +class SaleTermsTemplate(models.Model): + _name = "sale.terms_template" + _description = "Sale terms template" + + active = fields.Boolean(default=True) + + name = fields.Char( + string="Name", + required=True, + ) + + text = fields.Html( + string="Terms template", + translate=True, + ) + + def get_value(self, sale_order, add_context=None, post_process=True): + """Get sales terms from template. + + Like in mail composer `text` template can use jinja or qweb syntax. + + if `partner_id` is provide, it will retreive it's lang to use the + right translation. + + Then template is populated with model/res_id attributes according + jinja/qweb instructions. + + :param sale_order: recordset (browsed) sale order + :param add_context: context forwarded to the templating engine + :param post_process: what ever to use `post_process` from the templating + engine. If `True` urls are transform to absolute urls + """ + self.ensure_one() + sale_order.ensure_one() + lang = sale_order.partner_id.lang if sale_order.partner_id else None + return self.env["mail.render.mixin"]._render_template( + self.with_context(lang=lang).text, + "sale.order", + [sale_order.id], + engine="jinja", + add_context=add_context, + post_process=post_process, + )[sale_order.id] diff --git a/sale_order_note_template/readme/CONTRIBUTOR.rst b/sale_order_note_template/readme/CONTRIBUTOR.rst new file mode 100644 index 00000000000..eb1981f9b64 --- /dev/null +++ b/sale_order_note_template/readme/CONTRIBUTOR.rst @@ -0,0 +1 @@ +* Pierre Verkest diff --git a/sale_order_note_template/readme/DESCRIPTION.rst b/sale_order_note_template/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..225b1ed3576 --- /dev/null +++ b/sale_order_note_template/readme/DESCRIPTION.rst @@ -0,0 +1,24 @@ +This module add sale terms and conditions templates and change existing terms +and conditions (`sale_order.note`) field type from `Text` to `Html`. + +Users will be able to select *terms and conditions template* to fulfill *terms and +conditions* likes in mail composer users can configure their template using +`jinja2`. + + +How this module differ from `sale_comment_template`_? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +* `base_comment_template`_ is for managing comments not terms, it would probably + see as mess for users to mixed terms and comments. + +* `sale_comment_template`_ depends on `account_comment_template`_ comments are + forwards to generated invoices, here we don't really display sales terms on + final invoices + +* `base_comment_template`_ at the time writing do not support template engine + + +.. _base_comment_template: https://github.com/OCA/reporting-engine/tree/14.0/base_comment_template +.. _sale_comment_template: https://github.com/OCA/sale-reporting/tree/14.0/sale_comment_template +.. _account_comment_template: https://github.com/OCA/account-invoice-reporting/tree/14.0/account_comment_template diff --git a/sale_order_note_template/readme/ROADMAP.rst b/sale_order_note_template/readme/ROADMAP.rst new file mode 100644 index 00000000000..8c4b41b53fe --- /dev/null +++ b/sale_order_note_template/readme/ROADMAP.rst @@ -0,0 +1,2 @@ +* add a post_init_hook and / or a uninstall_hook to handle correctly the conversion (Text <--> Html). +* support qweb report templating engine diff --git a/sale_order_note_template/security/ir.model.access.csv b/sale_order_note_template/security/ir.model.access.csv new file mode 100644 index 00000000000..c8df6760f93 --- /dev/null +++ b/sale_order_note_template/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_sale_terms_template_sale_manager,Access sale_terms_template sale manager,model_sale_terms_template,sales_team.group_sale_manager,1,1,1,1 +access_sale_terms_template_users,Access sale_terms_template users,model_sale_terms_template,base.group_user,1,0,0,0 diff --git a/sale_order_note_template/static/description/icon.png b/sale_order_note_template/static/description/icon.png new file mode 100644 index 00000000000..3a0328b516c Binary files /dev/null and b/sale_order_note_template/static/description/icon.png differ diff --git a/sale_order_note_template/tests/__init__.py b/sale_order_note_template/tests/__init__.py new file mode 100644 index 00000000000..056179f0768 --- /dev/null +++ b/sale_order_note_template/tests/__init__.py @@ -0,0 +1 @@ +from . import test_sale_terms_template, test_sale_order diff --git a/sale_order_note_template/tests/test_sale_order.py b/sale_order_note_template/tests/test_sale_order.py new file mode 100644 index 00000000000..0bf12dcde36 --- /dev/null +++ b/sale_order_note_template/tests/test_sale_order.py @@ -0,0 +1,20 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.tests.common import TransactionCase + + +class TestSaleOrder(TransactionCase): + def setUp(self): + super().setUp() + self.term_template = self.env["sale.terms_template"].create( + { + "name": "My terms and conditions template", + "text": "

Terms template ${object.partner_id.name}

", + } + ) + self.sale_order = self.env.ref("sale.sale_order_2") + + def test_on_change_term_template(self): + self.assertEqual(self.sale_order.note, "") + self.sale_order.terms_template_id = self.term_template + self.sale_order._onchange_terms_template_id() + self.assertEqual(self.sale_order.note, "

Terms template Ready Mat

") diff --git a/sale_order_note_template/tests/test_sale_terms_template.py b/sale_order_note_template/tests/test_sale_terms_template.py new file mode 100644 index 00000000000..a112be29e13 --- /dev/null +++ b/sale_order_note_template/tests/test_sale_terms_template.py @@ -0,0 +1,31 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo.tests.common import TransactionCase + + +class TestSaleTermsTemplate(TransactionCase): + def setUp(self): + super().setUp() + self.term_template = self.env["sale.terms_template"].create( + { + "name": "My terms and conditions template", + "text": "

Terms template ${object.partner_id.name}

", + } + ) + self.sale_order = self.env.ref("sale.sale_order_2") + + def test_get_value(self): + self.assertEqual( + self.term_template.get_value(self.sale_order), + "

Terms template Ready Mat

", + ) + + def test_get_value_with_translation(self): + self.env["res.lang"]._activate_lang("fr_BE") + self.sale_order.partner_id.lang = "fr_BE" + self.term_template.with_context(lang="fr_BE").write( + {"text": "

Testing translated fr_BE `${object.partner_id.name}`

"} + ) + self.assertEqual( + self.term_template.get_value(self.sale_order), + "

Testing translated fr_BE `Ready Mat`

", + ) diff --git a/sale_order_note_template/views/sale_terms_template.xml b/sale_order_note_template/views/sale_terms_template.xml new file mode 100644 index 00000000000..3042272af5e --- /dev/null +++ b/sale_order_note_template/views/sale_terms_template.xml @@ -0,0 +1,66 @@ + + + + + sale.terms_template.search + sale.terms_template + + + + + + + + + sale.terms_template.form + sale.terms_template + +
+ +
+ +
+
+

+ +

+
+ + + +
+
+
+
+ + + sale.terms_template.list + sale.terms_template + + + + + + + + + + Terms and conditions template + ir.actions.act_window + sale.terms_template + tree,form + + + +
diff --git a/sale_order_note_template/views/sale_views.xml b/sale_order_note_template/views/sale_views.xml new file mode 100644 index 00000000000..71d4536a967 --- /dev/null +++ b/sale_order_note_template/views/sale_views.xml @@ -0,0 +1,20 @@ + + + sale_order_note_templatesale.order.form + sale.order + + + + + + + + diff --git a/setup/sale_order_note_template/odoo/addons/sale_order_note_template b/setup/sale_order_note_template/odoo/addons/sale_order_note_template new file mode 120000 index 00000000000..38f9569fc16 --- /dev/null +++ b/setup/sale_order_note_template/odoo/addons/sale_order_note_template @@ -0,0 +1 @@ +../../../../sale_order_note_template \ No newline at end of file diff --git a/setup/sale_order_note_template/setup.py b/setup/sale_order_note_template/setup.py new file mode 100644 index 00000000000..28c57bb6403 --- /dev/null +++ b/setup/sale_order_note_template/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)