From f8c64a5f0af092e8fda58dbd9353a8aada0e6257 Mon Sep 17 00:00:00 2001 From: Anjeel Haria Date: Tue, 7 May 2024 18:11:10 +0530 Subject: [PATCH 1/7] [ADD] purchase_sign pre-commit fixes Test fixes Removed unwanted check Removed unwanted check for access Reverted changes and updated test scripts pre-commit fix test fix test fix Test comment changes Added tests Removed commit --- purchase_sign/README.rst | 76 ++++ purchase_sign/__init__.py | 4 + purchase_sign/__manifest__.py | 23 + purchase_sign/controllers/__init__.py | 2 + purchase_sign/controllers/main.py | 75 ++++ purchase_sign/models/__init__.py | 4 + purchase_sign/models/purchase_order.py | 33 ++ purchase_sign/models/res_company.py | 11 + purchase_sign/models/res_config_settings.py | 12 + purchase_sign/readme/CONTRIBUTORS.rst | 1 + purchase_sign/readme/DESCRIPTION.rst | 1 + .../report/purchase_order_template.xml | 25 ++ purchase_sign/static/description/index.html | 423 ++++++++++++++++++ .../tests/tours/purchase_signature.esm.js | 57 +++ .../templates/purchase_portal_templates.xml | 154 +++++++ purchase_sign/tests/__init__.py | 2 + purchase_sign/tests/test_purchase_sign.py | 115 +++++ purchase_sign/views/purchase_view.xml | 29 ++ .../views/res_config_settings_view.xml | 31 ++ 19 files changed, 1078 insertions(+) create mode 100644 purchase_sign/README.rst create mode 100644 purchase_sign/__init__.py create mode 100644 purchase_sign/__manifest__.py create mode 100644 purchase_sign/controllers/__init__.py create mode 100644 purchase_sign/controllers/main.py create mode 100644 purchase_sign/models/__init__.py create mode 100644 purchase_sign/models/purchase_order.py create mode 100644 purchase_sign/models/res_company.py create mode 100644 purchase_sign/models/res_config_settings.py create mode 100644 purchase_sign/readme/CONTRIBUTORS.rst create mode 100644 purchase_sign/readme/DESCRIPTION.rst create mode 100644 purchase_sign/report/purchase_order_template.xml create mode 100644 purchase_sign/static/description/index.html create mode 100644 purchase_sign/static/tests/tours/purchase_signature.esm.js create mode 100644 purchase_sign/templates/purchase_portal_templates.xml create mode 100644 purchase_sign/tests/__init__.py create mode 100644 purchase_sign/tests/test_purchase_sign.py create mode 100644 purchase_sign/views/purchase_view.xml create mode 100644 purchase_sign/views/res_config_settings_view.xml diff --git a/purchase_sign/README.rst b/purchase_sign/README.rst new file mode 100644 index 00000000000..889ea037e19 --- /dev/null +++ b/purchase_sign/README.rst @@ -0,0 +1,76 @@ +============= +Purchase Sign +============= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:88ac5c691562f3453857db7210257da345b2b903c05d80b3ed305fab437b14b5 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fpurchase--workflow-lightgray.png?logo=github + :target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_sign + :alt: OCA/purchase-workflow +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_sign + :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/purchase-workflow&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to take online signatures from vendors to confirm purchase orders.It adds a global configuration (Online signature) which can be accessed through Purchase->Configuration->Settings and it can further be handled also on each of the purchase orders.When it is enabled, it shows a button 'Accept & Sign' on the portal to the vendors for RFQ which are sent by email to them.Once the vendor accepts and adds their signature, the RFQ gets confirmed into a purchase order + +**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 to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Onestein + +Contributors +~~~~~~~~~~~~ + +* `Onestein `__ + +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/purchase-workflow `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_sign/__init__.py b/purchase_sign/__init__.py new file mode 100644 index 00000000000..83b6211e516 --- /dev/null +++ b/purchase_sign/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2024 Onestein +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import controllers +from . import models diff --git a/purchase_sign/__manifest__.py b/purchase_sign/__manifest__.py new file mode 100644 index 00000000000..5d3cecc931b --- /dev/null +++ b/purchase_sign/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2024 Onestein () +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + "name": "Purchase Sign", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "category": "Purchase", + "author": "Onestein, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/purchase-workflow", + "depends": ["purchase"], + "data": [ + "report/purchase_order_template.xml", + "templates/purchase_portal_templates.xml", + "views/purchase_view.xml", + "views/res_config_settings_view.xml", + ], + "assets": { + "web.assets_tests": [ + "purchase_sign/static/tests/tours/purchase_signature.esm.js" + ], + }, +} diff --git a/purchase_sign/controllers/__init__.py b/purchase_sign/controllers/__init__.py new file mode 100644 index 00000000000..c1401fbe0ee --- /dev/null +++ b/purchase_sign/controllers/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +from . import main diff --git a/purchase_sign/controllers/main.py b/purchase_sign/controllers/main.py new file mode 100644 index 00000000000..66329125e4a --- /dev/null +++ b/purchase_sign/controllers/main.py @@ -0,0 +1,75 @@ +# Copyright 2024 Onestein +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import binascii + +from odoo import _, fields, http +from odoo.exceptions import AccessError, MissingError +from odoo.http import request + +from odoo.addons.portal.controllers.mail import _message_post_helper +from odoo.addons.portal.controllers.portal import CustomerPortal + + +class PortalPurchase(CustomerPortal): + def _purchase_order_get_page_view_values(self, order, access_token, **kwargs): + response = super(PortalPurchase, self)._purchase_order_get_page_view_values( + order=order, access_token=access_token, **kwargs + ) + if kwargs.get("message"): + response.update({"message": kwargs.get("message")}) + return response + + @http.route( + ["/my/purchase//accept"], type="json", auth="public", website=True + ) + def portal_purchase_accept( + self, order_id, access_token=None, name=None, signature=None + ): + # get from query string if not on json param + access_token = access_token or request.httprequest.args.get("access_token") + try: + order_sudo = self._document_check_access( + "purchase.order", order_id, access_token=access_token + ) + except (AccessError, MissingError): + return {"error": _("Invalid order.")} + + if not order_sudo._has_to_be_signed(): + return { + "error": _("The order is not in a state requiring vendor signature.") + } + if not signature: + return {"error": _("Signature is missing.")} + + try: + order_sudo.write( + { + "signed_by": name, + "signed_on": fields.Datetime.now(), + "signature": signature, + } + ) + except (TypeError, binascii.Error): + return {"error": _("Invalid signature data.")} + order_sudo.button_confirm() + pdf = ( + request.env["ir.actions.report"] + .sudo() + ._render_qweb_pdf("purchase.action_report_purchase_order", [order_sudo.id])[ + 0 + ] + ) + + _message_post_helper( + "purchase.order", + order_sudo.id, + _("Order signed by %s", name), + attachments=[("%s.pdf" % order_sudo.name, pdf)], + token=access_token, + ) + + query_string = "&message=sign_ok" + return { + "force_refresh": True, + "redirect_url": order_sudo.get_portal_url(query_string=query_string), + } diff --git a/purchase_sign/models/__init__.py b/purchase_sign/models/__init__.py new file mode 100644 index 00000000000..575530f0397 --- /dev/null +++ b/purchase_sign/models/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +from . import purchase_order +from . import res_company +from . import res_config_settings diff --git a/purchase_sign/models/purchase_order.py b/purchase_sign/models/purchase_order.py new file mode 100644 index 00000000000..46f3a5f4e2a --- /dev/null +++ b/purchase_sign/models/purchase_order.py @@ -0,0 +1,33 @@ +# Copyright 2024 Onestein +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + +from odoo.addons.purchase.models.purchase import PurchaseOrder as Purchase + + +class PurchaseOrder(models.Model): + _inherit = "purchase.order" + + require_signature = fields.Boolean( + string="Online Signature", + compute="_compute_require_signature", + store=True, + readonly=False, + precompute=True, + states=Purchase.READONLY_STATES, + help="Request a online signature and/or payment to the customer in " + "order to confirm orders automatically.", + ) + signature = fields.Image( + copy=False, attachment=True, max_width=1024, max_height=1024 + ) + signed_by = fields.Char(copy=False) + signed_on = fields.Datetime(copy=False) + + @api.depends("company_id") + def _compute_require_signature(self): + for order in self: + order.require_signature = order.company_id.purchase_portal_confirmation_sign + + def _has_to_be_signed(self): + return self.state == "sent" and self.require_signature and not self.signature diff --git a/purchase_sign/models/res_company.py b/purchase_sign/models/res_company.py new file mode 100644 index 00000000000..b1bb1d78b0e --- /dev/null +++ b/purchase_sign/models/res_company.py @@ -0,0 +1,11 @@ +# Copyright 2024 Onestein +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ResCompany(models.Model): + _inherit = "res.company" + + purchase_portal_confirmation_sign = fields.Boolean( + string="Purchase Online Signature", default=False + ) diff --git a/purchase_sign/models/res_config_settings.py b/purchase_sign/models/res_config_settings.py new file mode 100644 index 00000000000..7559d5bc969 --- /dev/null +++ b/purchase_sign/models/res_config_settings.py @@ -0,0 +1,12 @@ +# Copyright 2024 Onestein +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + purchase_portal_confirmation_sign = fields.Boolean( + related="company_id.purchase_portal_confirmation_sign", + readonly=False, + ) diff --git a/purchase_sign/readme/CONTRIBUTORS.rst b/purchase_sign/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..dabe2d2b564 --- /dev/null +++ b/purchase_sign/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* `Onestein `__ diff --git a/purchase_sign/readme/DESCRIPTION.rst b/purchase_sign/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..f8a59f3f896 --- /dev/null +++ b/purchase_sign/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module allows to take online signatures from vendors to confirm purchase orders.It adds a global configuration (Online signature) which can be accessed through Purchase->Configuration->Settings and it can further be handled also on each of the purchase orders.When it is enabled, it shows a button 'Accept & Sign' on the portal to the vendors for RFQ which are sent by email to them.Once the vendor accepts and adds their signature, the RFQ gets confirmed into a purchase order diff --git a/purchase_sign/report/purchase_order_template.xml b/purchase_sign/report/purchase_order_template.xml new file mode 100644 index 00000000000..5fe0eb05397 --- /dev/null +++ b/purchase_sign/report/purchase_order_template.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/purchase_sign/static/description/index.html b/purchase_sign/static/description/index.html new file mode 100644 index 00000000000..8123b813ccd --- /dev/null +++ b/purchase_sign/static/description/index.html @@ -0,0 +1,423 @@ + + + + + +Purchase Sign + + + +
+

Purchase Sign

+ + +

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

+

This module allows to take online signatures from vendors to confirm purchase orders.It adds a global configuration (Online signature) which can be accessed through Purchase->Configuration->Settings and it can further be handled also on each of the purchase orders.When it is enabled, it shows a button ‘Accept & Sign’ on the portal to the vendors for RFQ which are sent by email to them.Once the vendor accepts and adds their signature, the RFQ gets confirmed into a purchase order

+

Table of contents

+ +
+

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

+
    +
  • Onestein
  • +
+
+ +
+

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/purchase-workflow project on GitHub.

+

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

+
+
+
+ + diff --git a/purchase_sign/static/tests/tours/purchase_signature.esm.js b/purchase_sign/static/tests/tours/purchase_signature.esm.js new file mode 100644 index 00000000000..3a58572f48b --- /dev/null +++ b/purchase_sign/static/tests/tours/purchase_signature.esm.js @@ -0,0 +1,57 @@ +/** @odoo-module **/ + +import tour from "web_tour.tour"; + +// This tour relies on data created on the Python test. +tour.register( + "purchase_signature", + { + test: true, + url: "/my/rfq", + }, + [ + { + content: "open the test PO", + trigger: "a:containsExact('test PO')", + }, + { + content: "click sign", + trigger: "a:contains('Sign')", + }, + { + content: "check submit is enabled", + trigger: ".o_portal_sign_submit:enabled", + run: function () { + /**/ + }, + }, + { + content: "click select style", + trigger: ".o_web_sign_auto_select_style a", + }, + { + content: "click style 4", + trigger: ".o_web_sign_auto_font_selection a:eq(3)", + }, + { + content: "click submit", + trigger: ".o_portal_sign_submit:enabled", + }, + { + content: "check it's confirmed", + trigger: "#quote_content:contains('Thank You')", + }, + { + trigger: "#quote_content", + run: function () { + window.location.href = window.location.origin + "/web"; + }, + }, + { + trigger: "nav", + run: function () { + /**/ + }, + }, + ] +); diff --git a/purchase_sign/templates/purchase_portal_templates.xml b/purchase_sign/templates/purchase_portal_templates.xml new file mode 100644 index 00000000000..cc98f979fee --- /dev/null +++ b/purchase_sign/templates/purchase_portal_templates.xml @@ -0,0 +1,154 @@ + + + + + + + + diff --git a/purchase_sign/tests/__init__.py b/purchase_sign/tests/__init__.py new file mode 100644 index 00000000000..814899e4fac --- /dev/null +++ b/purchase_sign/tests/__init__.py @@ -0,0 +1,2 @@ +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html +from . import test_purchase_sign diff --git a/purchase_sign/tests/test_purchase_sign.py b/purchase_sign/tests/test_purchase_sign.py new file mode 100644 index 00000000000..9d7a215b64e --- /dev/null +++ b/purchase_sign/tests/test_purchase_sign.py @@ -0,0 +1,115 @@ +# Copyright 2024 Onestein +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import binascii +import json +from unittest.mock import patch + +from odoo import _ +from odoo.tests import tagged + +from odoo.addons.base.tests.common import HttpCaseWithUserPortal +from odoo.addons.purchase.models.purchase import PurchaseOrder + + +@tagged("post_install", "-at_install") +class TestPurchaseSign(HttpCaseWithUserPortal): + def test_01_portal_purchase_signature_tour(self): + """The goal of this test is to make sure the portal user can sign PO.""" + self.user_portal.company_id.purchase_portal_confirmation_sign = True + portal_user_partner = self.partner_portal + # create a PO to be signed + purchase_order = self.env["purchase.order"].create( + { + "name": "test PO", + "partner_id": portal_user_partner.id, + "state": "sent", + } + ) + self.env["purchase.order.line"].create( + { + "order_id": purchase_order.id, + "product_id": self.env["product.product"] + .create({"name": "A product"}) + .id, + "price_unit": 10.0, + } + ) + + # must be sent to the user so he can see it + email_act = purchase_order.action_rfq_send() + email_ctx = email_act.get("context", {}) + purchase_order.with_context(**email_ctx).message_post_with_template( + email_ctx.get("default_template_id") + ) + + self.start_tour("/", "purchase_signature", login="portal") + + def test_02_portal_purchase_check_errors(self): + """The goal of this test is to check error handling.""" + self.user_portal.company_id.purchase_portal_confirmation_sign = True + portal_user_partner = self.partner_portal + purchase_order = self.env["purchase.order"].create( + { + "name": "test PO2", + "partner_id": portal_user_partner.id, + "access_token": "test_po", + } + ) + self.env["purchase.order.line"].create( + { + "order_id": purchase_order.id, + "product_id": self.env["product.product"] + .create({"name": "A product"}) + .id, + "price_unit": 10.0, + } + ) + data = json.dumps({}).encode() + resp = self.url_open( + "/my/purchase/{}/accept".format( + purchase_order.id, + ), + data=data, + allow_redirects=False, + headers={"Content-Type": "application/json"}, + ) + self.assertIn(_("Invalid order."), resp.text) + resp = self.url_open( + "/my/purchase/{}/accept?access_token={}".format( + purchase_order.id, "test_po" + ), + data=data, + allow_redirects=False, + headers={"Content-Type": "application/json"}, + ) + self.assertIn( + _("The order is not in a state requiring vendor signature."), resp.text + ) + purchase_order.state = "sent" + resp = self.url_open( + "/my/purchase/{}/accept?access_token={}".format( + purchase_order.id, "test_po" + ), + data=data, + allow_redirects=False, + headers={"Content-Type": "application/json"}, + ) + self.assertIn(_("Signature is missing"), resp.text) + + def write(self, vals): + raise binascii.Error + + with patch.object( + PurchaseOrder, + "write", + write, + ): + resp = self.url_open( + "/my/purchase/{}/accept?access_token={}".format( + purchase_order.id, "test_po" + ), + data=json.dumps({"params": {"signature": "Joel Willis"}}).encode(), + allow_redirects=False, + headers={"Content-Type": "application/json"}, + ) + self.assertIn(_("Invalid signature data"), resp.text) diff --git a/purchase_sign/views/purchase_view.xml b/purchase_sign/views/purchase_view.xml new file mode 100644 index 00000000000..03071849666 --- /dev/null +++ b/purchase_sign/views/purchase_view.xml @@ -0,0 +1,29 @@ + + + + + purchase.order.form.inherit + purchase.order + + + + + + + + + + + + + + + + + + diff --git a/purchase_sign/views/res_config_settings_view.xml b/purchase_sign/views/res_config_settings_view.xml new file mode 100644 index 00000000000..f16af81fe0e --- /dev/null +++ b/purchase_sign/views/res_config_settings_view.xml @@ -0,0 +1,31 @@ + + + + + res.config.settings.view.form.inherit.purchase + res.config.settings + + + +
+
+ +
+
+
+
+
+
+
+ +
From 51abda60eec661e32d97207aedc2994e25f51fde Mon Sep 17 00:00:00 2001 From: oca-ci Date: Tue, 11 Jun 2024 12:31:18 +0000 Subject: [PATCH 2/7] [UPD] Update purchase_sign.pot --- purchase_sign/i18n/purchase_sign.pot | 188 +++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 purchase_sign/i18n/purchase_sign.pot diff --git a/purchase_sign/i18n/purchase_sign.pot b/purchase_sign/i18n/purchase_sign.pot new file mode 100644 index 00000000000..6645990b857 --- /dev/null +++ b/purchase_sign/i18n/purchase_sign.pot @@ -0,0 +1,188 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_sign +# +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: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "" +"\n" +" Accept & Sign" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "" +"\n" +" Accept & Sign" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "" +"\n" +" Feedback" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "Accepted on the behalf of:" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "By signing this proposal, I agree to the following terms:" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "For an amount of:" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "With payment terms:" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.report_purchaseorder_document +msgid "Signature" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "" +"Thank You!
\n" +" Order has been confirmed." +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "Close" +msgstr "" + +#. module: purchase_sign +#: model:ir.model,name:purchase_sign.model_res_company +msgid "Companies" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/controllers/main.py:0 +#: code:addons/purchase_sign/tests/test_purchase_sign.py:0 +#, python-format +msgid "Invalid order." +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/tests/test_purchase_sign.py:0 +#, python-format +msgid "Invalid signature data" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/controllers/main.py:0 +#, python-format +msgid "Invalid signature data." +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__require_signature +#: model_terms:ir.ui.view,arch_db:purchase_sign.res_config_settings_view_form_purchase +msgid "Online Signature" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/controllers/main.py:0 +#, python-format +msgid "Order signed by %s" +msgstr "" + +#. module: purchase_sign +#: model:ir.model,name:purchase_sign.model_res_config_settings +msgid "Procurement purchase grouping settings" +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,field_description:purchase_sign.field_res_company__purchase_portal_confirmation_sign +#: model:ir.model.fields,field_description:purchase_sign.field_res_config_settings__purchase_portal_confirmation_sign +msgid "Purchase Online Signature" +msgstr "" + +#. module: purchase_sign +#: model:ir.model,name:purchase_sign.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,help:purchase_sign.field_purchase_order__require_signature +msgid "" +"Request a online signature and/or payment to the customer in order to " +"confirm orders automatically." +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.res_config_settings_view_form_purchase +msgid "Request an online signature to confirm orders" +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__signature +#: model_terms:ir.ui.view,arch_db:purchase_sign.purchase_order_portal_content +msgid "Signature" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/tests/test_purchase_sign.py:0 +#, python-format +msgid "Signature is missing" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/controllers/main.py:0 +#, python-format +msgid "Signature is missing." +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__signed_by +msgid "Signed By" +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__signed_on +msgid "Signed On" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/controllers/main.py:0 +#: code:addons/purchase_sign/tests/test_purchase_sign.py:0 +#, python-format +msgid "The order is not in a state requiring vendor signature." +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "Validate Order" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.purchase_order_view_form_inherit +msgid "Vendor Signature" +msgstr "" From 138ac03cbcac5046bc5773d1d45fa20442df5d43 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 11 Jun 2024 12:36:54 +0000 Subject: [PATCH 3/7] [BOT] post-merge updates --- purchase_sign/README.rst | 2 +- purchase_sign/static/description/icon.png | Bin 0 -> 9455 bytes purchase_sign/static/description/index.html | 13 +++++-------- 3 files changed, 6 insertions(+), 9 deletions(-) create mode 100644 purchase_sign/static/description/icon.png diff --git a/purchase_sign/README.rst b/purchase_sign/README.rst index 889ea037e19..3880f221757 100644 --- a/purchase_sign/README.rst +++ b/purchase_sign/README.rst @@ -7,7 +7,7 @@ Purchase Sign !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:88ac5c691562f3453857db7210257da345b2b903c05d80b3ed305fab437b14b5 + !! source digest: sha256:56a9aecd4b0b47eda77efd60cc19b8963193fee67e2fe6ad675449af14a3c6c6 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/purchase_sign/static/description/icon.png b/purchase_sign/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/purchase_sign/static/description/index.html b/purchase_sign/static/description/index.html index 8123b813ccd..0ef321f3efb 100644 --- a/purchase_sign/static/description/index.html +++ b/purchase_sign/static/description/index.html @@ -8,11 +8,10 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ +:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. -Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -275,7 +274,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: gray; } /* line numbers */ +pre.code .ln { color: grey; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -301,7 +300,7 @@ span.pre { white-space: pre } -span.problematic, pre.problematic { +span.problematic { color: red } span.section-subtitle { @@ -367,7 +366,7 @@

Purchase Sign

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:88ac5c691562f3453857db7210257da345b2b903c05d80b3ed305fab437b14b5 +!! source digest: sha256:56a9aecd4b0b47eda77efd60cc19b8963193fee67e2fe6ad675449af14a3c6c6 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

This module allows to take online signatures from vendors to confirm purchase orders.It adds a global configuration (Online signature) which can be accessed through Purchase->Configuration->Settings and it can further be handled also on each of the purchase orders.When it is enabled, it shows a button ‘Accept & Sign’ on the portal to the vendors for RFQ which are sent by email to them.Once the vendor accepts and adds their signature, the RFQ gets confirmed into a purchase order

@@ -408,9 +407,7 @@

Contributors

Maintainers

This module is maintained by the OCA.

- -Odoo Community Association - +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.

From a9999c9ef2c9187e3186c73837c80c64ee3f5944 Mon Sep 17 00:00:00 2001 From: mymage Date: Wed, 12 Jun 2024 19:19:11 +0000 Subject: [PATCH 4/7] Added translation using Weblate (Italian) --- purchase_sign/i18n/it.po | 189 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 purchase_sign/i18n/it.po diff --git a/purchase_sign/i18n/it.po b/purchase_sign/i18n/it.po new file mode 100644 index 00000000000..863e7c064d0 --- /dev/null +++ b/purchase_sign/i18n/it.po @@ -0,0 +1,189 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * purchase_sign +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\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" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "" +"\n" +" Accept & Sign" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "" +"\n" +" Accept & Sign" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "" +"\n" +" Feedback" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "Accepted on the behalf of:" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "By signing this proposal, I agree to the following terms:" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "For an amount of:" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "With payment terms:" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.report_purchaseorder_document +msgid "Signature" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "" +"Thank You!
\n" +" Order has been confirmed." +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "Close" +msgstr "" + +#. module: purchase_sign +#: model:ir.model,name:purchase_sign.model_res_company +msgid "Companies" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/controllers/main.py:0 +#: code:addons/purchase_sign/tests/test_purchase_sign.py:0 +#, python-format +msgid "Invalid order." +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/tests/test_purchase_sign.py:0 +#, python-format +msgid "Invalid signature data" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/controllers/main.py:0 +#, python-format +msgid "Invalid signature data." +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__require_signature +#: model_terms:ir.ui.view,arch_db:purchase_sign.res_config_settings_view_form_purchase +msgid "Online Signature" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/controllers/main.py:0 +#, python-format +msgid "Order signed by %s" +msgstr "" + +#. module: purchase_sign +#: model:ir.model,name:purchase_sign.model_res_config_settings +msgid "Procurement purchase grouping settings" +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,field_description:purchase_sign.field_res_company__purchase_portal_confirmation_sign +#: model:ir.model.fields,field_description:purchase_sign.field_res_config_settings__purchase_portal_confirmation_sign +msgid "Purchase Online Signature" +msgstr "" + +#. module: purchase_sign +#: model:ir.model,name:purchase_sign.model_purchase_order +msgid "Purchase Order" +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,help:purchase_sign.field_purchase_order__require_signature +msgid "" +"Request a online signature and/or payment to the customer in order to " +"confirm orders automatically." +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.res_config_settings_view_form_purchase +msgid "Request an online signature to confirm orders" +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__signature +#: model_terms:ir.ui.view,arch_db:purchase_sign.purchase_order_portal_content +msgid "Signature" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/tests/test_purchase_sign.py:0 +#, python-format +msgid "Signature is missing" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/controllers/main.py:0 +#, python-format +msgid "Signature is missing." +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__signed_by +msgid "Signed By" +msgstr "" + +#. module: purchase_sign +#: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__signed_on +msgid "Signed On" +msgstr "" + +#. module: purchase_sign +#. odoo-python +#: code:addons/purchase_sign/controllers/main.py:0 +#: code:addons/purchase_sign/tests/test_purchase_sign.py:0 +#, python-format +msgid "The order is not in a state requiring vendor signature." +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order +msgid "Validate Order" +msgstr "" + +#. module: purchase_sign +#: model_terms:ir.ui.view,arch_db:purchase_sign.purchase_order_view_form_inherit +msgid "Vendor Signature" +msgstr "" From f08d0722834c224dcce6a904f922458f3f667db0 Mon Sep 17 00:00:00 2001 From: mymage Date: Sat, 17 Aug 2024 16:07:23 +0000 Subject: [PATCH 5/7] Translated using Weblate (Italian) Currently translated at 100.0% (29 of 29 strings) Translation: purchase-workflow-16.0/purchase-workflow-16.0-purchase_sign Translate-URL: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_sign/it/ --- purchase_sign/i18n/it.po | 62 ++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/purchase_sign/i18n/it.po b/purchase_sign/i18n/it.po index 863e7c064d0..66712769877 100644 --- a/purchase_sign/i18n/it.po +++ b/purchase_sign/i18n/it.po @@ -6,13 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2024-08-17 18:58+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 5.6.2\n" #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order @@ -20,6 +22,8 @@ msgid "" "\n" " Accept & Sign" msgstr "" +"\n" +" Accetta e firma" #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order @@ -27,6 +31,8 @@ msgid "" "\n" " Accept & Sign" msgstr "" +"\n" +" Accetta e firma" #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order @@ -34,31 +40,33 @@ msgid "" "\n" " Feedback" msgstr "" +"\n" +" Commento" #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order msgid "Accepted on the behalf of:" -msgstr "" +msgstr "Accettato per conto di:" #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order msgid "By signing this proposal, I agree to the following terms:" -msgstr "" +msgstr "Firmando questa proposta accetto i seguenti termini:" #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order msgid "For an amount of:" -msgstr "" +msgstr "Per un valore di:" #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order msgid "With payment terms:" -msgstr "" +msgstr "Con termini di pagamento:" #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.report_purchaseorder_document msgid "Signature" -msgstr "" +msgstr "Firma" #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order @@ -66,16 +74,18 @@ msgid "" "Thank You!
\n" " Order has been confirmed." msgstr "" +"Grazie!
\n" +" L'ordine è stato confermato." #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order msgid "Close" -msgstr "" +msgstr "Chiudi" #. module: purchase_sign #: model:ir.model,name:purchase_sign.model_res_company msgid "Companies" -msgstr "" +msgstr "Aziende" #. module: purchase_sign #. odoo-python @@ -83,50 +93,50 @@ msgstr "" #: code:addons/purchase_sign/tests/test_purchase_sign.py:0 #, python-format msgid "Invalid order." -msgstr "" +msgstr "Ordine non valido." #. module: purchase_sign #. odoo-python #: code:addons/purchase_sign/tests/test_purchase_sign.py:0 #, python-format msgid "Invalid signature data" -msgstr "" +msgstr "Data firma non valida" #. module: purchase_sign #. odoo-python #: code:addons/purchase_sign/controllers/main.py:0 #, python-format msgid "Invalid signature data." -msgstr "" +msgstr "Data firma non valida." #. module: purchase_sign #: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__require_signature #: model_terms:ir.ui.view,arch_db:purchase_sign.res_config_settings_view_form_purchase msgid "Online Signature" -msgstr "" +msgstr "Firma online" #. module: purchase_sign #. odoo-python #: code:addons/purchase_sign/controllers/main.py:0 #, python-format msgid "Order signed by %s" -msgstr "" +msgstr "Ordine firmato da %s" #. module: purchase_sign #: model:ir.model,name:purchase_sign.model_res_config_settings msgid "Procurement purchase grouping settings" -msgstr "" +msgstr "Impostazioni raggruppamento approvvigionamento acquisti" #. module: purchase_sign #: model:ir.model.fields,field_description:purchase_sign.field_res_company__purchase_portal_confirmation_sign #: model:ir.model.fields,field_description:purchase_sign.field_res_config_settings__purchase_portal_confirmation_sign msgid "Purchase Online Signature" -msgstr "" +msgstr "Firma online acquisto" #. module: purchase_sign #: model:ir.model,name:purchase_sign.model_purchase_order msgid "Purchase Order" -msgstr "" +msgstr "Ordine di acquisto" #. module: purchase_sign #: model:ir.model.fields,help:purchase_sign.field_purchase_order__require_signature @@ -134,41 +144,43 @@ msgid "" "Request a online signature and/or payment to the customer in order to " "confirm orders automatically." msgstr "" +"Richiede una firma online e/o pagamento al cliente per confermare gli ordini " +"automaticamente." #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.res_config_settings_view_form_purchase msgid "Request an online signature to confirm orders" -msgstr "" +msgstr "Richiede una firma online per confermare gli ordini" #. module: purchase_sign #: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__signature #: model_terms:ir.ui.view,arch_db:purchase_sign.purchase_order_portal_content msgid "Signature" -msgstr "" +msgstr "Firma" #. module: purchase_sign #. odoo-python #: code:addons/purchase_sign/tests/test_purchase_sign.py:0 #, python-format msgid "Signature is missing" -msgstr "" +msgstr "Manca la firma" #. module: purchase_sign #. odoo-python #: code:addons/purchase_sign/controllers/main.py:0 #, python-format msgid "Signature is missing." -msgstr "" +msgstr "Manca la firma." #. module: purchase_sign #: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__signed_by msgid "Signed By" -msgstr "" +msgstr "Firmato da" #. module: purchase_sign #: model:ir.model.fields,field_description:purchase_sign.field_purchase_order__signed_on msgid "Signed On" -msgstr "" +msgstr "Firmato il" #. module: purchase_sign #. odoo-python @@ -176,14 +188,14 @@ msgstr "" #: code:addons/purchase_sign/tests/test_purchase_sign.py:0 #, python-format msgid "The order is not in a state requiring vendor signature." -msgstr "" +msgstr "L'ordine è in uno stato che non richiede la firma del fornitore." #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.portal_my_purchase_order msgid "Validate Order" -msgstr "" +msgstr "Validazione ordine" #. module: purchase_sign #: model_terms:ir.ui.view,arch_db:purchase_sign.purchase_order_view_form_inherit msgid "Vendor Signature" -msgstr "" +msgstr "Firma fornitore" From b675683c00fcff49edc8f8af8c809cb624a11bae Mon Sep 17 00:00:00 2001 From: Anusha Date: Wed, 30 Apr 2025 06:02:11 +0200 Subject: [PATCH 6/7] [IMP] purchase_sign: pre-commit auto fixes --- purchase_sign/README.rst | 26 +++--- purchase_sign/controllers/main.py | 2 +- purchase_sign/pyproject.toml | 3 + purchase_sign/readme/CONTRIBUTORS.md | 1 + purchase_sign/readme/CONTRIBUTORS.rst | 1 - purchase_sign/readme/DESCRIPTION.md | 7 ++ purchase_sign/readme/DESCRIPTION.rst | 1 - .../report/purchase_order_template.xml | 1 - purchase_sign/static/description/index.html | 25 ++++-- .../templates/purchase_portal_templates.xml | 84 +++++++++---------- purchase_sign/tests/test_purchase_sign.py | 4 +- purchase_sign/views/purchase_view.xml | 2 - .../views/res_config_settings_view.xml | 2 - 13 files changed, 87 insertions(+), 72 deletions(-) create mode 100644 purchase_sign/pyproject.toml create mode 100644 purchase_sign/readme/CONTRIBUTORS.md delete mode 100644 purchase_sign/readme/CONTRIBUTORS.rst create mode 100644 purchase_sign/readme/DESCRIPTION.md delete mode 100644 purchase_sign/readme/DESCRIPTION.rst diff --git a/purchase_sign/README.rst b/purchase_sign/README.rst index 3880f221757..fb6c6fc9347 100644 --- a/purchase_sign/README.rst +++ b/purchase_sign/README.rst @@ -17,18 +17,24 @@ Purchase Sign :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github - :target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_sign + :target: https://github.com/OCA/purchase-workflow/tree/18.0/purchase_sign :alt: OCA/purchase-workflow .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_sign + :target: https://translation.odoo-community.org/projects/purchase-workflow-18-0/purchase-workflow-18-0-purchase_sign :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/purchase-workflow&target_branch=16.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/purchase-workflow&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -This module allows to take online signatures from vendors to confirm purchase orders.It adds a global configuration (Online signature) which can be accessed through Purchase->Configuration->Settings and it can further be handled also on each of the purchase orders.When it is enabled, it shows a button 'Accept & Sign' on the portal to the vendors for RFQ which are sent by email to them.Once the vendor accepts and adds their signature, the RFQ gets confirmed into a purchase order +This module allows to take online signatures from vendors to confirm +purchase orders.It adds a global configuration (Online signature) which +can be accessed through Purchase->Configuration->Settings and it can +further be handled also on each of the purchase orders.When it is +enabled, it shows a button 'Accept & Sign' on the portal to the vendors +for RFQ which are sent by email to them.Once the vendor accepts and adds +their signature, the RFQ gets confirmed into a purchase order **Table of contents** @@ -41,7 +47,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -49,17 +55,17 @@ Credits ======= Authors -~~~~~~~ +------- * Onestein Contributors -~~~~~~~~~~~~ +------------ -* `Onestein `__ +- `Onestein `__ Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -71,6 +77,6 @@ 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/purchase-workflow `_ project on GitHub. +This module is part of the `OCA/purchase-workflow `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/purchase_sign/controllers/main.py b/purchase_sign/controllers/main.py index 66329125e4a..02d6cd4326a 100644 --- a/purchase_sign/controllers/main.py +++ b/purchase_sign/controllers/main.py @@ -12,7 +12,7 @@ class PortalPurchase(CustomerPortal): def _purchase_order_get_page_view_values(self, order, access_token, **kwargs): - response = super(PortalPurchase, self)._purchase_order_get_page_view_values( + response = super()._purchase_order_get_page_view_values( order=order, access_token=access_token, **kwargs ) if kwargs.get("message"): diff --git a/purchase_sign/pyproject.toml b/purchase_sign/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/purchase_sign/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/purchase_sign/readme/CONTRIBUTORS.md b/purchase_sign/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..9446ebc23d0 --- /dev/null +++ b/purchase_sign/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- [Onestein](https://www.onestein.nl) diff --git a/purchase_sign/readme/CONTRIBUTORS.rst b/purchase_sign/readme/CONTRIBUTORS.rst deleted file mode 100644 index dabe2d2b564..00000000000 --- a/purchase_sign/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1 +0,0 @@ -* `Onestein `__ diff --git a/purchase_sign/readme/DESCRIPTION.md b/purchase_sign/readme/DESCRIPTION.md new file mode 100644 index 00000000000..2342dac0354 --- /dev/null +++ b/purchase_sign/readme/DESCRIPTION.md @@ -0,0 +1,7 @@ +This module allows to take online signatures from vendors to confirm +purchase orders.It adds a global configuration (Online signature) which +can be accessed through Purchase-\>Configuration-\>Settings and it can +further be handled also on each of the purchase orders.When it is +enabled, it shows a button 'Accept & Sign' on the portal to the vendors +for RFQ which are sent by email to them.Once the vendor accepts and adds +their signature, the RFQ gets confirmed into a purchase order diff --git a/purchase_sign/readme/DESCRIPTION.rst b/purchase_sign/readme/DESCRIPTION.rst deleted file mode 100644 index f8a59f3f896..00000000000 --- a/purchase_sign/readme/DESCRIPTION.rst +++ /dev/null @@ -1 +0,0 @@ -This module allows to take online signatures from vendors to confirm purchase orders.It adds a global configuration (Online signature) which can be accessed through Purchase->Configuration->Settings and it can further be handled also on each of the purchase orders.When it is enabled, it shows a button 'Accept & Sign' on the portal to the vendors for RFQ which are sent by email to them.Once the vendor accepts and adds their signature, the RFQ gets confirmed into a purchase order diff --git a/purchase_sign/report/purchase_order_template.xml b/purchase_sign/report/purchase_order_template.xml index 5fe0eb05397..e6ff8498f20 100644 --- a/purchase_sign/report/purchase_order_template.xml +++ b/purchase_sign/report/purchase_order_template.xml @@ -21,5 +21,4 @@
- diff --git a/purchase_sign/static/description/index.html b/purchase_sign/static/description/index.html index 0ef321f3efb..fc23f6d43e4 100644 --- a/purchase_sign/static/description/index.html +++ b/purchase_sign/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -368,8 +369,14 @@

Purchase Sign

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:56a9aecd4b0b47eda77efd60cc19b8963193fee67e2fe6ad675449af14a3c6c6 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

-

This module allows to take online signatures from vendors to confirm purchase orders.It adds a global configuration (Online signature) which can be accessed through Purchase->Configuration->Settings and it can further be handled also on each of the purchase orders.When it is enabled, it shows a button ‘Accept & Sign’ on the portal to the vendors for RFQ which are sent by email to them.Once the vendor accepts and adds their signature, the RFQ gets confirmed into a purchase order

+

Beta License: AGPL-3 OCA/purchase-workflow Translate me on Weblate Try me on Runboat

+

This module allows to take online signatures from vendors to confirm +purchase orders.It adds a global configuration (Online signature) which +can be accessed through Purchase->Configuration->Settings and it can +further be handled also on each of the purchase orders.When it is +enabled, it shows a button ‘Accept & Sign’ on the portal to the vendors +for RFQ which are sent by email to them.Once the vendor accepts and adds +their signature, the RFQ gets confirmed into a purchase order

Table of contents

    @@ -387,7 +394,7 @@

    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.

    +feedback.

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

@@ -407,11 +414,13 @@

Contributors

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +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/purchase-workflow project on GitHub.

+

This module is part of the OCA/purchase-workflow project on GitHub.

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

diff --git a/purchase_sign/templates/purchase_portal_templates.xml b/purchase_sign/templates/purchase_portal_templates.xml index cc98f979fee..1bd5f7f2466 100644 --- a/purchase_sign/templates/purchase_portal_templates.xml +++ b/purchase_sign/templates/purchase_portal_templates.xml @@ -1,6 +1,5 @@ - - diff --git a/purchase_sign/tests/test_purchase_sign.py b/purchase_sign/tests/test_purchase_sign.py index 9d7a215b64e..68766bac94d 100644 --- a/purchase_sign/tests/test_purchase_sign.py +++ b/purchase_sign/tests/test_purchase_sign.py @@ -66,9 +66,7 @@ def test_02_portal_purchase_check_errors(self): ) data = json.dumps({}).encode() resp = self.url_open( - "/my/purchase/{}/accept".format( - purchase_order.id, - ), + f"/my/purchase/{purchase_order.id}/accept", data=data, allow_redirects=False, headers={"Content-Type": "application/json"}, diff --git a/purchase_sign/views/purchase_view.xml b/purchase_sign/views/purchase_view.xml index 03071849666..1ab069d80c6 100644 --- a/purchase_sign/views/purchase_view.xml +++ b/purchase_sign/views/purchase_view.xml @@ -1,6 +1,5 @@ - purchase.order.form.inherit purchase.order @@ -25,5 +24,4 @@ - diff --git a/purchase_sign/views/res_config_settings_view.xml b/purchase_sign/views/res_config_settings_view.xml index f16af81fe0e..f9f7b218556 100644 --- a/purchase_sign/views/res_config_settings_view.xml +++ b/purchase_sign/views/res_config_settings_view.xml @@ -1,6 +1,5 @@ - res.config.settings.view.form.inherit.purchase res.config.settings @@ -27,5 +26,4 @@ - From 0d62481a98d900fb966896079f37c8c4c77fed25 Mon Sep 17 00:00:00 2001 From: Anusha Date: Wed, 30 Apr 2025 06:04:08 +0200 Subject: [PATCH 7/7] [MIG] purchase_sign: Migration to 18.0 --- purchase_sign/__init__.py | 2 +- purchase_sign/__manifest__.py | 10 +- purchase_sign/controllers/main.py | 21 +-- purchase_sign/models/purchase_order.py | 15 +- purchase_sign/models/res_company.py | 5 +- .../tests/tours/purchase_signature.esm.js | 47 +++--- .../templates/purchase_portal_templates.xml | 141 +++++++++--------- purchase_sign/tests/test_purchase_sign.py | 10 +- purchase_sign/views/purchase_view.xml | 19 ++- .../views/res_config_settings_view.xml | 22 +-- 10 files changed, 151 insertions(+), 141 deletions(-) diff --git a/purchase_sign/__init__.py b/purchase_sign/__init__.py index 83b6211e516..07eb8f9a078 100644 --- a/purchase_sign/__init__.py +++ b/purchase_sign/__init__.py @@ -1,4 +1,4 @@ # Copyright 2024 Onestein # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from . import controllers from . import models +from . import controllers diff --git a/purchase_sign/__manifest__.py b/purchase_sign/__manifest__.py index 5d3cecc931b..b5e911696ce 100644 --- a/purchase_sign/__manifest__.py +++ b/purchase_sign/__manifest__.py @@ -1,19 +1,19 @@ -# Copyright 2024 Onestein () -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +# Copyright 2024 Onestein +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { "name": "Purchase Sign", - "version": "16.0.1.0.0", + "version": "18.0.1.0.0", "license": "AGPL-3", "category": "Purchase", "author": "Onestein, Odoo Community Association (OCA)", "website": "https://github.com/OCA/purchase-workflow", "depends": ["purchase"], "data": [ - "report/purchase_order_template.xml", - "templates/purchase_portal_templates.xml", "views/purchase_view.xml", "views/res_config_settings_view.xml", + "templates/purchase_portal_templates.xml", + "report/purchase_order_template.xml", ], "assets": { "web.assets_tests": [ diff --git a/purchase_sign/controllers/main.py b/purchase_sign/controllers/main.py index 02d6cd4326a..7cb540bc5a1 100644 --- a/purchase_sign/controllers/main.py +++ b/purchase_sign/controllers/main.py @@ -1,12 +1,12 @@ # Copyright 2024 Onestein # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + import binascii from odoo import _, fields, http from odoo.exceptions import AccessError, MissingError from odoo.http import request -from odoo.addons.portal.controllers.mail import _message_post_helper from odoo.addons.portal.controllers.portal import CustomerPortal @@ -25,7 +25,6 @@ def _purchase_order_get_page_view_values(self, order, access_token, **kwargs): def portal_purchase_accept( self, order_id, access_token=None, name=None, signature=None ): - # get from query string if not on json param access_token = access_token or request.httprequest.args.get("access_token") try: order_sudo = self._document_check_access( @@ -49,6 +48,7 @@ def portal_purchase_accept( "signature": signature, } ) + request.env.cr.commit() except (TypeError, binascii.Error): return {"error": _("Invalid signature data.")} order_sudo.button_confirm() @@ -59,13 +59,16 @@ def portal_purchase_accept( 0 ] ) - - _message_post_helper( - "purchase.order", - order_sudo.id, - _("Order signed by %s", name), - attachments=[("%s.pdf" % order_sudo.name, pdf)], - token=access_token, + order_sudo.message_post( + attachments=[(f"{order_sudo.name}.pdf", pdf)], + author_id=( + order_sudo.partner_id.id + if request.env.user._is_public() + else request.env.user.partner_id.id + ), + body=_("Order signed by %s", name), + message_type="comment", + subtype_xmlid="mail.mt_comment", ) query_string = "&message=sign_ok" diff --git a/purchase_sign/models/purchase_order.py b/purchase_sign/models/purchase_order.py index 46f3a5f4e2a..384653dd5cf 100644 --- a/purchase_sign/models/purchase_order.py +++ b/purchase_sign/models/purchase_order.py @@ -2,8 +2,6 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo import api, fields, models -from odoo.addons.purchase.models.purchase import PurchaseOrder as Purchase - class PurchaseOrder(models.Model): _inherit = "purchase.order" @@ -14,20 +12,25 @@ class PurchaseOrder(models.Model): store=True, readonly=False, precompute=True, - states=Purchase.READONLY_STATES, - help="Request a online signature and/or payment to the customer in " - "order to confirm orders automatically.", + help="Request an online signature from the supplier " + "to confirm orders automatically.", ) + signature = fields.Image( copy=False, attachment=True, max_width=1024, max_height=1024 ) + signed_by = fields.Char(copy=False) signed_on = fields.Datetime(copy=False) @api.depends("company_id") def _compute_require_signature(self): for order in self: - order.require_signature = order.company_id.purchase_portal_confirmation_sign + order.require_signature = bool( + order.company_id.purchase_portal_confirmation_sign + ) def _has_to_be_signed(self): + """Checks whether this purchase order requires signature.""" + self.ensure_one() return self.state == "sent" and self.require_signature and not self.signature diff --git a/purchase_sign/models/res_company.py b/purchase_sign/models/res_company.py index b1bb1d78b0e..14d1d085d6b 100644 --- a/purchase_sign/models/res_company.py +++ b/purchase_sign/models/res_company.py @@ -7,5 +7,8 @@ class ResCompany(models.Model): _inherit = "res.company" purchase_portal_confirmation_sign = fields.Boolean( - string="Purchase Online Signature", default=False + string="Online Signature", + default=False, + help="Enable this to request a digital signature when confirming " + "Purchase Orders via the portal.", ) diff --git a/purchase_sign/static/tests/tours/purchase_signature.esm.js b/purchase_sign/static/tests/tours/purchase_signature.esm.js index 3a58572f48b..a6bb562f8f3 100644 --- a/purchase_sign/static/tests/tours/purchase_signature.esm.js +++ b/purchase_sign/static/tests/tours/purchase_signature.esm.js @@ -1,57 +1,56 @@ /** @odoo-module **/ -import tour from "web_tour.tour"; +import {registry} from "@web/core/registry"; +import {redirect} from "@web/core/utils/urls"; -// This tour relies on data created on the Python test. -tour.register( - "purchase_signature", - { - test: true, - url: "/my/rfq", - }, - [ +registry.category("web_tour.tours").add("purchase_signature", { + url: "/my/rfq", + steps: () => [ { content: "open the test PO", - trigger: "a:containsExact('test PO')", + trigger: "a:contains(/^test PO$/)", + run: "click", }, { content: "click sign", - trigger: "a:contains('Sign')", + trigger: 'a:contains("Sign")', + run: "click", }, { content: "check submit is enabled", trigger: ".o_portal_sign_submit:enabled", - run: function () { - /**/ - }, + }, + { + trigger: ".modal .o_web_sign_name_and_signature input:value(Joel Willis)", }, { content: "click select style", - trigger: ".o_web_sign_auto_select_style a", + trigger: ".modal .o_web_sign_auto_select_style button", + run: "click", }, { content: "click style 4", - trigger: ".o_web_sign_auto_font_selection a:eq(3)", + trigger: ".o-dropdown-item:eq(3)", + run: "click", }, { content: "click submit", - trigger: ".o_portal_sign_submit:enabled", + trigger: ".modal .o_portal_sign_submit:enabled", + run: "click", }, { content: "check it's confirmed", - trigger: "#quote_content:contains('Thank You')", + trigger: '#quote_content:contains("Thank You")', + run: "click", }, { trigger: "#quote_content", run: function () { - window.location.href = window.location.origin + "/web"; + redirect("/odoo"); }, }, { trigger: "nav", - run: function () { - /**/ - }, }, - ] -); + ], +}); diff --git a/purchase_sign/templates/purchase_portal_templates.xml b/purchase_sign/templates/purchase_portal_templates.xml index 1bd5f7f2466..503cd24f5b8 100644 --- a/purchase_sign/templates/purchase_portal_templates.xml +++ b/purchase_sign/templates/purchase_portal_templates.xml @@ -1,28 +1,65 @@ + + - - diff --git a/purchase_sign/tests/test_purchase_sign.py b/purchase_sign/tests/test_purchase_sign.py index 68766bac94d..aba48e1a6cf 100644 --- a/purchase_sign/tests/test_purchase_sign.py +++ b/purchase_sign/tests/test_purchase_sign.py @@ -8,7 +8,7 @@ from odoo.tests import tagged from odoo.addons.base.tests.common import HttpCaseWithUserPortal -from odoo.addons.purchase.models.purchase import PurchaseOrder +from odoo.addons.purchase.models.purchase_order import PurchaseOrder @tagged("post_install", "-at_install") @@ -35,13 +35,12 @@ def test_01_portal_purchase_signature_tour(self): } ) - # must be sent to the user so he can see it email_act = purchase_order.action_rfq_send() email_ctx = email_act.get("context", {}) - purchase_order.with_context(**email_ctx).message_post_with_template( - email_ctx.get("default_template_id") + purchase_order.with_context(**email_ctx).message_post_with_source( + self.env["mail.template"].browse(email_ctx.get("default_template_id")), + subtype_xmlid="mail.mt_comment", ) - self.start_tour("/", "purchase_signature", login="portal") def test_02_portal_purchase_check_errors(self): @@ -55,6 +54,7 @@ def test_02_portal_purchase_check_errors(self): "access_token": "test_po", } ) + purchase_order.message_subscribe(partner_ids=[portal_user_partner.id]) self.env["purchase.order.line"].create( { "order_id": purchase_order.id, diff --git a/purchase_sign/views/purchase_view.xml b/purchase_sign/views/purchase_view.xml index 1ab069d80c6..633b1289a35 100644 --- a/purchase_sign/views/purchase_view.xml +++ b/purchase_sign/views/purchase_view.xml @@ -1,27 +1,30 @@ - purchase.order.form.inherit + purchase.order.form.inherit.signature purchase.order - + - + - - + + - + diff --git a/purchase_sign/views/res_config_settings_view.xml b/purchase_sign/views/res_config_settings_view.xml index f9f7b218556..ce87b9b5b04 100644 --- a/purchase_sign/views/res_config_settings_view.xml +++ b/purchase_sign/views/res_config_settings_view.xml @@ -8,21 +8,13 @@ ref="purchase.res_config_settings_view_form_purchase" /> - -
-
- -
-
-
-
+ + + +