From c06132b7033cf719a9af391baa93d12ae22fc33a Mon Sep 17 00:00:00 2001 From: Carlos Serra-Toro Date: Wed, 3 Nov 2021 18:02:30 +0700 Subject: [PATCH 1/8] [ADD] sale_exception_product_sale_manufactured_for --- .../README.rst | 6 ++ .../__init__.py | 3 + .../__manifest__.py | 25 ++++++ .../data/exception_rule.xml | 13 +++ .../demo/exception_rule.xml | 6 ++ .../models/__init__.py | 3 + .../models/sale_order.py | 46 ++++++++++ .../tests/__init__.py | 3 + .../tests/test_sale_exception.py | 84 +++++++++++++++++++ 9 files changed, 189 insertions(+) create mode 100644 sale_exception_product_sale_manufactured_for/README.rst create mode 100644 sale_exception_product_sale_manufactured_for/__init__.py create mode 100644 sale_exception_product_sale_manufactured_for/__manifest__.py create mode 100644 sale_exception_product_sale_manufactured_for/data/exception_rule.xml create mode 100644 sale_exception_product_sale_manufactured_for/demo/exception_rule.xml create mode 100644 sale_exception_product_sale_manufactured_for/models/__init__.py create mode 100644 sale_exception_product_sale_manufactured_for/models/sale_order.py create mode 100644 sale_exception_product_sale_manufactured_for/tests/__init__.py create mode 100644 sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py diff --git a/sale_exception_product_sale_manufactured_for/README.rst b/sale_exception_product_sale_manufactured_for/README.rst new file mode 100644 index 00000000000..0bd5aa14bf5 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/README.rst @@ -0,0 +1,6 @@ +Sale Exception Product Manufactured for Customer +================================================ + +The partner set in the sales order can order only if he/she +has a commercial entity that is listed as one of the partners +for which the products can be manufactured for. diff --git a/sale_exception_product_sale_manufactured_for/__init__.py b/sale_exception_product_sale_manufactured_for/__init__.py new file mode 100644 index 00000000000..d4b7188d6e5 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2021 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) +from . import models diff --git a/sale_exception_product_sale_manufactured_for/__manifest__.py b/sale_exception_product_sale_manufactured_for/__manifest__.py new file mode 100644 index 00000000000..cad2131e155 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/__manifest__.py @@ -0,0 +1,25 @@ +# Copyright 2021 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) +{ + "name": "Sale Exception Product Manufactured for Customer", + "summary": "The partner set in the sales order can order only if he/she " + "has a commercial entity that is listed as one of the partners " + "for which the products can be manufactured for.", + "version": "13.0.1.0.0", + "category": "Sales", + "website": "https://www.camptocamp.com", + "author": "Camptocamp", + "license": "AGPL-3", + "application": False, + "installable": True, + "data": [ + "data/exception_rule.xml", + ], + "demo": [ + "demo/exception_rule.xml", + ], + "depends": [ + "sale_exception", + "product_sale_manufactured_for", + ], +} diff --git a/sale_exception_product_sale_manufactured_for/data/exception_rule.xml b/sale_exception_product_sale_manufactured_for/data/exception_rule.xml new file mode 100644 index 00000000000..876614760c2 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/data/exception_rule.xml @@ -0,0 +1,13 @@ + + + + Partner can order all the items in the sale + The partner set in the sales order can order only + if he/she has a commercial entity that is listed as one of the partners + for which the products can be manufactured for. + 50 + sale.order + failed = not obj.exception_partner_can_order() + True + + diff --git a/sale_exception_product_sale_manufactured_for/demo/exception_rule.xml b/sale_exception_product_sale_manufactured_for/demo/exception_rule.xml new file mode 100644 index 00000000000..54822f53f43 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/demo/exception_rule.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/sale_exception_product_sale_manufactured_for/models/__init__.py b/sale_exception_product_sale_manufactured_for/models/__init__.py new file mode 100644 index 00000000000..2ad46d01556 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/models/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2021 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) +from . import sale_order diff --git a/sale_exception_product_sale_manufactured_for/models/sale_order.py b/sale_exception_product_sale_manufactured_for/models/sale_order.py new file mode 100644 index 00000000000..bd15a6981b1 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/models/sale_order.py @@ -0,0 +1,46 @@ +# Copyright 2021 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) +from odoo import models + + +class SaleOrder(models.Model): + _inherit = "sale.order" + + def exception_partner_can_order(self): + """Return whether the partner can order all the items in the sale + + Used in a sales exception. Returns true only if the partner set in + the sales order can buy all the products. This will happen if: + 1. it has a commercial entity that is listed as one of the + partners for which the products can be manufactured for. + 2. it doesn't have a commercial entity and none of the products + on the sale order have any restriction. + """ + self.ensure_one() + commercial_entity = self.partner_id.commercial_partner_id + + self.env.cr.execute( + """ + SELECT rel.product_template_id, ARRAY_AGG(rel.res_partner_id) + FROM sale_order_line sol + JOIN product_product pp ON (sol.product_id = pp.id) + JOIN product_template pt ON (pp.product_tmpl_id = pt.id) + JOIN product_template_res_partner_rel rel ON (rel.product_template_id = pt.id) + WHERE sol.display_type IS NULL + AND sol.order_id = %s + GROUP BY rel.product_template_id + """, + (self.id,), + ) + for _, allowed_partner_ids in self.env.cr.fetchall(): + # The product has limitations but the partner doesn't have + # a commercial entity, thus the condition is not fulfilled. + if not commercial_entity and allowed_partner_ids: + return False + + # The product has limitations and the commercial entity of + # the partner partner is not listed as allowed. + elif commercial_entity.id not in allowed_partner_ids: + return False + + return True diff --git a/sale_exception_product_sale_manufactured_for/tests/__init__.py b/sale_exception_product_sale_manufactured_for/tests/__init__.py new file mode 100644 index 00000000000..be08878af88 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/tests/__init__.py @@ -0,0 +1,3 @@ +# Copyright 2021 Camptocamp SA +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html) +from . import test_sale_exception diff --git a/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py b/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py new file mode 100644 index 00000000000..d91479d91ee --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py @@ -0,0 +1,84 @@ +# Copyright 2021 Camptocamp SA +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) + +from odoo.tests import SavepointCase + + +class TestSaleException(SavepointCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + + cls.exception = cls.env.ref( + "sale_exception_product_sale_manufactured_for.exception_partner_can_order" + ) + cls.exception.active = True + + partner_order = cls.env.ref("base.res_partner_1") + cls.partner_manufactured_for = cls.env.ref("base.res_partner_3") + cls.product = cls.env.ref("product.product_product_6") + cls.product.product_tmpl_id.manufactured_for_partner_ids |= ( + cls.partner_manufactured_for + ) + + cls.sale = cls.env["sale.order"].create( + { + "partner_id": partner_order.id, + "partner_invoice_id": partner_order.id, + "partner_shipping_id": partner_order.id, + "order_line": [ + ( + 0, + 0, + { + "name": cls.product.name, + "product_id": cls.product.id, + "product_uom_qty": 1, + "product_uom": cls.product.uom_id.id, + "price_unit": 1, + }, + ) + ], + } + ) + + def test_commercial_partner_not_valid(self): + self.sale.partner_id.commercial_partner_id = self.env.ref( + "base.res_partner_2" + ) + self.sale.action_confirm() + self.assertEqual(self.sale.state, "draft") + self.assertEqual(len(self.sale.exception_ids), 1) + self.assertEqual(self.sale.exception_ids[0], self.exception) + + def test_commercial_partner_is_valid(self): + self.sale.partner_id.commercial_partner_id = self.sale.order_line[ + 0 + ].product_id.product_tmpl_id.manufactured_for_partner_ids[0] + self.sale.action_confirm() + self.assertEqual(self.sale.state, "sale") + self.assertFalse(self.sale.exception_ids) + + def test_commercial_partner_empty(self): + self.sale.partner_id.commercial_partner_id = False + self.sale.action_confirm() + self.assertEqual(self.sale.state, "draft") + self.assertEqual(len(self.sale.exception_ids), 1) + self.assertEqual(self.sale.exception_ids[0], self.exception) + + def test_product_without_limits_partner_with_commercial_entity(self): + self.product.product_tmpl_id.manufactured_for_partner_ids = False + self.sale.partner_id.commercial_partner_id = ( + self.partner_manufactured_for + ) + self.sale.action_confirm() + self.assertEqual(self.sale.state, "sale") + self.assertFalse(self.sale.exception_ids) + + def test_product_without_limits_partner_without_commercial_entity(self): + self.product.product_tmpl_id.manufactured_for_partner_ids = False + self.sale.partner_id.commercial_partner_id = False + self.sale.action_confirm() + self.assertEqual(self.sale.state, "sale") + self.assertFalse(self.sale.exception_ids) From 6326bd6269960fd7e28e8dabfb9649237f93854f Mon Sep 17 00:00:00 2001 From: sonhd Date: Wed, 3 Nov 2021 18:07:25 +0700 Subject: [PATCH 2/8] [14.0] [MIG] sale_exception_product_sale_manufactured_for: Migrate to version 14.0 --- .../README.rst | 84 ++++ .../__manifest__.py | 10 +- .../data/exception_rule.xml | 6 +- .../demo/exception_rule.xml | 2 +- ...xception_product_sale_manufactured_for.pot | 47 ++ .../models/sale_order.py | 2 +- .../readme/CONTRIBUTORS.rst | 6 + .../readme/CREDITS.rst | 3 + .../readme/DESCRIPTION.rst | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 447 ++++++++++++++++++ .../tests/test_sale_exception.py | 8 +- 12 files changed, 603 insertions(+), 15 deletions(-) create mode 100644 sale_exception_product_sale_manufactured_for/i18n/sale_exception_product_sale_manufactured_for.pot create mode 100644 sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.rst create mode 100644 sale_exception_product_sale_manufactured_for/readme/CREDITS.rst create mode 100644 sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.rst create mode 100644 sale_exception_product_sale_manufactured_for/static/description/icon.png create mode 100644 sale_exception_product_sale_manufactured_for/static/description/index.html diff --git a/sale_exception_product_sale_manufactured_for/README.rst b/sale_exception_product_sale_manufactured_for/README.rst index 0bd5aa14bf5..88724c6c329 100644 --- a/sale_exception_product_sale_manufactured_for/README.rst +++ b/sale_exception_product_sale_manufactured_for/README.rst @@ -1,6 +1,90 @@ +================================================ Sale Exception Product Manufactured for Customer ================================================ +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:fa72cd0debb7805d74e3dd077b42fe265ad1374d613fb16230cfd25eb4747905 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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_exception_product_sale_manufactured_for + :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_exception_product_sale_manufactured_for + :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/sale-workflow&target_branch=14.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + The partner set in the sales order can order only if he/she has a commercial entity that is listed as one of the partners for which the products can be manufactured for. + +**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 +~~~~~~~ + +* Camptocamp + +Contributors +~~~~~~~~~~~~ + +* `Camptocamp `_: + * Carlos Serra-Toro + * Simone Orsi + * Thierry Ducrest +* `Trobz `_: + * Son Ho + +Other credits +~~~~~~~~~~~~~ + +**Financial support** +* Cosanum +* Camptocamp R&D + +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_exception_product_sale_manufactured_for/__manifest__.py b/sale_exception_product_sale_manufactured_for/__manifest__.py index cad2131e155..5d366166bb0 100644 --- a/sale_exception_product_sale_manufactured_for/__manifest__.py +++ b/sale_exception_product_sale_manufactured_for/__manifest__.py @@ -3,12 +3,12 @@ { "name": "Sale Exception Product Manufactured for Customer", "summary": "The partner set in the sales order can order only if he/she " - "has a commercial entity that is listed as one of the partners " - "for which the products can be manufactured for.", - "version": "13.0.1.0.0", + "has a commercial entity that is listed as one of the partners " + "for which the products can be manufactured for.", + "version": "14.0.1.0.1", "category": "Sales", - "website": "https://www.camptocamp.com", - "author": "Camptocamp", + "website": "https://github.com/OCA/sale-workflow", + "author": "Camptocamp, Odoo Community Association (OCA)", "license": "AGPL-3", "application": False, "installable": True, diff --git a/sale_exception_product_sale_manufactured_for/data/exception_rule.xml b/sale_exception_product_sale_manufactured_for/data/exception_rule.xml index 876614760c2..233f6f943f5 100644 --- a/sale_exception_product_sale_manufactured_for/data/exception_rule.xml +++ b/sale_exception_product_sale_manufactured_for/data/exception_rule.xml @@ -1,4 +1,4 @@ - + Partner can order all the items in the sale @@ -7,7 +7,9 @@ for which the products can be manufactured for. 50 sale.order - failed = not obj.exception_partner_can_order() + failed = not obj.exception_partner_can_order_manufactured_for() True diff --git a/sale_exception_product_sale_manufactured_for/demo/exception_rule.xml b/sale_exception_product_sale_manufactured_for/demo/exception_rule.xml index 54822f53f43..67a525a5262 100644 --- a/sale_exception_product_sale_manufactured_for/demo/exception_rule.xml +++ b/sale_exception_product_sale_manufactured_for/demo/exception_rule.xml @@ -1,4 +1,4 @@ - + diff --git a/sale_exception_product_sale_manufactured_for/i18n/sale_exception_product_sale_manufactured_for.pot b/sale_exception_product_sale_manufactured_for/i18n/sale_exception_product_sale_manufactured_for.pot new file mode 100644 index 00000000000..b522327842b --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/i18n/sale_exception_product_sale_manufactured_for.pot @@ -0,0 +1,47 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_exception_product_sale_manufactured_for +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.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: sale_exception_product_sale_manufactured_for +#: model:ir.model.fields,field_description:sale_exception_product_sale_manufactured_for.field_sale_order__display_name +msgid "Display Name" +msgstr "" + +#. module: sale_exception_product_sale_manufactured_for +#: model:ir.model.fields,field_description:sale_exception_product_sale_manufactured_for.field_sale_order__id +msgid "ID" +msgstr "" + +#. module: sale_exception_product_sale_manufactured_for +#: model:ir.model.fields,field_description:sale_exception_product_sale_manufactured_for.field_sale_order____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sale_exception_product_sale_manufactured_for +#: model:exception.rule,name:sale_exception_product_sale_manufactured_for.exception_partner_can_order +msgid "Partner can order all the items in the sale" +msgstr "" + +#. module: sale_exception_product_sale_manufactured_for +#: model:ir.model,name:sale_exception_product_sale_manufactured_for.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: sale_exception_product_sale_manufactured_for +#: model:exception.rule,description:sale_exception_product_sale_manufactured_for.exception_partner_can_order +msgid "" +"The partner set in the sales order can order only\n" +" if he/she has a commercial entity that is listed as one of the partners\n" +" for which the products can be manufactured for." +msgstr "" diff --git a/sale_exception_product_sale_manufactured_for/models/sale_order.py b/sale_exception_product_sale_manufactured_for/models/sale_order.py index bd15a6981b1..48d2e94283c 100644 --- a/sale_exception_product_sale_manufactured_for/models/sale_order.py +++ b/sale_exception_product_sale_manufactured_for/models/sale_order.py @@ -6,7 +6,7 @@ class SaleOrder(models.Model): _inherit = "sale.order" - def exception_partner_can_order(self): + def exception_partner_can_order_manufactured_for(self): """Return whether the partner can order all the items in the sale Used in a sales exception. Returns true only if the partner set in diff --git a/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.rst b/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..17c35e9b1c9 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.rst @@ -0,0 +1,6 @@ +* `Camptocamp `_: + * Carlos Serra-Toro + * Simone Orsi + * Thierry Ducrest +* `Trobz `_: + * Son Ho diff --git a/sale_exception_product_sale_manufactured_for/readme/CREDITS.rst b/sale_exception_product_sale_manufactured_for/readme/CREDITS.rst new file mode 100644 index 00000000000..578ada31e4e --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/readme/CREDITS.rst @@ -0,0 +1,3 @@ +**Financial support** +* Cosanum +* Camptocamp R&D diff --git a/sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.rst b/sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..e30ff42d192 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +The partner set in the sales order can order only if he/she +has a commercial entity that is listed as one of the partners +for which the products can be manufactured for. diff --git a/sale_exception_product_sale_manufactured_for/static/description/icon.png b/sale_exception_product_sale_manufactured_for/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/sale_exception_product_sale_manufactured_for/static/description/index.html b/sale_exception_product_sale_manufactured_for/static/description/index.html new file mode 100644 index 00000000000..bc82d781164 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/static/description/index.html @@ -0,0 +1,447 @@ + + + + + + +Sale Exception Product Manufactured for Customer + + + +
+

Sale Exception Product Manufactured for Customer

+ + +

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

+

The partner set in the sales order can order only if he/she +has a commercial entity that is listed as one of the partners +for which the products can be manufactured for.

+

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

+
    +
  • Camptocamp
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

Financial support +* Cosanum +* Camptocamp R&D

+
+
+

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/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_exception_product_sale_manufactured_for/tests/test_sale_exception.py b/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py index d91479d91ee..aac3ea6dfec 100644 --- a/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py +++ b/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py @@ -44,9 +44,7 @@ def setUpClass(cls): ) def test_commercial_partner_not_valid(self): - self.sale.partner_id.commercial_partner_id = self.env.ref( - "base.res_partner_2" - ) + self.sale.partner_id.commercial_partner_id = self.env.ref("base.res_partner_2") self.sale.action_confirm() self.assertEqual(self.sale.state, "draft") self.assertEqual(len(self.sale.exception_ids), 1) @@ -69,9 +67,7 @@ def test_commercial_partner_empty(self): def test_product_without_limits_partner_with_commercial_entity(self): self.product.product_tmpl_id.manufactured_for_partner_ids = False - self.sale.partner_id.commercial_partner_id = ( - self.partner_manufactured_for - ) + self.sale.partner_id.commercial_partner_id = self.partner_manufactured_for self.sale.action_confirm() self.assertEqual(self.sale.state, "sale") self.assertFalse(self.sale.exception_ids) From 4f7637771eb062094c8d83ee72fbbc10b1ffb53b Mon Sep 17 00:00:00 2001 From: Simone Orsi Date: Thu, 17 Aug 2023 14:57:27 +0200 Subject: [PATCH 3/8] sale_exception_product_sale_manufactured_for: adapt to variant Partner relation has been moved to variant here https://github.com/OCA/product-attribute/pull/1400 --- .../README.rst | 2 +- .../__manifest__.py | 2 +- .../models/sale_order.py | 9 ++++----- .../static/description/index.html | 2 +- .../tests/test_sale_exception.py | 10 ++++------ 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/sale_exception_product_sale_manufactured_for/README.rst b/sale_exception_product_sale_manufactured_for/README.rst index 88724c6c329..a3ad6ea1c86 100644 --- a/sale_exception_product_sale_manufactured_for/README.rst +++ b/sale_exception_product_sale_manufactured_for/README.rst @@ -7,7 +7,7 @@ Sale Exception Product Manufactured for Customer !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:fa72cd0debb7805d74e3dd077b42fe265ad1374d613fb16230cfd25eb4747905 + !! source digest: sha256:085a2fb87bda20031af7ba0a11403b34b0c473e63a33c0f9d6081b99e190defc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/sale_exception_product_sale_manufactured_for/__manifest__.py b/sale_exception_product_sale_manufactured_for/__manifest__.py index 5d366166bb0..f077f1ed301 100644 --- a/sale_exception_product_sale_manufactured_for/__manifest__.py +++ b/sale_exception_product_sale_manufactured_for/__manifest__.py @@ -5,7 +5,7 @@ "summary": "The partner set in the sales order can order only if he/she " "has a commercial entity that is listed as one of the partners " "for which the products can be manufactured for.", - "version": "14.0.1.0.1", + "version": "14.0.1.1.0", "category": "Sales", "website": "https://github.com/OCA/sale-workflow", "author": "Camptocamp, Odoo Community Association (OCA)", diff --git a/sale_exception_product_sale_manufactured_for/models/sale_order.py b/sale_exception_product_sale_manufactured_for/models/sale_order.py index 48d2e94283c..d3afa79e455 100644 --- a/sale_exception_product_sale_manufactured_for/models/sale_order.py +++ b/sale_exception_product_sale_manufactured_for/models/sale_order.py @@ -21,14 +21,13 @@ def exception_partner_can_order_manufactured_for(self): self.env.cr.execute( """ - SELECT rel.product_template_id, ARRAY_AGG(rel.res_partner_id) + SELECT rel.product_id, ARRAY_AGG(rel.partner_id) FROM sale_order_line sol - JOIN product_product pp ON (sol.product_id = pp.id) - JOIN product_template pt ON (pp.product_tmpl_id = pt.id) - JOIN product_template_res_partner_rel rel ON (rel.product_template_id = pt.id) + JOIN product_product prod ON (sol.product_id = prod.id) + JOIN product_product_manuf_for_partner_rel rel ON (rel.product_id = prod.id) WHERE sol.display_type IS NULL AND sol.order_id = %s - GROUP BY rel.product_template_id + GROUP BY rel.product_id """, (self.id,), ) diff --git a/sale_exception_product_sale_manufactured_for/static/description/index.html b/sale_exception_product_sale_manufactured_for/static/description/index.html index bc82d781164..a65d41a6ee6 100644 --- a/sale_exception_product_sale_manufactured_for/static/description/index.html +++ b/sale_exception_product_sale_manufactured_for/static/description/index.html @@ -367,7 +367,7 @@

Sale Exception Product Manufactured for Customer

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:fa72cd0debb7805d74e3dd077b42fe265ad1374d613fb16230cfd25eb4747905 +!! source digest: sha256:085a2fb87bda20031af7ba0a11403b34b0c473e63a33c0f9d6081b99e190defc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

The partner set in the sales order can order only if he/she diff --git a/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py b/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py index aac3ea6dfec..c6c7da705cc 100644 --- a/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py +++ b/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py @@ -18,9 +18,7 @@ def setUpClass(cls): partner_order = cls.env.ref("base.res_partner_1") cls.partner_manufactured_for = cls.env.ref("base.res_partner_3") cls.product = cls.env.ref("product.product_product_6") - cls.product.product_tmpl_id.manufactured_for_partner_ids |= ( - cls.partner_manufactured_for - ) + cls.product.manufactured_for_partner_ids |= cls.partner_manufactured_for cls.sale = cls.env["sale.order"].create( { @@ -53,7 +51,7 @@ def test_commercial_partner_not_valid(self): def test_commercial_partner_is_valid(self): self.sale.partner_id.commercial_partner_id = self.sale.order_line[ 0 - ].product_id.product_tmpl_id.manufactured_for_partner_ids[0] + ].product_id.manufactured_for_partner_ids[0] self.sale.action_confirm() self.assertEqual(self.sale.state, "sale") self.assertFalse(self.sale.exception_ids) @@ -66,14 +64,14 @@ def test_commercial_partner_empty(self): self.assertEqual(self.sale.exception_ids[0], self.exception) def test_product_without_limits_partner_with_commercial_entity(self): - self.product.product_tmpl_id.manufactured_for_partner_ids = False + self.product.manufactured_for_partner_ids = False self.sale.partner_id.commercial_partner_id = self.partner_manufactured_for self.sale.action_confirm() self.assertEqual(self.sale.state, "sale") self.assertFalse(self.sale.exception_ids) def test_product_without_limits_partner_without_commercial_entity(self): - self.product.product_tmpl_id.manufactured_for_partner_ids = False + self.product.manufactured_for_partner_ids = False self.sale.partner_id.commercial_partner_id = False self.sale.action_confirm() self.assertEqual(self.sale.state, "sale") From d6ec68d4c577ed0ab064bd19127ee30d85c17ba9 Mon Sep 17 00:00:00 2001 From: Ivorra78 Date: Wed, 17 Jan 2024 16:11:06 +0000 Subject: [PATCH 4/8] Added translation using Weblate (Spanish) --- .../i18n/es.po | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 sale_exception_product_sale_manufactured_for/i18n/es.po diff --git a/sale_exception_product_sale_manufactured_for/i18n/es.po b/sale_exception_product_sale_manufactured_for/i18n/es.po new file mode 100644 index 00000000000..72cad378fcd --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/i18n/es.po @@ -0,0 +1,48 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_exception_product_sale_manufactured_for +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: es\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: sale_exception_product_sale_manufactured_for +#: model:ir.model.fields,field_description:sale_exception_product_sale_manufactured_for.field_sale_order__display_name +msgid "Display Name" +msgstr "" + +#. module: sale_exception_product_sale_manufactured_for +#: model:ir.model.fields,field_description:sale_exception_product_sale_manufactured_for.field_sale_order__id +msgid "ID" +msgstr "" + +#. module: sale_exception_product_sale_manufactured_for +#: model:ir.model.fields,field_description:sale_exception_product_sale_manufactured_for.field_sale_order____last_update +msgid "Last Modified on" +msgstr "" + +#. module: sale_exception_product_sale_manufactured_for +#: model:exception.rule,name:sale_exception_product_sale_manufactured_for.exception_partner_can_order +msgid "Partner can order all the items in the sale" +msgstr "" + +#. module: sale_exception_product_sale_manufactured_for +#: model:ir.model,name:sale_exception_product_sale_manufactured_for.model_sale_order +msgid "Sales Order" +msgstr "" + +#. module: sale_exception_product_sale_manufactured_for +#: model:exception.rule,description:sale_exception_product_sale_manufactured_for.exception_partner_can_order +msgid "" +"The partner set in the sales order can order only\n" +" if he/she has a commercial entity that is listed as one of the partners\n" +" for which the products can be manufactured for." +msgstr "" From 3b88aab549cb0de663a5e8e540bf8cc5bc74d9a6 Mon Sep 17 00:00:00 2001 From: Ivorra78 Date: Wed, 17 Jan 2024 16:11:45 +0000 Subject: [PATCH 5/8] Translated using Weblate (Spanish) Currently translated at 100.0% (6 of 6 strings) Translation: sale-workflow-14.0/sale-workflow-14.0-sale_exception_product_sale_manufactured_for Translate-URL: https://translation.odoo-community.org/projects/sale-workflow-14-0/sale-workflow-14-0-sale_exception_product_sale_manufactured_for/es/ --- .../i18n/es.po | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/sale_exception_product_sale_manufactured_for/i18n/es.po b/sale_exception_product_sale_manufactured_for/i18n/es.po index 72cad378fcd..7b26f4a905a 100644 --- a/sale_exception_product_sale_manufactured_for/i18n/es.po +++ b/sale_exception_product_sale_manufactured_for/i18n/es.po @@ -6,38 +6,40 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2024-01-17 18:35+0000\n" +"Last-Translator: Ivorra78 \n" "Language-Team: none\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" #. module: sale_exception_product_sale_manufactured_for #: model:ir.model.fields,field_description:sale_exception_product_sale_manufactured_for.field_sale_order__display_name msgid "Display Name" -msgstr "" +msgstr "Mostrar Nombre" #. module: sale_exception_product_sale_manufactured_for #: model:ir.model.fields,field_description:sale_exception_product_sale_manufactured_for.field_sale_order__id msgid "ID" -msgstr "" +msgstr "ID" #. module: sale_exception_product_sale_manufactured_for #: model:ir.model.fields,field_description:sale_exception_product_sale_manufactured_for.field_sale_order____last_update msgid "Last Modified on" -msgstr "" +msgstr "Última Modificación el" #. module: sale_exception_product_sale_manufactured_for #: model:exception.rule,name:sale_exception_product_sale_manufactured_for.exception_partner_can_order msgid "Partner can order all the items in the sale" -msgstr "" +msgstr "Los socios pueden pedir todos los artículos de la oferta" #. module: sale_exception_product_sale_manufactured_for #: model:ir.model,name:sale_exception_product_sale_manufactured_for.model_sale_order msgid "Sales Order" -msgstr "" +msgstr "Orden de Ventas" #. module: sale_exception_product_sale_manufactured_for #: model:exception.rule,description:sale_exception_product_sale_manufactured_for.exception_partner_can_order @@ -46,3 +48,7 @@ msgid "" " if he/she has a commercial entity that is listed as one of the partners\n" " for which the products can be manufactured for." msgstr "" +"El socio establecido en el pedido de venta sólo puede realizar pedidos\n" +" si tiene una entidad comercial que figura como uno de los " +"socios\n" +" para los que se pueden fabricar los productos." From df38956b2b758fb9e6c935d3b87aa2c690ec7ca7 Mon Sep 17 00:00:00 2001 From: Lukas Tran Date: Tue, 3 Dec 2024 14:25:53 +0700 Subject: [PATCH 6/8] [IMP] sale_exception_product_sale_manufactured_for: pre-commit execution --- .../README.rst | 43 ++++++++++--------- .../pyproject.toml | 3 ++ .../readme/CONTRIBUTORS.md | 7 +++ .../readme/CONTRIBUTORS.rst | 6 --- .../readme/CREDITS.md | 1 + .../readme/CREDITS.rst | 3 -- .../readme/DESCRIPTION.md | 3 ++ .../readme/DESCRIPTION.rst | 3 -- .../static/description/index.html | 40 +++++++---------- 9 files changed, 52 insertions(+), 57 deletions(-) create mode 100644 sale_exception_product_sale_manufactured_for/pyproject.toml create mode 100644 sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.md delete mode 100644 sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.rst create mode 100644 sale_exception_product_sale_manufactured_for/readme/CREDITS.md delete mode 100644 sale_exception_product_sale_manufactured_for/readme/CREDITS.rst create mode 100644 sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.md delete mode 100644 sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.rst diff --git a/sale_exception_product_sale_manufactured_for/README.rst b/sale_exception_product_sale_manufactured_for/README.rst index a3ad6ea1c86..0974fbec378 100644 --- a/sale_exception_product_sale_manufactured_for/README.rst +++ b/sale_exception_product_sale_manufactured_for/README.rst @@ -17,20 +17,20 @@ Sale Exception Product Manufactured for Customer :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_exception_product_sale_manufactured_for + :target: https://github.com/OCA/sale-workflow/tree/18.0/sale_exception_product_sale_manufactured_for :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_exception_product_sale_manufactured_for + :target: https://translation.odoo-community.org/projects/sale-workflow-18-0/sale-workflow-18-0-sale_exception_product_sale_manufactured_for :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/sale-workflow&target_branch=14.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/sale-workflow&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -The partner set in the sales order can order only if he/she -has a commercial entity that is listed as one of the partners -for which the products can be manufactured for. +The partner set in the sales order can order only if he/she has a +commercial entity that is listed as one of the partners for which the +products can be manufactured for. **Table of contents** @@ -43,7 +43,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. @@ -51,29 +51,30 @@ Credits ======= Authors -~~~~~~~ +------- * Camptocamp Contributors -~~~~~~~~~~~~ +------------ -* `Camptocamp `_: - * Carlos Serra-Toro - * Simone Orsi - * Thierry Ducrest -* `Trobz `_: - * Son Ho +- `Camptocamp `__: + + - Carlos Serra-Toro + - Simone Orsi + - Thierry Ducrest + +- `Trobz `__: + + - Son Ho Other credits -~~~~~~~~~~~~~ +------------- -**Financial support** -* Cosanum -* Camptocamp R&D +**Financial support** \* Cosanum \* Camptocamp R&D Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -85,6 +86,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/sale-workflow `_ project on GitHub. +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_exception_product_sale_manufactured_for/pyproject.toml b/sale_exception_product_sale_manufactured_for/pyproject.toml new file mode 100644 index 00000000000..4231d0cccb3 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.md b/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.md new file mode 100644 index 00000000000..59e7fe6a799 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.md @@ -0,0 +1,7 @@ +- [Camptocamp](https://www.camptocamp.com): + - Carlos Serra-Toro \<\> + - Simone Orsi \<\> + - Thierry Ducrest \<\> + +- [Trobz](https://trobz.com): + - Son Ho \<\> diff --git a/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.rst b/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.rst deleted file mode 100644 index 17c35e9b1c9..00000000000 --- a/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,6 +0,0 @@ -* `Camptocamp `_: - * Carlos Serra-Toro - * Simone Orsi - * Thierry Ducrest -* `Trobz `_: - * Son Ho diff --git a/sale_exception_product_sale_manufactured_for/readme/CREDITS.md b/sale_exception_product_sale_manufactured_for/readme/CREDITS.md new file mode 100644 index 00000000000..e34bfbc4bc2 --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/readme/CREDITS.md @@ -0,0 +1 @@ +**Financial support** \* Cosanum \* Camptocamp R&D diff --git a/sale_exception_product_sale_manufactured_for/readme/CREDITS.rst b/sale_exception_product_sale_manufactured_for/readme/CREDITS.rst deleted file mode 100644 index 578ada31e4e..00000000000 --- a/sale_exception_product_sale_manufactured_for/readme/CREDITS.rst +++ /dev/null @@ -1,3 +0,0 @@ -**Financial support** -* Cosanum -* Camptocamp R&D diff --git a/sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.md b/sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.md new file mode 100644 index 00000000000..1e568217a6e --- /dev/null +++ b/sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.md @@ -0,0 +1,3 @@ +The partner set in the sales order can order only if he/she has a +commercial entity that is listed as one of the partners for which the +products can be manufactured for. diff --git a/sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.rst b/sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.rst deleted file mode 100644 index e30ff42d192..00000000000 --- a/sale_exception_product_sale_manufactured_for/readme/DESCRIPTION.rst +++ /dev/null @@ -1,3 +0,0 @@ -The partner set in the sales order can order only if he/she -has a commercial entity that is listed as one of the partners -for which the products can be manufactured for. diff --git a/sale_exception_product_sale_manufactured_for/static/description/index.html b/sale_exception_product_sale_manufactured_for/static/description/index.html index a65d41a6ee6..87062223ac1 100644 --- a/sale_exception_product_sale_manufactured_for/static/description/index.html +++ b/sale_exception_product_sale_manufactured_for/static/description/index.html @@ -1,4 +1,3 @@ - @@ -9,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. @@ -275,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 } @@ -301,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -369,10 +369,10 @@

Sale Exception Product Manufactured for Customer

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:085a2fb87bda20031af7ba0a11403b34b0c473e63a33c0f9d6081b99e190defc !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

-

The partner set in the sales order can order only if he/she -has a commercial entity that is listed as one of the partners -for which the products can be manufactured for.

+

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

+

The partner set in the sales order can order only if he/she has a +commercial entity that is listed as one of the partners for which the +products can be manufactured for.

Table of contents

    @@ -391,7 +391,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.

@@ -405,40 +405,32 @@

Authors

Contributors

Other credits

-

Financial support -* Cosanum -* Camptocamp R&D

+

Financial support * Cosanum * Camptocamp R&D

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

+

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.

From 1bcc4d75e6612433f0bc909e13e49f4490f13569 Mon Sep 17 00:00:00 2001 From: Lukas Tran Date: Tue, 3 Dec 2024 14:25:53 +0700 Subject: [PATCH 7/8] [MIG] sale_exception_product_sale_manufactured_for: Migration to 18.0 --- .../README.rst | 1 + .../__manifest__.py | 2 +- .../models/sale_order.py | 24 +++++++++++-------- .../readme/CONTRIBUTORS.md | 5 ++-- .../static/description/index.html | 1 + .../tests/test_sale_exception.py | 5 ++-- 6 files changed, 22 insertions(+), 16 deletions(-) diff --git a/sale_exception_product_sale_manufactured_for/README.rst b/sale_exception_product_sale_manufactured_for/README.rst index 0974fbec378..a0be31c4e25 100644 --- a/sale_exception_product_sale_manufactured_for/README.rst +++ b/sale_exception_product_sale_manufactured_for/README.rst @@ -67,6 +67,7 @@ Contributors - `Trobz `__: - Son Ho + - Nhan Tran Other credits ------------- diff --git a/sale_exception_product_sale_manufactured_for/__manifest__.py b/sale_exception_product_sale_manufactured_for/__manifest__.py index f077f1ed301..3e409b93352 100644 --- a/sale_exception_product_sale_manufactured_for/__manifest__.py +++ b/sale_exception_product_sale_manufactured_for/__manifest__.py @@ -5,7 +5,7 @@ "summary": "The partner set in the sales order can order only if he/she " "has a commercial entity that is listed as one of the partners " "for which the products can be manufactured for.", - "version": "14.0.1.1.0", + "version": "18.0.1.0.0", "category": "Sales", "website": "https://github.com/OCA/sale-workflow", "author": "Camptocamp, Odoo Community Association (OCA)", diff --git a/sale_exception_product_sale_manufactured_for/models/sale_order.py b/sale_exception_product_sale_manufactured_for/models/sale_order.py index d3afa79e455..05e5a9bb696 100644 --- a/sale_exception_product_sale_manufactured_for/models/sale_order.py +++ b/sale_exception_product_sale_manufactured_for/models/sale_order.py @@ -1,6 +1,7 @@ # Copyright 2021 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) from odoo import models +from odoo.tools import SQL class SaleOrder(models.Model): @@ -20,16 +21,19 @@ def exception_partner_can_order_manufactured_for(self): commercial_entity = self.partner_id.commercial_partner_id self.env.cr.execute( - """ - SELECT rel.product_id, ARRAY_AGG(rel.partner_id) - FROM sale_order_line sol - JOIN product_product prod ON (sol.product_id = prod.id) - JOIN product_product_manuf_for_partner_rel rel ON (rel.product_id = prod.id) - WHERE sol.display_type IS NULL - AND sol.order_id = %s - GROUP BY rel.product_id - """, - (self.id,), + SQL( + """ + SELECT rel.product_id, ARRAY_AGG(rel.partner_id) + FROM sale_order_line sol + JOIN product_product prod ON (sol.product_id = prod.id) + JOIN product_product_manuf_for_partner_rel rel + ON (rel.product_id = prod.id) + WHERE sol.display_type IS NULL + AND sol.order_id = %s + GROUP BY rel.product_id + """, + (self.id,), + ), ) for _, allowed_partner_ids in self.env.cr.fetchall(): # The product has limitations but the partner doesn't have diff --git a/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.md b/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.md index 59e7fe6a799..bc7703fe964 100644 --- a/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.md +++ b/sale_exception_product_sale_manufactured_for/readme/CONTRIBUTORS.md @@ -1,7 +1,8 @@ -- [Camptocamp](https://www.camptocamp.com): +- [Camptocamp](https://www.camptocamp.com): - Carlos Serra-Toro \<\> - Simone Orsi \<\> - Thierry Ducrest \<\> -- [Trobz](https://trobz.com): +- [Trobz](https://trobz.com): - Son Ho \<\> + - Nhan Tran \<\> diff --git a/sale_exception_product_sale_manufactured_for/static/description/index.html b/sale_exception_product_sale_manufactured_for/static/description/index.html index 87062223ac1..e048076e851 100644 --- a/sale_exception_product_sale_manufactured_for/static/description/index.html +++ b/sale_exception_product_sale_manufactured_for/static/description/index.html @@ -413,6 +413,7 @@

Contributors

  • Trobz:
  • diff --git a/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py b/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py index c6c7da705cc..6efc9a0d1bf 100644 --- a/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py +++ b/sale_exception_product_sale_manufactured_for/tests/test_sale_exception.py @@ -1,14 +1,13 @@ # Copyright 2021 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html) -from odoo.tests import SavepointCase +from odoo.addons.base.tests.common import BaseCommon -class TestSaleException(SavepointCase): +class TestSaleException(BaseCommon): @classmethod def setUpClass(cls): super().setUpClass() - cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) cls.exception = cls.env.ref( "sale_exception_product_sale_manufactured_for.exception_partner_can_order" From 8757602764f0c9e6ca4bab145184fbd049a301c4 Mon Sep 17 00:00:00 2001 From: Lukas Tran Date: Tue, 3 Dec 2024 16:14:00 +0700 Subject: [PATCH 8/8] [DON'T MERGE] Add test-requirements.txt --- test-requirements.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 test-requirements.txt diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 00000000000..58347d94b7d --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,2 @@ +odoo-addon-product_sale_manufactured_for @ git+https://github.com/OCA/product-attribute.git@refs/pull/1801/head#subdirectory=product_sale_manufactured_for +odoo-addon-sale_exception @ git+https://github.com/OCA/sale-workflow.git@refs/pull/3359/head#subdirectory=sale_exception