From efbb7a19dafde4be5f84faa74886ec4c3a3e9a7b Mon Sep 17 00:00:00 2001 From: Pablo Calvo Espinar Date: Tue, 15 Oct 2024 12:02:35 +0200 Subject: [PATCH] [FIX] website_sale_product_assortment: dont restrict other assortment products * Methods that calculate product availability based on e-commerce assortments are being corrected to make them compatible. --- .../__manifest__.py | 1 + .../controllers/website_sale.py | 6 ++- .../models/product_template.py | 15 ++++-- .../static/description/index.html | 12 +++-- .../src/js/no_restriction_no_show_tour.js | 49 +++++++++++++++++++ .../tests/test_ui.py | 36 ++++++++++++++ 6 files changed, 108 insertions(+), 11 deletions(-) create mode 100644 website_sale_product_assortment/static/src/js/no_restriction_no_show_tour.js diff --git a/website_sale_product_assortment/__manifest__.py b/website_sale_product_assortment/__manifest__.py index 218678108f..d7214ceae7 100644 --- a/website_sale_product_assortment/__manifest__.py +++ b/website_sale_product_assortment/__manifest__.py @@ -23,6 +23,7 @@ "website_sale_product_assortment/static/src/js/no_purchase_tour.js", "website_sale_product_assortment/static/src/js/no_restriction_tour.js", "website_sale_product_assortment/static/src/js/no_show_tour.js", + "website_sale_product_assortment/static/src/js/no_restriction_no_show_tour.js", ], }, } diff --git a/website_sale_product_assortment/controllers/website_sale.py b/website_sale_product_assortment/controllers/website_sale.py index 20252bafb8..af1efd1c57 100644 --- a/website_sale_product_assortment/controllers/website_sale.py +++ b/website_sale_product_assortment/controllers/website_sale.py @@ -17,15 +17,19 @@ def _get_products_allowed(self): .search( [ ("is_assortment", "=", True), - ("website_availability", "=", "no_show"), "|", ("website_ids", "=", False), ("website_ids", "=", website_id), ] ) ) + no_restriction_assortments = any( + assortment.website_availability == "no_show" for assortment in assortments + ) assortment_restriction = False allowed_product_ids = set() + if not no_restriction_assortments: + return allowed_product_ids, assortment_restriction for assortment in assortments: if ( # Set active_test to False to allow filtering by partners diff --git a/website_sale_product_assortment/models/product_template.py b/website_sale_product_assortment/models/product_template.py index 3f96895afd..6c9c273c36 100644 --- a/website_sale_product_assortment/models/product_template.py +++ b/website_sale_product_assortment/models/product_template.py @@ -16,19 +16,24 @@ def get_product_assortment_restriction_info(self, product_ids): .search( [ ("is_assortment", "=", True), - ("website_availability", "in", ["no_purchase", "no_show"]), "|", ("website_ids", "=", website.id), ("website_ids", "=", False), ] ) ) - assortment_dict = {} + partner_assortments = self.env["ir.filters"].sudo() + allowed_product_ids = set() for assortment in assortments: if partner & assortment.with_context(active_test=False).all_partner_ids: - allowed_product_ids = assortment.all_product_ids.ids - for product in product_ids: - if product not in allowed_product_ids: + if assortment.website_availability != "no_restriction": + partner_assortments |= assortment + allowed_product_ids.update(assortment.all_product_ids.ids) + assortment_dict = {} + for product in product_ids: + if product not in allowed_product_ids: + for assortment in partner_assortments: + if product not in assortment.all_product_ids.ids: assortment_dict.setdefault(product, self.env["ir.filters"]) assortment_dict[product] |= assortment return assortment_dict diff --git a/website_sale_product_assortment/static/description/index.html b/website_sale_product_assortment/static/description/index.html index f993730aae..4a3c961d75 100644 --- a/website_sale_product_assortment/static/description/index.html +++ b/website_sale_product_assortment/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 { @@ -442,7 +442,9 @@

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.

diff --git a/website_sale_product_assortment/static/src/js/no_restriction_no_show_tour.js b/website_sale_product_assortment/static/src/js/no_restriction_no_show_tour.js new file mode 100644 index 0000000000..d7e1d35d91 --- /dev/null +++ b/website_sale_product_assortment/static/src/js/no_restriction_no_show_tour.js @@ -0,0 +1,49 @@ +/* Copyright 2021 Tecnativa - Carlos Roca + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ +odoo.define( + "website_sale_product_assortment.no_restriction_no_show_tour", + function (require) { + "use strict"; + + var tour = require("web_tour.tour"); + + var steps = [ + { + trigger: "a:contains('Test Product 1')", + }, + { + trigger: "a#add_to_cart", + }, + { + trigger: "a[href='/shop/cart']", + extra_trigger: "sup.my_cart_quantity:contains('1')", + }, + { + content: "go back to the store", + trigger: "a[href='/shop']", + }, + { + trigger: "a:contains('Test Product 2')", + }, + { + trigger: "a#add_to_cart", + }, + { + trigger: "a[href='/shop/cart']", + extra_trigger: "sup.my_cart_quantity:contains('1')", + }, + ]; + + tour.register( + "test_assortment_with_no_restriction_no_show", + { + url: "/shop", + test: true, + }, + steps + ); + return { + steps: steps, + }; + } +); diff --git a/website_sale_product_assortment/tests/test_ui.py b/website_sale_product_assortment/tests/test_ui.py index 30baa14de4..d3b64056a0 100644 --- a/website_sale_product_assortment/tests/test_ui.py +++ b/website_sale_product_assortment/tests/test_ui.py @@ -16,6 +16,14 @@ def setUp(self): "type": "consu", } ) + self.product2 = self.env["product.template"].create( + { + "name": "Test Product 2", + "is_published": True, + "website_sequence": 2, + "type": "consu", + } + ) def test_01_ui_no_restriction(self): self.env["ir.filters"].create( @@ -26,6 +34,7 @@ def test_01_ui_no_restriction(self): "domain": [("id", "!=", self.product.product_variant_id.id)], "partner_domain": "[('id', '=', %s)]" % self.env.ref("base.partner_admin").id, + "website_availability": "no_restriction", } ) self.start_tour("/shop", "test_assortment_with_no_restriction", login="admin") @@ -62,3 +71,30 @@ def test_03_ui_no_purchase(self): } ) self.start_tour("/shop", "test_assortment_with_no_purchase", login="admin") + + def test_04_ui_no_restriction_no_show(self): + self.env["ir.filters"].create( + { + "name": "Test Assortment", + "model_id": "product.product", + "is_assortment": True, + "domain": [("id", "!=", self.product.product_variant_id.id)], + "partner_domain": "[('id', '=', %s)]" + % self.env.ref("base.partner_admin").id, + "website_availability": "no_show", + } + ) + self.env["ir.filters"].create( + { + "name": "Test Assortment 2", + "model_id": "product.product", + "is_assortment": True, + "domain": [("id", "!=", self.product2.product_variant_id.id)], + "partner_domain": "[('id', '=', %s)]" + % self.env.ref("base.partner_admin").id, + "website_availability": "no_restriction", + } + ) + self.start_tour( + "/shop", "test_assortment_with_no_restriction_no_show", login="admin" + )