diff --git a/website_sale_product_assortment/__manifest__.py b/website_sale_product_assortment/__manifest__.py index dc59ad57eb..fbca0c8baa 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/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" + )