diff --git a/addons/website_sale_product_configurator/controllers/main.py b/addons/website_sale_product_configurator/controllers/main.py
index 343ec003402..055a06d17bc 100644
--- a/addons/website_sale_product_configurator/controllers/main.py
+++ b/addons/website_sale_product_configurator/controllers/main.py
@@ -22,7 +22,7 @@ class WebsiteSaleProductConfiguratorController(Controller):
already_configured = bool(combination)
if not force_dialog and not has_optional_products and (
- product.product_variant_count <= 1 or already_configured
+ not product.has_configurable_attributes or already_configured
):
# The modal is not shown if there are no optional products and
# the main product either has no variants or is already configured
diff --git a/addons/website_sale_product_configurator/static/tests/tours/website_sale_configurator_only_dynamic_attributes.js b/addons/website_sale_product_configurator/static/tests/tours/website_sale_configurator_only_dynamic_attributes.js
new file mode 100644
index 00000000000..a918893f14e
--- /dev/null
+++ b/addons/website_sale_product_configurator/static/tests/tours/website_sale_configurator_only_dynamic_attributes.js
@@ -0,0 +1,29 @@
+/** @odoo-module **/
+
+import { registry } from "@web/core/registry";
+import tourUtils from "@website_sale/js/tours/tour_utils";
+
+registry.category("web_tour.tours").add('tour_configurator_quick_add_only_no_dynamic_attributes', {
+ test: true,
+ url: '/shop',
+ steps: () => [
+ ...tourUtils.searchProduct("Short (TEST)"),
+ {
+ content: "open configurator",
+ trigger: '.oe_product:has(a:contains("Short (TEST)")) div.o_wsale_product_btn a',
+ },
+ {
+ content: "select M dynamic attribute",
+ trigger: '.oe_advanced_configurator_modal label:contains("M dynamic") input',
+ },
+ {
+ content: "Go through the modal window of the product configurator",
+ extra_trigger: '.oe_advanced_configurator_modal strong:contains("Short (TEST) (M dynamic)")',
+ trigger: 'button span:contains(Proceed to Checkout)',
+ },
+ tourUtils.assertCartContains({
+ productName: 'Short (TEST) (M dynamic)',
+ backend: false,
+ }),
+ ]
+});
diff --git a/addons/website_sale_product_configurator/static/tests/tours/website_sale_configurator_only_no_variant_attributes.js b/addons/website_sale_product_configurator/static/tests/tours/website_sale_configurator_only_no_variant_attributes.js
new file mode 100644
index 00000000000..434fcf0823f
--- /dev/null
+++ b/addons/website_sale_product_configurator/static/tests/tours/website_sale_configurator_only_no_variant_attributes.js
@@ -0,0 +1,29 @@
+/** @odoo-module **/
+
+import { registry } from "@web/core/registry";
+import tourUtils from "@website_sale/js/tours/tour_utils";
+
+registry.category("web_tour.tours").add('tour_configurator_quick_add_only_no_variant_attributes', {
+ test: true,
+ url: '/shop',
+ steps: () => [
+ ...tourUtils.searchProduct("Short (TEST)"),
+ {
+ content: "open configurator",
+ trigger: '.oe_product:has(a:contains("Short (TEST)")) div.o_wsale_product_btn a',
+ },
+ {
+ content: "select M dynamic attribute",
+ trigger: '.oe_advanced_configurator_modal label:contains("M never") input',
+ },
+ {
+ content: "Go through the modal window of the product configurator",
+ trigger: 'button span:contains(Continue Shopping)',
+ },
+ {
+ content: "check that the novariants/custom attributes are displayed.",
+ trigger: '.toast-body span.text-muted.small:contains("Never attribute size: M never")',
+ isCheck: true,
+ },
+ ]
+});
diff --git a/addons/website_sale_product_configurator/static/tests/tours/website_sale_configurator_single_custom_attribute.js b/addons/website_sale_product_configurator/static/tests/tours/website_sale_configurator_single_custom_attribute.js
new file mode 100644
index 00000000000..31e4736fa21
--- /dev/null
+++ b/addons/website_sale_product_configurator/static/tests/tours/website_sale_configurator_single_custom_attribute.js
@@ -0,0 +1,29 @@
+/** @odoo-module **/
+
+import { registry } from "@web/core/registry";
+import tourUtils from "@website_sale/js/tours/tour_utils";
+
+registry.category("web_tour.tours").add('tour_configurator_quick_add_single_custom_attribute', {
+ test: true,
+ url: '/shop',
+ steps: () => [
+ ...tourUtils.searchProduct("Short (TEST)"),
+ {
+ content: "open configurator",
+ trigger: '.oe_product:has(a:contains("Short (TEST)")) div.o_wsale_product_btn a',
+ },
+ {
+ trigger: 'input.variant_custom_value',
+ run: 'text TEST',
+ },
+ {
+ content: "Go through the modal window of the product configurator",
+ trigger: 'button span:contains(Continue Shopping)',
+ },
+ {
+ content: "check that the novariants/custom attributes are displayed.",
+ trigger: '.toast-body span.text-muted.small:contains("Always attribute size: Yes never custom: TEST")',
+ isCheck: true,
+ },
+ ]
+});
diff --git a/addons/website_sale_product_configurator/tests/test_website_sale_configurator.py b/addons/website_sale_product_configurator/tests/test_website_sale_configurator.py
index 65666e43cba..faa2cec73ee 100644
--- a/addons/website_sale_product_configurator/tests/test_website_sale_configurator.py
+++ b/addons/website_sale_product_configurator/tests/test_website_sale_configurator.py
@@ -1,9 +1,10 @@
-# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from odoo.fields import Command
from odoo.tests import tagged
+
+from odoo.addons.base.tests.common import HttpCaseWithUserDemo, HttpCaseWithUserPortal
from odoo.addons.sale_product_configurator.tests.common import TestProductConfiguratorCommon
-from odoo.addons.base.tests.common import HttpCaseWithUserPortal, HttpCaseWithUserDemo
@tagged('post_install', '-at_install')
@@ -146,3 +147,86 @@ class TestWebsiteSaleProductConfigurator(TestProductConfiguratorCommon, HttpCase
new_sale_order = self.env['sale.order'].search([]) - old_sale_order
new_order_line = new_sale_order.order_line
self.assertEqual(new_order_line.name, 'Short (TEST) (M always, M dynamic)\n\nNever attribute size: M never\nNever attribute size custom: Yes never custom: TEST')
+
+ def test_03_only_no_variant_attributes(self):
+ """ Test that the configurator dialog is opened when a product with only no variant
+ attributes is added from the /shop page.
+ """
+ self.env.ref('website_sale.products_add_to_cart').active = True # Enable quick add button
+ no_variant_attribute = self.env['product.attribute'].create({
+ 'name': 'Never attribute size',
+ 'display_type': 'radio',
+ 'create_variant': 'no_variant',
+ 'value_ids': [
+ Command.create({'name': 'S never'}),
+ Command.create({'name': 'M never'}),
+ ]
+ })
+ self.env['product.template'].create({
+ 'name': 'Short (TEST)',
+ 'website_published': True,
+ 'attribute_line_ids': [
+ Command.create({
+ 'attribute_id': no_variant_attribute.id,
+ 'value_ids': [Command.set(no_variant_attribute.value_ids.ids)],
+ })
+ ],
+ })
+
+ self.start_tour("/shop", 'tour_configurator_quick_add_only_no_variant_attributes')
+
+ def test_04_only_dynamic_attributes(self):
+ """ Test that the configurator dialog is opened when a product with only dynamic
+ attributes is added from the /shop page.
+ """
+ self.env.ref('website_sale.products_add_to_cart').active = True # Enable quick add button
+ dynamic_attribute = self.env['product.attribute'].create({
+ 'name': 'Dynamic attribute size',
+ 'display_type': 'radio',
+ 'create_variant': 'dynamic',
+ 'value_ids': [
+ Command.create({'name': 'S dynamic'}),
+ Command.create({'name': 'M dynamic'}),
+ ]
+ })
+ self.env['product.template'].create({
+ 'name': 'Short (TEST)',
+ 'website_published': True,
+ 'attribute_line_ids': [
+ Command.create({
+ 'attribute_id': dynamic_attribute.id,
+ 'value_ids': [Command.set(dynamic_attribute.value_ids.ids)],
+ })
+ ],
+ })
+
+ self.start_tour("/shop", 'tour_configurator_quick_add_only_no_dynamic_attributes')
+
+ def test_05_single_custom_attribute(self):
+ """ Test that the configurator dialog is opened when a product with a single custom
+ attributes is added from the /shop page.
+ """
+ self.env.ref('website_sale.products_add_to_cart').active = True # Enable quick add button
+ attribute = self.env['product.attribute'].create({
+ 'name': 'Always attribute size',
+ 'display_type': 'radio',
+ 'create_variant': 'always',
+ 'value_ids': [
+ Command.create({
+ 'name': 'Yes never custom',
+ 'is_custom': True,
+ }),
+ ]
+ })
+ self.env['product.template'].create({
+ 'name': 'Short (TEST)',
+ 'website_published': True,
+ 'attribute_line_ids': [
+ Command.create({
+ 'attribute_id': attribute.id,
+ 'value_ids': [Command.set(attribute.value_ids.ids)],
+ })
+ ],
+ })
+
+ self.start_tour("/shop", 'tour_configurator_quick_add_single_custom_attribute')
diff --git a/addons/website_sale_product_configurator/views/templates.xml b/addons/website_sale_product_configurator/views/templates.xml
index 775ed93bcf7..3fe01e55e5f 100644
--- a/addons/website_sale_product_configurator/views/templates.xml
+++ b/addons/website_sale_product_configurator/views/templates.xml
@@ -77,7 +77,7 @@
-
+