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 @@
This module is maintained by the OCA.
-

+
+
+
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"
+ )