From 028f17197472ae47ce7a3db50fb547967e36de3a Mon Sep 17 00:00:00 2001 From: "Danny W. Adair" Date: Thu, 23 Nov 2023 11:14:12 +1300 Subject: [PATCH] [MIG] product_configurator: Migration to 16.0 --- product_configurator/README.rst | 4 +- product_configurator/__manifest__.py | 17 +- .../data/ir_config_parameter_data.xml | 16 +- .../data/ir_sequence_data.xml | 18 +- .../data/menu_configurable_product.xml | 126 +++--- .../data/product_attribute.xml | 4 +- .../demo/config_image_ids.xml | 128 +++--- .../demo/product_attribute.xml | 136 ++++--- .../demo/product_config_domain.xml | 27 +- .../demo/product_config_lines.xml | 39 +- .../demo/product_config_step.xml | 32 +- .../demo/product_template.xml | 186 +++++---- .../i18n/product_configurator.pot | 199 +++------ product_configurator/models/product.py | 84 ++-- .../models/product_attribute.py | 94 ++--- product_configurator/models/product_config.py | 158 ++++---- .../security/configurator_security.xml | 65 ++- .../static/js/data_manager.js | 23 -- .../static/scss/form_widget.scss | 10 - .../src/js/boolean_button_widget.esm.js | 58 +++ .../static/src/js/boolean_button_widget.xml | 16 + .../static/{ => src}/js/form_widgets.js | 43 -- .../static/{ => src}/js/relational_fields.js | 0 .../static/src/scss/form_widget.scss | 20 + product_configurator/tests/test_create.py | 20 +- product_configurator/tests/test_product.py | 105 ++--- .../tests/test_product_config.py | 20 +- .../test_product_configurator_test_cases.py | 20 +- product_configurator/tests/test_wizard.py | 112 +++--- product_configurator/views/assets.xml | 29 -- .../views/product_attribute_view.xml | 131 +++--- .../views/product_config_view.xml | 74 ++-- product_configurator/views/product_view.xml | 379 +++++++++--------- .../views/res_config_settings_view.xml | 37 +- .../wizard/product_configurator.py | 106 +++-- requirements.txt | 2 + 36 files changed, 1194 insertions(+), 1344 deletions(-) delete mode 100644 product_configurator/static/js/data_manager.js delete mode 100644 product_configurator/static/scss/form_widget.scss create mode 100644 product_configurator/static/src/js/boolean_button_widget.esm.js create mode 100644 product_configurator/static/src/js/boolean_button_widget.xml rename product_configurator/static/{ => src}/js/form_widgets.js (61%) rename product_configurator/static/{ => src}/js/relational_fields.js (100%) create mode 100644 product_configurator/static/src/scss/form_widget.scss delete mode 100644 product_configurator/views/assets.xml create mode 100644 requirements.txt diff --git a/product_configurator/README.rst b/product_configurator/README.rst index a020ca8d9..8a0df19a4 100644 --- a/product_configurator/README.rst +++ b/product_configurator/README.rst @@ -20,7 +20,7 @@ Product Configurator :target: https://translation.odoo-community.org/projects/product-configurator-14-0/product-configurator-14-0-product_configurator :alt: Translate me on Weblate -|badge1| |badge2| |badge3| |badge4| +|badge1| |badge2| |badge3| |badge4| This module has all the mechanics to support product configuration. It serves as a base dependency for configuration interfaces. @@ -67,7 +67,7 @@ promote its widespread use. Current `maintainer `__: -|maintainer-PCatinean| +|maintainer-PCatinean| This module is part of the `OCA/product-configurator `_ project on GitHub. diff --git a/product_configurator/__manifest__.py b/product_configurator/__manifest__.py index e1f59d9ab..401597978 100644 --- a/product_configurator/__manifest__.py +++ b/product_configurator/__manifest__.py @@ -1,11 +1,16 @@ { "name": "Product Configurator", - "version": "14.0.1.2.6", + "version": "16.0.1.0.0", "category": "Generic Modules/Base", "summary": "Base for product configuration interface modules", "author": "Pledra, Odoo Community Association (OCA)", "license": "AGPL-3", "website": "https://github.com/OCA/product-configurator", + "external_dependencies": { + "python": [ + "mako", + ] + }, "depends": ["account"], "data": [ "security/configurator_security.xml", @@ -15,12 +20,20 @@ "data/product_attribute.xml", "data/ir_sequence_data.xml", "data/ir_config_parameter_data.xml", - "views/assets.xml", "views/product_view.xml", "views/product_attribute_view.xml", "views/product_config_view.xml", "wizard/product_configurator_view.xml", ], + "assets": { + "web.assets_backend": [ + "/product_configurator/static/src/scss/form_widget.scss", + "/product_configurator/static/src/js/form_widgets.js", + "/product_configurator/static/src/js/boolean_button_widget.esm.js", + "/product_configurator/static/src/js/boolean_button_widget.xml", + "/product_configurator/static/src/js/relational_fields.js", + ] + }, "demo": [ "demo/product_template.xml", "demo/product_attribute.xml", diff --git a/product_configurator/data/ir_config_parameter_data.xml b/product_configurator/data/ir_config_parameter_data.xml index 1ad35dc47..f68621178 100644 --- a/product_configurator/data/ir_config_parameter_data.xml +++ b/product_configurator/data/ir_config_parameter_data.xml @@ -1,11 +1,9 @@ - - - - product_configurator.manager_product_configuration_settings - True - - + + + product_configurator.manager_product_configuration_settings + True + diff --git a/product_configurator/data/ir_sequence_data.xml b/product_configurator/data/ir_sequence_data.xml index 83721424d..805d5c689 100644 --- a/product_configurator/data/ir_sequence_data.xml +++ b/product_configurator/data/ir_sequence_data.xml @@ -1,13 +1,9 @@ - - - - - Configuration Session - product.config.session - CS - 4 - - - + + + Configuration Session + product.config.session + CS + 4 + diff --git a/product_configurator/data/menu_configurable_product.xml b/product_configurator/data/menu_configurable_product.xml index 27cbd6572..63e21736c 100644 --- a/product_configurator/data/menu_configurable_product.xml +++ b/product_configurator/data/menu_configurable_product.xml @@ -1,26 +1,25 @@ - + id="menu_product_configurable" + name="Configurator" + web_icon="product_configurator,static/description/icon.png" + sequence="20" + groups="product_configurator.group_product_configurator_manager" + /> + id="menu_product_configurable_product_main" + name="Configurable Products" + parent="menu_product_configurable" + sequence="10" + /> + id="menu_product_configurable_settings" + name="Configuration" + parent="menu_product_configurable" + sequence="20" + /> Configurable Templates @@ -29,16 +28,16 @@ kanban,tree,form {'default_config_ok': True, 'custom_create_variant': True, 'search_default_filter_config_ok': 1} + name="context" + >{'default_config_ok': True, 'custom_create_variant': True, 'search_default_filter_config_ok': 1} + action="product_configurable_template_action" + id="menu_product_configurable_template_action" + parent="menu_product_configurable_product_main" + sequence="20" + /> Configured Variants @@ -48,42 +47,42 @@ {'default_config_ok': True, 'custom_create_variant': True, 'search_default_filter_config_ok': 1} + name="context" + >{'default_config_ok': True, 'custom_create_variant': True, 'search_default_filter_config_ok': 1} + id="menu_product_configurable_variants_action" + action="product_configurable_variant_action" + name="Configurable Variants" + parent="menu_product_configurable_product_main" + sequence="25" + /> + id="action_product_configurator_configuration" + model="ir.actions.act_window" + > Settings ir.actions.act_window res.config.settings form inline + name="view_id" + ref="product_configurator.configurator_settings_view_form" + /> {'module' : 'product_configurator'} + id="menu_action_product_configurator_configuration" + action="action_product_configurator_configuration" + name="Settings" + active="False" + parent="menu_product_configurable_settings" + sequence="0" + /> Configuration Steps @@ -93,12 +92,12 @@ + id="menu_product_config_steps_action" + action="product_config_steps_action" + name="Configuration Steps" + parent="menu_product_configurable_settings" + sequence="30" + /> Configuration Restrictions @@ -108,12 +107,12 @@ + id="menu_product_config_domain_action" + action="product_config_domain_action" + name="Configuration Restrictions" + parent="menu_product_configurable_settings" + sequence="40" + /> Configuration Sessions @@ -123,12 +122,11 @@ + id="menu_product_config_session" + action="product_config_session" + name="Configuration Sessions" + parent="menu_product_configurable_settings" + sequence="50" + /> - diff --git a/product_configurator/data/product_attribute.xml b/product_configurator/data/product_attribute.xml index 5896e0472..5b7df2a41 100644 --- a/product_configurator/data/product_attribute.xml +++ b/product_configurator/data/product_attribute.xml @@ -1,6 +1,5 @@ - - + Custom @@ -13,5 +12,4 @@ - diff --git a/product_configurator/demo/config_image_ids.xml b/product_configurator/demo/config_image_ids.xml index caa85d6dd..47d6d2f0b 100644 --- a/product_configurator/demo/config_image_ids.xml +++ b/product_configurator/demo/config_image_ids.xml @@ -1,6 +1,5 @@ - @@ -8,151 +7,150 @@ Coupé Red + name="image_1920" + type="base64" + file="product_configurator/static/img/2-series-coupe.jpg" + /> + /> Coupé Silver + name="image_1920" + type="base64" + file="product_configurator/static/img/2-series-coupe-silver.jpg" + /> + /> Coupé Black + name="image_1920" + type="base64" + file="product_configurator/static/img/2-series-coupe-black.jpg" + /> + /> Coupé Red Rims 384 + name="image_1920" + type="base64" + file="product_configurator/static/img/2-series-coupe-red-star-spoke-384.jpg" + /> + /> Coupé Red Rims 387 + name="image_1920" + type="base64" + file="product_configurator/static/img/2-series-coupe-red-star-spoke-387.jpg" + /> + /> Coupé Silver Rims 384 + name="image_1920" + type="base64" + file="product_configurator/static/img/2-series-coupe-silver-star-spoke-384.jpg" + /> + /> Coupé Silver Rims 387 + name="image_1920" + type="base64" + file="product_configurator/static/img/2-series-coupe-silver-star-spoke-387.jpg" + /> + /> Coupé Black Rims 384 + name="image_1920" + type="base64" + file="product_configurator/static/img/2-series-coupe-black-star-spoke-384.jpg" + /> + /> Coupé Black Rims 387 + name="image_1920" + type="base64" + file="product_configurator/static/img/2-series-coupe-black-star-spoke-387.jpg" + /> + /> - diff --git a/product_configurator/demo/product_attribute.xml b/product_configurator/demo/product_attribute.xml index e17517b28..ded2454eb 100644 --- a/product_configurator/demo/product_attribute.xml +++ b/product_configurator/demo/product_attribute.xml @@ -1,6 +1,5 @@ - @@ -95,9 +94,9 @@ + id="product_attribute_value_model_sport_line" + model="product.attribute.value" + > Model Sport Line @@ -110,9 +109,9 @@ + id="product_attribute_value_model_luxury_line" + model="product.attribute.value" + > Model Luxury Line @@ -125,9 +124,9 @@ + id="product_attribute_value_model_advantage" + model="product.attribute.value" + > Model Advantage @@ -136,7 +135,7 @@ - Color + Paint Color @@ -188,17 +187,17 @@ + id="product_attribute_value_tapistry_oyster_black" + model="product.attribute.value" + > Oyster/Black + id="product_attribute_value_tapistry_coral_red_black" + model="product.attribute.value" + > Coral Red/Black @@ -216,9 +215,9 @@ + id="product_attribute_value_steptronic_sport" + model="product.attribute.value" + > Automatic Sport (Steptronic) @@ -258,30 +257,30 @@ + id="product_attribute_line_2_series_fuel" + model="product.template.attribute.line" + > + /> + id="product_attribute_line_2_series_engine" + model="product.template.attribute.line" + > + /> + id="product_attribute_line_2_series_model_line" + model="product.template.attribute.line" + > + /> + id="product_attribute_line_2_series_color" + model="product.template.attribute.line" + > + /> + id="product_attribute_line_2_series_rims" + model="product.template.attribute.line" + > + /> + id="product_attribute_line_2_series_tapistry" + model="product.template.attribute.line" + > + /> + id="product_attribute_line_2_series_transmission" + model="product.template.attribute.line" + > + /> + id="product_attribute_line_2_series_options" + model="product.template.attribute.line" + > + /> - diff --git a/product_configurator/demo/product_config_domain.xml b/product_configurator/demo/product_config_domain.xml index 50ff38a2e..e57d75f2a 100644 --- a/product_configurator/demo/product_config_domain.xml +++ b/product_configurator/demo/product_config_domain.xml @@ -1,6 +1,6 @@ - + @@ -15,10 +15,10 @@ in and + /> @@ -33,10 +33,10 @@ in and + /> @@ -52,10 +52,10 @@ in and + /> @@ -71,15 +71,14 @@ in and + /> - diff --git a/product_configurator/demo/product_config_lines.xml b/product_configurator/demo/product_config_lines.xml index 03bfafc18..616bb7225 100644 --- a/product_configurator/demo/product_config_lines.xml +++ b/product_configurator/demo/product_config_lines.xml @@ -1,6 +1,5 @@ - @@ -8,14 +7,14 @@ + /> @@ -23,48 +22,46 @@ + /> + name="attribute_line_id" + ref="product_attribute_line_2_series_model_line" + /> + /> + name="attribute_line_id" + ref="product_attribute_line_2_series_model_line" + /> + /> - - diff --git a/product_configurator/demo/product_config_step.xml b/product_configurator/demo/product_config_step.xml index 94bcf3ce4..797b7ebdc 100644 --- a/product_configurator/demo/product_config_step.xml +++ b/product_configurator/demo/product_config_step.xml @@ -1,6 +1,5 @@ - @@ -30,54 +29,53 @@ + /> + /> + /> + /> + /> - diff --git a/product_configurator/demo/product_template.xml b/product_configurator/demo/product_template.xml index 719b50a23..e97284215 100644 --- a/product_configurator/demo/product_template.xml +++ b/product_configurator/demo/product_template.xml @@ -1,6 +1,5 @@ - @@ -18,10 +17,10 @@ + name="image_1920" + type="base64" + file="product_configurator/static/img/2-series-coupe.jpg" + /> @@ -31,10 +30,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-sport-line.jpg" + /> @@ -42,10 +41,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-luxury-line.jpg" + /> @@ -53,10 +52,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-sport-line.jpg" + /> @@ -64,10 +63,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-luxury-line.jpg" + /> @@ -75,10 +74,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-m-sport.jpg" + /> @@ -86,10 +85,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-advantage.jpg" + /> @@ -97,10 +96,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-transmission-steptronic.jpg" + /> @@ -108,10 +107,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-transmission-steptronic-sport.jpg" + /> @@ -119,10 +118,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-sunroof.jpg" + /> @@ -130,10 +129,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-armrest.jpg" + /> @@ -141,10 +140,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-towhook.jpg" + /> @@ -152,10 +151,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-smoker-package.jpg" + /> @@ -163,10 +162,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-engine.jpg" + /> @@ -174,10 +173,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-engine.jpg" + /> @@ -185,10 +184,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-engine.jpg" + /> @@ -196,10 +195,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-engine.jpg" + /> @@ -207,10 +206,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-engine.jpg" + /> @@ -218,10 +217,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-engine.jpg" + /> @@ -229,10 +228,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-engine.jpg" + /> @@ -240,10 +239,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-engine.jpg" + /> @@ -251,10 +250,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-engine.jpg" + /> @@ -262,11 +261,10 @@ consu + name="image_1920" + type="base64" + file="product_configurator/static/img/product-paint-silver.jpg" + /> - diff --git a/product_configurator/i18n/product_configurator.pot b/product_configurator/i18n/product_configurator.pot index 6e06cac07..5ca1e1bfe 100644 --- a/product_configurator/i18n/product_configurator.pot +++ b/product_configurator/i18n/product_configurator.pot @@ -4,8 +4,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-06-11 06:00+0000\n" +"PO-Revision-Date: 2023-06-11 06:00+0000\n" "Last-Translator: \n" "Language-Team: \n" "MIME-Version: 1.0\n" @@ -14,6 +16,7 @@ msgstr "" "Plural-Forms: \n" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #, python-format msgid "" @@ -22,6 +25,7 @@ msgid "" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #, python-format msgid "" @@ -30,6 +34,7 @@ msgid "" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #, python-format msgid "" @@ -48,7 +53,6 @@ msgid "218d" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_engine_218d_coupe #: model:product.template,name:product_configurator.product_engine_218d_coupe_product_template msgid "218d Coupé" msgstr "" @@ -59,7 +63,6 @@ msgid "218i" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_engine_218i_coupe #: model:product.template,name:product_configurator.product_engine_218i_coupe_product_template msgid "218i Coupé" msgstr "" @@ -70,7 +73,6 @@ msgid "220d" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_engine_220d_coupe #: model:product.template,name:product_configurator.product_engine_220d_coupe_product_template msgid "220d Coupé" msgstr "" @@ -81,7 +83,6 @@ msgid "220d xDrive" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_engine_220d_xdrive_coupe #: model:product.template,name:product_configurator.product_engine_220d_xdrive_coupe_product_template msgid "220d xDrive Coupé" msgstr "" @@ -92,7 +93,6 @@ msgid "220i" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_engine_220i_coupe #: model:product.template,name:product_configurator.product_engine_220i_coupe_product_template msgid "220i Coupé" msgstr "" @@ -103,7 +103,6 @@ msgid "225d" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_engine_225d_coupe #: model:product.template,name:product_configurator.product_engine_225d_coupe_product_template msgid "225d Coupé" msgstr "" @@ -114,7 +113,6 @@ msgid "228i" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_engine_228i_coupe #: model:product.template,name:product_configurator.product_engine_228i_coupe_product_template msgid "228i Coupé" msgstr "" @@ -131,6 +129,7 @@ msgid "Active" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #, python-format msgid "" @@ -155,9 +154,10 @@ msgid "Allow selection of multiple values for this attribute?" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format -msgid "An error occursed while parsing value for attribute %s" +msgid "An error occurred while parsing value for attribute %s" msgstr "" #. module: product_configurator @@ -168,7 +168,6 @@ msgstr "" #. module: product_configurator #: model:product.attribute.value,name:product_configurator.product_attribute_value_armrest -#: model:product.product,name:product_configurator.product_2_series_armrest #: model:product.template,name:product_configurator.product_2_series_armrest_product_template msgid "Armrest" msgstr "" @@ -223,11 +222,6 @@ msgstr "" msgid "Attribute Value" msgstr "" -#. module: product_configurator -#: model_terms:ir.ui.view,arch_db:product_configurator.product_template_only_form_view_inherited -msgid "Attribute Value Dependencies" -msgstr "" - #. module: product_configurator #: model:ir.model.fields,field_description:product_configurator.field_product_product__attribute_value_line_ids #: model:ir.model.fields,field_description:product_configurator.field_product_template__attribute_value_line_ids @@ -246,6 +240,7 @@ msgid "Attribute Weight Extra" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "" @@ -254,6 +249,7 @@ msgid "" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "" @@ -266,11 +262,6 @@ msgstr "" msgid "Attribute value image (Display on website for radio buttons)" msgstr "" -#. module: product_configurator -#: model_terms:ir.ui.view,arch_db:product_configurator.product_template_only_form_view_inherited -msgid "Attribute value lines" -msgstr "" - #. module: product_configurator #: model:ir.actions.act_window,name:product_configurator.action_attributes_view #: model:ir.model.fields,field_description:product_configurator.field_product_configurator__attribute_line_ids @@ -289,7 +280,6 @@ msgid "Automatic Sport (Steptronic)" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_2_series_transmission_steptronic #: model:product.template,name:product_configurator.product_2_series_transmission_steptronic_product_template msgid "Automatic Transmission Steptronic" msgstr "" @@ -307,7 +297,6 @@ msgstr "" #. module: product_configurator #: model:product.config.step,name:product_configurator.config_step_body -#: model:product.config.step.line,name:product_configurator.2_series_config_step_body msgid "Body" msgstr "" @@ -332,6 +321,7 @@ msgid "Can be Configured" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "" @@ -340,12 +330,14 @@ msgid "" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "Cannot have a configuration step defined twice." msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/wizard/product_configurator.py:0 #, python-format msgid "" @@ -369,6 +361,11 @@ msgstr "" msgid "Condition" msgstr "" +#. module: product_configurator +#: model_terms:ir.ui.view,arch_db:product_configurator.product_template_only_form_view_inherited +msgid "Configurable" +msgstr "" + #. module: product_configurator #: model:ir.ui.menu,name:product_configurator.menu_product_configurable_product_main #: model_terms:ir.ui.view,arch_db:product_configurator.product_template_search_view @@ -376,6 +373,7 @@ msgid "Configurable Products" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #, python-format msgid "" @@ -447,7 +445,6 @@ msgstr "" #: model:ir.actions.act_window,name:product_configurator.product_config_session #: model:ir.ui.menu,name:product_configurator.menu_product_config_session #: model_terms:ir.ui.view,arch_db:product_configurator.product_config_session_form_view -#: model_terms:ir.ui.view,arch_db:product_configurator.product_config_session_tree_view msgid "Configuration Sessions" msgstr "" @@ -475,6 +472,7 @@ msgid "Configuration Steps" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "Configuration cannot have the same value inserted twice" @@ -618,18 +616,20 @@ msgstr "" #. module: product_configurator #: model:ir.model.fields,field_description:product_configurator.field_product_template_attribute_line__default_val -msgid "Default Value" +msgid "Default Val" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_attribute.py:0 #, python-format msgid "" "Default values for each attribute line must exist in the attribute values " -"(%s: %s)" +"(%(attr_name)s: %(default_val)s)" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #: code:addons/product_configurator/models/product_config.py:0 #, python-format @@ -654,9 +654,6 @@ msgid "Diesel" msgstr "" #. module: product_configurator -#: model:ir.model.fields,field_description:product_configurator.field_ir_ui_view__display_name -#: model:ir.model.fields,field_description:product_configurator.field_product_attribute__display_name -#: model:ir.model.fields,field_description:product_configurator.field_product_attribute_value__display_name #: model:ir.model.fields,field_description:product_configurator.field_product_attribute_value_line__display_name #: model:ir.model.fields,field_description:product_configurator.field_product_config_domain__display_name #: model:ir.model.fields,field_description:product_configurator.field_product_config_domain_line__display_name @@ -667,10 +664,6 @@ msgstr "" #: model:ir.model.fields,field_description:product_configurator.field_product_config_step__display_name #: model:ir.model.fields,field_description:product_configurator.field_product_config_step_line__display_name #: model:ir.model.fields,field_description:product_configurator.field_product_configurator__display_name -#: model:ir.model.fields,field_description:product_configurator.field_product_product__display_name -#: model:ir.model.fields,field_description:product_configurator.field_product_template__display_name -#: model:ir.model.fields,field_description:product_configurator.field_product_template_attribute_line__display_name -#: model:ir.model.fields,field_description:product_configurator.field_product_template_attribute_value__display_name msgid "Display Name" msgstr "" @@ -702,11 +695,11 @@ msgstr "" #. module: product_configurator #: model:product.attribute,name:product_configurator.product_attribute_engine #: model:product.config.step,name:product_configurator.config_step_engine -#: model:product.config.step.line,name:product_configurator.2_series_config_step_engine msgid "Engine" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #, python-format msgid "Error while calculating mako product name: %s" @@ -714,7 +707,6 @@ msgstr "" #. module: product_configurator #: model:product.config.step,name:product_configurator.config_step_extras -#: model:product.config.step.line,name:product_configurator.2_series_config_step_extras msgid "Extras" msgstr "" @@ -724,6 +716,7 @@ msgid "Field Type" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "Finished configuration session must have a product_id linked" @@ -735,6 +728,7 @@ msgid "Float" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #, python-format msgid "" @@ -759,9 +753,6 @@ msgid "Generate Name based on Mako Template" msgstr "" #. module: product_configurator -#: model:ir.model.fields,field_description:product_configurator.field_ir_ui_view__id -#: model:ir.model.fields,field_description:product_configurator.field_product_attribute__id -#: model:ir.model.fields,field_description:product_configurator.field_product_attribute_value__id #: model:ir.model.fields,field_description:product_configurator.field_product_attribute_value_line__id #: model:ir.model.fields,field_description:product_configurator.field_product_config_domain__id #: model:ir.model.fields,field_description:product_configurator.field_product_config_domain_line__id @@ -772,10 +763,6 @@ msgstr "" #: model:ir.model.fields,field_description:product_configurator.field_product_config_step__id #: model:ir.model.fields,field_description:product_configurator.field_product_config_step_line__id #: model:ir.model.fields,field_description:product_configurator.field_product_configurator__id -#: model:ir.model.fields,field_description:product_configurator.field_product_product__id -#: model:ir.model.fields,field_description:product_configurator.field_product_template__id -#: model:ir.model.fields,field_description:product_configurator.field_product_template_attribute_line__id -#: model:ir.model.fields,field_description:product_configurator.field_product_template_attribute_value__id msgid "ID" msgstr "" @@ -820,11 +807,11 @@ msgstr "" #. module: product_configurator #: model:product.config.step,name:product_configurator.config_step_interior -#: model:product.config.step.line,name:product_configurator.2_series_config_step_interior msgid "Interior" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #: code:addons/product_configurator/models/product_config.py:0 #, python-format @@ -842,9 +829,6 @@ msgid "Is this attribute required?" msgstr "" #. module: product_configurator -#: model:ir.model.fields,field_description:product_configurator.field_ir_ui_view____last_update -#: model:ir.model.fields,field_description:product_configurator.field_product_attribute____last_update -#: model:ir.model.fields,field_description:product_configurator.field_product_attribute_value____last_update #: model:ir.model.fields,field_description:product_configurator.field_product_attribute_value_line____last_update #: model:ir.model.fields,field_description:product_configurator.field_product_config_domain____last_update #: model:ir.model.fields,field_description:product_configurator.field_product_config_domain_line____last_update @@ -855,10 +839,6 @@ msgstr "" #: model:ir.model.fields,field_description:product_configurator.field_product_config_step____last_update #: model:ir.model.fields,field_description:product_configurator.field_product_config_step_line____last_update #: model:ir.model.fields,field_description:product_configurator.field_product_configurator____last_update -#: model:ir.model.fields,field_description:product_configurator.field_product_product____last_update -#: model:ir.model.fields,field_description:product_configurator.field_product_template____last_update -#: model:ir.model.fields,field_description:product_configurator.field_product_template_attribute_line____last_update -#: model:ir.model.fields,field_description:product_configurator.field_product_template_attribute_value____last_update msgid "Last Modified on" msgstr "" @@ -893,13 +873,11 @@ msgstr "" #. module: product_configurator #: model:product.attribute,name:product_configurator.product_attribute_model_line #: model:product.config.step,name:product_configurator.config_step_lines -#: model:product.config.step.line,name:product_configurator.2_series_config_step_lines msgid "Lines" msgstr "" #. module: product_configurator #: model:product.attribute.value,name:product_configurator.product_attribute_value_luxury_line -#: model:product.product,name:product_configurator.product_bmw_luxury_line #: model:product.template,name:product_configurator.product_bmw_luxury_line_product_template msgid "Luxury Line" msgstr "" @@ -910,7 +888,6 @@ msgid "M235i" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_engine_m235i_coupe #: model:product.template,name:product_configurator.product_engine_m235i_coupe_product_template msgid "M235i Coupé" msgstr "" @@ -921,7 +898,6 @@ msgid "M235i xDrive" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_engine_m2351_xdrive_coupe #: model:product.template,name:product_configurator.product_engine_m2351_xdrive_coupe_product_template msgid "M235i xDrive Coupe" msgstr "" @@ -953,6 +929,7 @@ msgid "Maximum value allowed" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_attribute.py:0 #, python-format msgid "Maximum value must be greater than Minimum value" @@ -970,28 +947,24 @@ msgstr "" #. module: product_configurator #: model:product.attribute.value,name:product_configurator.product_attribute_value_model_advantage -#: model:product.product,name:product_configurator.product_bmw_model_advantage #: model:product.template,name:product_configurator.product_bmw_model_advantage_product_template msgid "Model Advantage" msgstr "" #. module: product_configurator #: model:product.attribute.value,name:product_configurator.product_attribute_value_model_luxury_line -#: model:product.product,name:product_configurator.product_bmw_model_luxury_line #: model:product.template,name:product_configurator.product_bmw_model_luxury_line_product_template msgid "Model Luxury Line" msgstr "" #. module: product_configurator #: model:product.attribute.value,name:product_configurator.product_attribute_value_model_m_sport -#: model:product.product,name:product_configurator.product_bmw_model_m_sport #: model:product.template,name:product_configurator.product_bmw_model_m_sport_product_template msgid "Model M Sport" msgstr "" #. module: product_configurator #: model:product.attribute.value,name:product_configurator.product_attribute_value_model_sport_line -#: model:product.product,name:product_configurator.product_bmw_model_sport_line #: model:product.template,name:product_configurator.product_bmw_model_sport_line_product_template msgid "Model Sport Line" msgstr "" @@ -1012,6 +985,7 @@ msgid "Name" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "New" @@ -1023,11 +997,12 @@ msgid "Next" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_attribute.py:0 #, python-format msgid "" -"On the product %s you cannot associate the value %s with the attribute %s " -"because they do not match." +"On the product %(product)s you cannot associate the value %(value)s with the" +" attribute %(attr)s because they do not match." msgstr "" #. module: product_configurator @@ -1058,7 +1033,8 @@ msgid "Price" msgstr "" #. module: product_configurator -#: model:ir.model,name:product_configurator.model_product_product +#: model:ir.model,name:product_configurator.model_product_template +#: model:ir.model.fields,field_description:product_configurator.field_product_attribute_value__product_id #: model:ir.model.fields,field_description:product_configurator.field_product_config_image__product_tmpl_id #: model:ir.model.fields,field_description:product_configurator.field_product_config_session__product_id msgid "Product" @@ -1121,7 +1097,6 @@ msgid "Product Img" msgstr "" #. module: product_configurator -#: model:ir.model,name:product_configurator.model_product_template #: model:ir.model.fields,field_description:product_configurator.field_product_attribute_value_line__product_tmpl_id #: model:ir.model.fields,field_description:product_configurator.field_product_config_line__product_tmpl_id #: model:ir.model.fields,field_description:product_configurator.field_product_config_step_line__product_tmpl_id @@ -1139,6 +1114,7 @@ msgid "Product Template Attribute Value" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/wizard/product_configurator.py:0 #, python-format msgid "Product Template does not have any attribute lines defined" @@ -1150,6 +1126,7 @@ msgid "Product Value" msgstr "" #. module: product_configurator +#: model:ir.model,name:product_configurator.model_product_product #: model:ir.model.fields,field_description:product_configurator.field_product_configurator__product_id msgid "Product Variant" msgstr "" @@ -1160,6 +1137,7 @@ msgid "Product configuration Wizard" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "Product created via configuration wizard" @@ -1175,11 +1153,6 @@ msgstr "" msgid "Red" msgstr "" -#. module: product_configurator -#: model:ir.model.fields,field_description:product_configurator.field_product_attribute_value__product_id -msgid "Related Product" -msgstr "" - #. module: product_configurator #: model:ir.model.fields,field_description:product_configurator.field_product_attribute__required #: model:ir.model.fields,field_description:product_configurator.field_product_template_attribute_line__required @@ -1187,6 +1160,7 @@ msgid "Required" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "Required attribute '%s' is empty" @@ -1204,6 +1178,7 @@ msgid "Restrictions" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #, python-format msgid "" @@ -1233,27 +1208,32 @@ msgid "Searchable" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_attribute.py:0 #, python-format msgid "Selected custom field type '%s' is not searchable" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_attribute.py:0 #, python-format -msgid "Selected custom value '%s' must be at least %s" +msgid "Selected custom value '%(name)s' must be at least %(min_val)s" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_attribute.py:0 #, python-format -msgid "Selected custom value '%s' must be between %s and %s" +msgid "" +"Selected custom value '%(name)s' must be between %(min_val)s and %(max_val)s" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_attribute.py:0 #, python-format -msgid "Selected custom value '%s' must be lower than %s" +msgid "Selected custom value '%(name)s' must be lower than %(max_value)s" msgstr "" #. module: product_configurator @@ -1293,19 +1273,18 @@ msgid "Silver" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_paint_silver #: model:product.template,name:product_configurator.product_paint_silver_product_template msgid "Silver Paint" msgstr "" #. module: product_configurator #: model:product.attribute.value,name:product_configurator.product_attribute_value_smoker_package -#: model:product.product,name:product_configurator.product_2_series_smoker_package #: model:product.template,name:product_configurator.product_2_series_smoker_package_product_template msgid "Smoker Package" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #: code:addons/product_configurator/models/product.py:0 #, python-format @@ -1315,14 +1294,12 @@ msgid "" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_2_series_transmission_steptronic_sport #: model:product.template,name:product_configurator.product_2_series_transmission_steptronic_sport_product_template msgid "Sport Automatic Transmission Steptronic" msgstr "" #. module: product_configurator #: model:product.attribute.value,name:product_configurator.product_attribute_value_sport_line -#: model:product.product,name:product_configurator.product_bmw_sport_line #: model:product.template,name:product_configurator.product_bmw_sport_line_product_template msgid "Sport Line" msgstr "" @@ -1340,7 +1317,6 @@ msgstr "" #. module: product_configurator #: model:product.attribute.value,name:product_configurator.product_attribute_value_sunroof -#: model:product.product,name:product_configurator.product_2_series_sunroof #: model:product.template,name:product_configurator.product_2_series_sunroof_product_template msgid "Sunroof" msgstr "" @@ -1366,9 +1342,12 @@ msgid "Textarea" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_attribute.py:0 #, python-format -msgid "The attribute %s must have at least one value for the product %s." +msgid "" +"The attribute %(attr)s must have at least one value for the product " +"%(product)s." msgstr "" #. module: product_configurator @@ -1379,6 +1358,7 @@ msgid "" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "" @@ -1388,6 +1368,7 @@ msgid "" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "" @@ -1397,6 +1378,7 @@ msgid "" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "The following values are not available:" @@ -1408,6 +1390,7 @@ msgid "The type of the custom field generated in the frontend" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/wizard/product_configurator.py:0 #, python-format msgid "There was a problem rendering the view (dynamic_form not found)" @@ -1425,7 +1408,6 @@ msgid "Tow hook" msgstr "" #. module: product_configurator -#: model:product.product,name:product_configurator.product_2_series_towhook #: model:product.template,name:product_configurator.product_2_series_towhook_product_template msgid "Towhook" msgstr "" @@ -1445,55 +1427,6 @@ msgstr "" msgid "Unit of Measure" msgstr "" -#. module: product_configurator -#: model:product.product,uom_name:product_configurator.product_2_series_armrest -#: model:product.product,uom_name:product_configurator.product_2_series_smoker_package -#: model:product.product,uom_name:product_configurator.product_2_series_sunroof -#: model:product.product,uom_name:product_configurator.product_2_series_towhook -#: model:product.product,uom_name:product_configurator.product_2_series_transmission_steptronic -#: model:product.product,uom_name:product_configurator.product_2_series_transmission_steptronic_sport -#: model:product.product,uom_name:product_configurator.product_bmw_luxury_line -#: model:product.product,uom_name:product_configurator.product_bmw_model_advantage -#: model:product.product,uom_name:product_configurator.product_bmw_model_luxury_line -#: model:product.product,uom_name:product_configurator.product_bmw_model_m_sport -#: model:product.product,uom_name:product_configurator.product_bmw_model_sport_line -#: model:product.product,uom_name:product_configurator.product_bmw_sport_line -#: model:product.product,uom_name:product_configurator.product_engine_218d_coupe -#: model:product.product,uom_name:product_configurator.product_engine_218i_coupe -#: model:product.product,uom_name:product_configurator.product_engine_220d_coupe -#: model:product.product,uom_name:product_configurator.product_engine_220d_xdrive_coupe -#: model:product.product,uom_name:product_configurator.product_engine_220i_coupe -#: model:product.product,uom_name:product_configurator.product_engine_225d_coupe -#: model:product.product,uom_name:product_configurator.product_engine_228i_coupe -#: model:product.product,uom_name:product_configurator.product_engine_m2351_xdrive_coupe -#: model:product.product,uom_name:product_configurator.product_engine_m235i_coupe -#: model:product.product,uom_name:product_configurator.product_paint_silver -#: model:product.template,uom_name:product_configurator.bmw_2_series -#: model:product.template,uom_name:product_configurator.product_2_series_armrest_product_template -#: model:product.template,uom_name:product_configurator.product_2_series_smoker_package_product_template -#: model:product.template,uom_name:product_configurator.product_2_series_sunroof_product_template -#: model:product.template,uom_name:product_configurator.product_2_series_towhook_product_template -#: model:product.template,uom_name:product_configurator.product_2_series_transmission_steptronic_product_template -#: model:product.template,uom_name:product_configurator.product_2_series_transmission_steptronic_sport_product_template -#: model:product.template,uom_name:product_configurator.product_bmw_luxury_line_product_template -#: model:product.template,uom_name:product_configurator.product_bmw_model_advantage_product_template -#: model:product.template,uom_name:product_configurator.product_bmw_model_luxury_line_product_template -#: model:product.template,uom_name:product_configurator.product_bmw_model_m_sport_product_template -#: model:product.template,uom_name:product_configurator.product_bmw_model_sport_line_product_template -#: model:product.template,uom_name:product_configurator.product_bmw_sport_line_product_template -#: model:product.template,uom_name:product_configurator.product_engine_218d_coupe_product_template -#: model:product.template,uom_name:product_configurator.product_engine_218i_coupe_product_template -#: model:product.template,uom_name:product_configurator.product_engine_220d_coupe_product_template -#: model:product.template,uom_name:product_configurator.product_engine_220d_xdrive_coupe_product_template -#: model:product.template,uom_name:product_configurator.product_engine_220i_coupe_product_template -#: model:product.template,uom_name:product_configurator.product_engine_225d_coupe_product_template -#: model:product.template,uom_name:product_configurator.product_engine_228i_coupe_product_template -#: model:product.template,uom_name:product_configurator.product_engine_m2351_xdrive_coupe_product_template -#: model:product.template,uom_name:product_configurator.product_engine_m235i_coupe_product_template -#: model:product.template,uom_name:product_configurator.product_paint_silver_product_template -msgid "Units" -msgstr "" - #. module: product_configurator #: model:ir.model.fields,field_description:product_configurator.field_product_config_session__user_id #: model:ir.model.fields,field_description:product_configurator.field_product_configurator__user_id @@ -1531,12 +1464,14 @@ msgid "Values Configuration" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "Values entered for line '%s' generate a incompatible configuration" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #, python-format msgid "" @@ -1545,6 +1480,7 @@ msgid "" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_attribute.py:0 #, python-format msgid "" @@ -1557,17 +1493,6 @@ msgstr "" msgid "Variant Name" msgstr "" -#. module: product_configurator -#: model_terms:ir.ui.view,arch_db:product_configurator.product_form_view_custom_vals_inherit -#: model_terms:ir.ui.view,arch_db:product_configurator.product_template_only_form_view_inherited -msgid "Variant Prices" -msgstr "" - -#. module: product_configurator -#: model_terms:ir.ui.view,arch_db:product_configurator.variants_tree_view -msgid "Variant Values" -msgstr "" - #. module: product_configurator #: model:ir.model.fields,field_description:product_configurator.field_product_product__mako_tmpl_name #: model:ir.model.fields,field_description:product_configurator.field_product_template__mako_tmpl_name @@ -1600,12 +1525,14 @@ msgid "" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product.py:0 #, python-format msgid "You cannot have a duplicate configuration for the same value" msgstr "" #. module: product_configurator +#. odoo-python #: code:addons/product_configurator/models/product_config.py:0 #: code:addons/product_configurator/models/product_config.py:0 #, python-format diff --git a/product_configurator/models/product.py b/product_configurator/models/product.py index b16a9fb0e..fe89a0a3a 100644 --- a/product_configurator/models/product.py +++ b/product_configurator/models/product.py @@ -6,7 +6,6 @@ from odoo import _, api, fields, models from odoo.exceptions import ValidationError -from odoo.tools.safe_eval import safe_eval _logger = logging.getLogger(__name__) @@ -20,12 +19,13 @@ def _compute_product_variant_count(self): 1 as many views and methods trigger only when a template has at least one variant attached. Since we create them from the template we should have access to them always""" - super(ProductTemplate, self)._compute_product_variant_count() + result = super(ProductTemplate, self)._compute_product_variant_count() for product_tmpl in self: config_ok = product_tmpl.config_ok variant_count = product_tmpl.product_variant_count if config_ok and not variant_count: product_tmpl.product_variant_count = 1 + return result @api.depends("attribute_line_ids.value_ids") def _compute_template_attr_vals(self): @@ -70,7 +70,7 @@ def _validate_unique_config(self): ] if len(set(attr_val_line_vals)) != len(attr_val_line_vals): raise ValidationError( - _("You cannot have a duplicate configuration for the " "same value") + _("You cannot have a duplicate configuration for the same value") ) config_ok = fields.Boolean(string="Can be Configured") @@ -134,29 +134,18 @@ def _compute_weight(self): for product in config_products: product.weight = product.weight_dummy standard_products = self - config_products - super(ProductTemplate, standard_products)._compute_weight() + return super(ProductTemplate, standard_products)._compute_weight() def _set_weight(self): for product_tmpl in self: product_tmpl.weight_dummy = product_tmpl.weight if not product_tmpl.config_ok: super(ProductTemplate, product_tmpl)._set_weight() + return def _search_weight(self, operator, value): return [("weight_dummy", operator, value)] - def get_product_attribute_values_action(self): - self.ensure_one() - action = self.env["ir.actions.actions"]._for_xml_id( - "product.product_attribute_value_action" - ) - value_ids = self.attribute_line_ids.mapped("product_template_value_ids").ids - action["domain"] = [("id", "in", value_ids)] - context = safe_eval(action["context"], {"active_id": self.id}) - context.update({"active_id": self.id}) - action["context"] = context - return action - def _check_default_values(self): default_val_ids = ( self.attribute_line_ids.filtered(lambda l: l.default_val) @@ -169,27 +158,27 @@ def _check_default_values(self): cfg_session_obj.validate_configuration( value_ids=default_val_ids, product_tmpl_id=self.id, final=False ) - except ValidationError as ex: - raise ValidationError(ex.name) - except Exception: + except ValidationError as exc: + raise ValidationError(exc.args[0]) from exc + except Exception as exc: raise ValidationError( _("Default values provided generate an invalid configuration") - ) + ) from exc @api.constrains("config_line_ids", "attribute_line_ids") def _check_default_value_domains(self): for template in self: try: template._check_default_values() - except ValidationError as e: + except ValidationError as exc: raise ValidationError( _( "Restrictions added make the current default values " "generate an invalid configuration.\ \n%s" ) - % (e.name) - ) + % (exc.name) + ) from exc def toggle_config(self): for record in self: @@ -329,13 +318,14 @@ def check_config_user_access(self): ) ) - @api.model - def create(self, vals): + @api.model_create_multi + def create(self, vals_list): """Patch for check access rights of user(configurable products)""" - config_ok = vals.get("config_ok", False) - if config_ok: - self.check_config_user_access() - return super(ProductTemplate, self).create(vals) + for vals in vals_list: + config_ok = vals.get("config_ok", False) + if config_ok: + self.check_config_user_access() + return super(ProductTemplate, self).create(vals_list) def write(self, vals): """Patch for check access rights of user(configurable products)""" @@ -489,9 +479,7 @@ def _inverse_product_weight(self): config_name = fields.Char( string="Configuration Name", compute="_compute_config_name" ) - weight_extra = fields.Float( - string="Weight Extra", compute="_compute_product_weight_extra" - ) + weight_extra = fields.Float(compute="_compute_product_weight_extra") weight_dummy = fields.Float(string="Manual Weight", digits="Stock Weight") weight = fields.Float( compute="_compute_product_weight", @@ -503,18 +491,6 @@ def _inverse_product_weight(self): # product preset config_preset_ok = fields.Boolean(string="Is Preset") - def get_product_attribute_values_action(self): - self.ensure_one() - action = self.env["ir.actions.actions"]._for_xml_id( - "product.product_attribute_value_action" - ) - value_ids = self.product_template_attribute_value_ids.ids - action["domain"] = [("id", "in", value_ids)] - context = safe_eval(action["context"], {"active_id": self.product_tmpl_id.id}) - context.update({"active_id": self.product_tmpl_id.id}) - action["context"] = context - return action - def _compute_config_name(self): """Compute the name of the configurable products and use template name for others""" @@ -572,13 +548,14 @@ def unlink(self): self.env.context = ctx return super(ProductProduct, self).unlink() - @api.model - def create(self, vals): + @api.model_create_multi + def create(self, vals_list): """Patch for check access rights of user(configurable products)""" - config_ok = vals.get("config_ok", False) - if config_ok: - self.check_config_user_access(mode="create") - return super(ProductProduct, self).create(vals) + for vals in vals_list: + config_ok = vals.get("config_ok", False) + if config_ok: + self.check_config_user_access(mode="create") + return super(ProductProduct, self).create(vals_list) def write(self, vals): """Patch for check access rights of user(configurable products)""" @@ -593,7 +570,11 @@ def _compute_product_price_extra(self): standard_products = self.filtered(lambda product: not product.config_ok) config_products = self - standard_products if standard_products: - super(ProductProduct, standard_products)._compute_product_price_extra() + result = super( + ProductProduct, standard_products + )._compute_product_price_extra() + else: + result = None for product in config_products: attribute_value_obj = self.env["product.attribute.value"] value_ids = ( @@ -603,3 +584,4 @@ def _compute_product_price_extra(self): product_tmpl_id=product.product_tmpl_id.id, pt_attr_value_ids=value_ids ) product.price_extra = sum(extra_prices.values()) + return result diff --git a/product_configurator/models/product_attribute.py b/product_configurator/models/product_attribute.py index 67c42f492..766c6b403 100644 --- a/product_configurator/models/product_attribute.py +++ b/product_configurator/models/product_attribute.py @@ -49,7 +49,6 @@ def onchange_val_custom_field(self): ] active = fields.Boolean( - string="Active", default=True, help="By unchecking the active field you can " "disable a attribute without deleting it", @@ -66,7 +65,7 @@ def onchange_val_custom_field(self): string="Field Type", help="The type of the custom field generated in the frontend", ) - description = fields.Text(string="Description", translate=True) + description = fields.Text(translate=True) search_ok = fields.Boolean( string="Searchable", help="When checking for variants with " @@ -74,18 +73,16 @@ def onchange_val_custom_field(self): "include this field in the search?", ) required = fields.Boolean( - string="Required", default=True, help="Determines the required value of this " "attribute though it can be change on " "the template level", ) multi = fields.Boolean( - string="Multi", - help="Allow selection of multiple values for " "this attribute?", + help="Allow selection of multiple values for this attribute?", ) uom_id = fields.Many2one(comodel_name="uom.uom", string="Unit of Measure") - image = fields.Binary(string="Image") + image = fields.Binary() # TODO prevent the same attribute from being defined twice on the # attribute lines @@ -96,15 +93,13 @@ def check_searchable_field(self): nosearch_fields = attribute._get_nosearch_fields() if attribute.custom_type in nosearch_fields and attribute.search_ok: raise ValidationError( - _( - "Selected custom field type '%s' is not searchable" - % attribute.custom_type - ) + _("Selected custom field type '%s' is not searchable") + % attribute.custom_type ) def validate_custom_val(self, val): """Pass in a desired custom value and ensure it is valid. - Probaly should check type, etc, but let's assume fine for the moment. + Probably should check type, etc., but let's assume fine for the moment. """ self.ensure_one() if self.custom_type in ("integer", "float"): @@ -114,23 +109,28 @@ def validate_custom_val(self, val): if minv and maxv and (val < minv or val > maxv): raise ValidationError( _( - "Selected custom value '%s' must be between %s and %s" - % (self.name, self.min_val, self.max_val) + "Selected custom value '%(name)s' must be " + "between %(min_val)s and %(max_val)s" + ) + % ( + { + "name": self.name, + "min_val": self.min_val, + "max_val": self.max_val, + } ) ) elif minv and val < minv: raise ValidationError( - _( - "Selected custom value '%s' must be at least %s" - % (self.name, self.min_val) - ) + _("Selected custom value '%(name)s' must be at least %(min_val)s") + % ({"name": self.name, "min_val": self.min_val}) ) elif maxv and val > maxv: raise ValidationError( _( - "Selected custom value '%s' must be lower than %s" - % (self.name, self.max_val + 1) + "Selected custom value '%(name)s' must be lower than %(max_value)s" ) + % ({"name": self.name, "max_val": self.max_val + 1}) ) @api.constrains("min_val", "max_val") @@ -168,19 +168,14 @@ def onchange_values(self): if self.default_val and self.default_val not in self.value_ids: self.default_val = None - custom = fields.Boolean( - string="Custom", help="Allow custom values for this attribute?" - ) - required = fields.Boolean(string="Required", help="Is this attribute required?") + custom = fields.Boolean(help="Allow custom values for this attribute?") + required = fields.Boolean(help="Is this attribute required?") multi = fields.Boolean( - string="Multi", help="Allow selection of multiple values for this attribute?", ) - default_val = fields.Many2one( - comodel_name="product.attribute.value", string="Default Value" - ) + default_val = fields.Many2one(comodel_name="product.attribute.value") - sequence = fields.Integer(string="Sequence", default=10) + sequence = fields.Integer(default=10) @api.constrains("value_ids", "default_val") def _check_default_values(self): @@ -191,8 +186,13 @@ def _check_default_values(self): raise ValidationError( _( "Default values for each attribute line must exist in " - "the attribute values (%s: %s)" - % (line.attribute_id.name, line.default_val.name) + "the attribute values (%(attr_name)s: %(default_val)s)" + ) + % ( + { + "attr_name": line.attribute_id.name, + "default_val": line.default_val.name, + } ) ) @@ -208,26 +208,30 @@ def _check_valid_values(self): # Customization End raise ValidationError( _( - "The attribute %s must have at least one value for " - "the product %s." + "The attribute %(attr)s must have at least one value for " + "the product %(product)s." ) % ( - ptal.attribute_id.display_name, - ptal.product_tmpl_id.display_name, + { + "attr": ptal.attribute_id.display_name, + "product": ptal.product_tmpl_id.display_name, + } ) ) for pav in ptal.value_ids: if pav.attribute_id != ptal.attribute_id: raise ValidationError( _( - "On the product %s you cannot associate the " - "value %s with the attribute %s because they " + "On the product %(product)s you cannot associate the " + "value %(value)s with the attribute %(attr)s because they " "do not match." ) % ( - ptal.product_tmpl_id.display_name, - pav.display_name, - ptal.attribute_id.display_name, + { + "product": ptal.product_tmpl_id.display_name, + "value": pav.display_name, + "attr": ptal.attribute_id.display_name, + } ) ) return True @@ -246,16 +250,12 @@ def copy(self, default=None): return product active = fields.Boolean( - string="Active", default=True, help="By unchecking the active field you can " "disable a attribute value without deleting it", ) - product_id = fields.Many2one( - comodel_name="product.product", string="Related Product" - ) + product_id = fields.Many2one(comodel_name="product.product") image = fields.Binary( - string="Image", attachment=True, help="Attribute value image (Display on website for radio buttons)", ) @@ -272,7 +272,9 @@ def get_attribute_value_extra_prices( [("id", "in", pt_attr_value_ids.ids), ("product_id", "!=", False)] ) extra_prices = { - av.id: av.product_id.with_context(pricelist=pricelist.id).price + av.id: av.product_id.with_context( + pricelist=pricelist.id + )._get_contextual_price() for av in related_product_av_ids } remaining_av_ids = pt_attr_value_ids - related_product_av_ids @@ -381,7 +383,7 @@ class ProductAttributeValueLine(models.Model): _description = "Product Attribute Value Line" _order = "sequence" - sequence = fields.Integer(string="Sequence", default=10) + sequence = fields.Integer(default=10) product_tmpl_id = fields.Many2one( comodel_name="product.template", string="Product Template", diff --git a/product_configurator/models/product_config.py b/product_configurator/models/product_config.py index 795b8242e..ec1395e3a 100644 --- a/product_configurator/models/product_config.py +++ b/product_configurator/models/product_config.py @@ -1,9 +1,12 @@ +import logging from ast import literal_eval from odoo import _, api, fields, models from odoo.exceptions import UserError, ValidationError from odoo.tools.misc import formatLang +_logger = logging.getLogger(__name__) + class ProductConfigDomain(models.Model): _name = "product.config.domain" @@ -51,7 +54,7 @@ def compute_domain(self): ) return computed_domain - name = fields.Char(string="Name", required=True) + name = fields.Char(required=True) domain_line_ids = fields.One2many( comodel_name="product.config.domain.line", inverse_name="domain_id", @@ -97,6 +100,11 @@ def _compute_template_attribute_value_ids(self): domain._get_allowed_attribute_value_ids() ) + def _compute_attribute_id_domain(self): + if "product_attribute_ids" in self.env.context: + return [("id", "in", self.env.context["product_attribute_ids"][0][2])] + return [] + def _get_allowed_attribute_value_ids(self): self.ensure_one() product_template = self.env["product.template"] @@ -118,14 +126,15 @@ def _get_allowed_attribute_value_ids(self): compute="_compute_template_attribute_value_ids", ) attribute_id = fields.Many2one( - comodel_name="product.attribute", string="Attribute", required=True + comodel_name="product.attribute", + string="Attribute", + required=True, + domain=lambda self: self._compute_attribute_id_domain(), ) domain_id = fields.Many2one( comodel_name="product.config.domain", required=True, string="Rule" ) - condition = fields.Selection( - selection=_get_domain_conditions, string="Condition", required=True - ) + condition = fields.Selection(selection=_get_domain_conditions, required=True) value_ids = fields.Many2many( comodel_name="product.attribute.value", relation="product_config_domain_line_attr_rel", @@ -141,7 +150,6 @@ def _get_allowed_attribute_value_ids(self): required=True, ) sequence = fields.Integer( - string="Sequence", default=1, help="Set the order of operations for evaluation domain lines", ) @@ -210,7 +218,7 @@ def _compute_template_attribute_ids(self): required=True, string="Restrictions", ) - sequence = fields.Integer(string="Sequence", default=10) + sequence = fields.Integer(default=10) @api.constrains("value_ids") def check_value_attributes(self): @@ -234,14 +242,14 @@ class ProductConfigImage(models.Model): _description = "Product Config Image" _order = "sequence" - name = fields.Char("Name", required=True, translate=True) + name = fields.Char(required=True, translate=True) product_tmpl_id = fields.Many2one( comodel_name="product.template", string="Product", ondelete="cascade", required=True, ) - sequence = fields.Integer(string="Sequence", default=10) + sequence = fields.Integer(default=10) value_ids = fields.Many2many( comodel_name="product.attribute.value", string="Configuration" ) @@ -258,13 +266,14 @@ def _check_value_ids(self): product_tmpl_id=cfg_img.product_tmpl_id.id, final=False, ) - except ValidationError: + except ValidationError as exc: raise ValidationError( _( "Values entered for line '%s' generate " - "a incompatible configuration" % cfg_img.name + "a incompatible configuration" ) - ) + % cfg_img.name + ) from exc class ProductConfigStep(models.Model): @@ -274,7 +283,7 @@ class ProductConfigStep(models.Model): # TODO: Prevent values which have dependencies to be set in a # step with higher sequence than the dependency - name = fields.Char(string="Name", required=True, translate=True) + name = fields.Char(required=True, translate=True) class ProductConfigStepLine(models.Model): @@ -301,7 +310,7 @@ class ProductConfigStepLine(models.Model): ondelete="cascade", required=True, ) - sequence = fields.Integer(string="Sequence", default=10) + sequence = fields.Integer(default=10) @api.constrains("config_step_id") def _check_config_step(self): @@ -367,7 +376,7 @@ def _compute_config_step_name(self): try: cfg_step_line_ids.add(int(step)) except ValueError: - pass + _logger.debug("Step from session not valid") cfg_step_lines = cfg_step_line_obj.browse(cfg_step_line_ids) for session in self: try: @@ -377,7 +386,7 @@ def _compute_config_step_name(self): ) session.config_step_name = config_step_line.name except Exception: - pass + _logger.debug("Invalid session data ignored") if not session.config_step_name: session.config_step_name = session.config_step @@ -398,7 +407,7 @@ def get_cfg_weight(self, value_ids=None, custom_vals=None): product_tmpl = self.product_tmpl_id - self = self.with_context({"active_id": product_tmpl.id}) + self = self.with_context(active_id=product_tmpl.id) value_ids = self.flatten_val_ids(value_ids) @@ -465,7 +474,6 @@ def _compute_currency_id(self): ) price = fields.Float( compute="_compute_cfg_price", - string="Price", store=True, digits="Product Price", ) @@ -475,14 +483,11 @@ def _compute_currency_id(self): compute="_compute_currency_id", ) state = fields.Selection( - string="State", required=True, selection=[("draft", "Draft"), ("done", "Done")], default="draft", ) - weight = fields.Float( - string="Weight", compute="_compute_cfg_weight", digits="Stock Weight" - ) + weight = fields.Float(compute="_compute_cfg_weight", digits="Stock Weight") # Product preset product_preset_id = fields.Many2one( comodel_name="product.product", @@ -548,10 +553,8 @@ def update_session_configuration_value(self, vals, product_tmpl_id=None): field_val = vals[field_name] else: raise UserError( - _( - "An error occursed while parsing value for " - "attribute %s" % attr_line.attribute_id.name - ) + _("An error occurred while parsing value for attribute %s") + % attr_line.attribute_id.name ) attr_val_dict.update({attr_id: field_val}) # Ensure there is no custom value stored if we have switched @@ -633,6 +636,9 @@ def update_config(self, attr_val_dict=None, custom_val_dict=None): ) .ids ) + else: + binary_field_ids = [] + for attr_id, vals in custom_val_dict.items(): if not vals: continue @@ -670,45 +676,51 @@ def write(self, vals): self.value_ids = [(6, 0, avail_val_ids)] try: self.validate_configuration(final=False) - except ValidationError as ex: - raise ValidationError(_("%s" % ex.name)) - except Exception: - raise ValidationError(_("Invalid Configuration")) + except ValidationError as exc: + raise ValidationError(_("%s") % exc.name) from exc + except Exception as exc: + raise ValidationError(_("Invalid Configuration")) from exc return res - @api.model - def create(self, vals): - vals["name"] = self.env["ir.sequence"].next_by_code( - "product.config.session" - ) or _("New") - product_tmpl = ( - self.env["product.template"].browse(vals.get("product_tmpl_id")).exists() - ) - if product_tmpl: - default_val_ids = ( - product_tmpl.attribute_line_ids.filtered(lambda l: l.default_val) - .mapped("default_val") - .ids + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + vals["name"] = self.env["ir.sequence"].next_by_code( + "product.config.session" + ) or _("New") + product_tmpl = ( + self.env["product.template"] + .browse(vals.get("product_tmpl_id")) + .exists() ) - value_ids = vals.get("value_ids") - if value_ids: - default_val_ids += value_ids[0][2] - try: - self.validate_configuration( - value_ids=default_val_ids, - final=False, - product_tmpl_id=product_tmpl.id, - ) - # TODO: Remove if cond when PR with - # raise error on github is merged - except ValidationError as ex: - raise ValidationError(_("%s" % ex.name)) - except Exception: - raise ValidationError( - _("Default values provided generate an invalid " "configuration") + if product_tmpl: + default_val_ids = ( + product_tmpl.attribute_line_ids.filtered(lambda l: l.default_val) + .mapped("default_val") + .ids ) - vals.update({"value_ids": [(6, 0, default_val_ids)]}) - return super(ProductConfigSession, self).create(vals) + value_ids = vals.get("value_ids") + if value_ids: + default_val_ids += value_ids[0][2] + try: + self.validate_configuration( + value_ids=default_val_ids, + final=False, + product_tmpl_id=product_tmpl.id, + ) + # TODO: Remove if cond when PR with + # raise error on github is merged + except ValidationError as exc: + raise ValidationError(_("%s") % exc.name) from exc + except Exception as exc: + raise ValidationError( + _( + "Default values provided generate an invalid " + "configuration" + ) + ) from exc + vals.update({"value_ids": [(6, 0, default_val_ids)]}) + return super(ProductConfigSession, self).create(vals_list) def create_get_variant(self, value_ids=None, custom_vals=None): """Creates a new product variant with the attributes passed @@ -731,10 +743,10 @@ def create_get_variant(self, value_ids=None, custom_vals=None): try: self.validate_configuration() - except ValidationError as ex: - raise ValidationError(_("%s" % ex.name)) - except Exception: - raise ValidationError(_("Invalid Configuration")) + except ValidationError as exc: + raise ValidationError(_("%s") % exc.name) from exc + except Exception as exc: + raise ValidationError(_("Invalid Configuration")) from exc duplicates = self.search_variant( value_ids=value_ids, product_tmpl_id=self.product_tmpl_id @@ -762,7 +774,7 @@ def _get_option_values(self, pricelist, value_ids=None): value_ids = self.value_ids.ids value_obj = self.env["product.attribute.value"].with_context( - {"pricelist": pricelist.id} + pricelist=pricelist.id ) values = ( value_obj.sudo().browse(value_ids).filtered(lambda x: x.product_id.price) @@ -783,7 +795,7 @@ def get_components_prices(self, prices, pricelist, value_ids=None): val.product_id.price, ) ) - product = val.product_id.with_context({"pricelist": pricelist.id}) + product = val.product_id.with_context(pricelist=pricelist.id) product_prices = product.taxes_id.sudo().compute_all( price_unit=product.price, currency=pricelist.currency_id, @@ -814,7 +826,7 @@ def get_cfg_price(self, value_ids=None, custom_vals=None): custom_vals = {} product_tmpl = self.product_tmpl_id - self = self.with_context({"active_id": product_tmpl.id}) + self = self.with_context(active_id=product_tmpl.id) value_ids = self.flatten_val_ids(value_ids) @@ -926,7 +938,7 @@ def get_next_step( value_ids=False, custom_value_ids=False, ): - """Find and return next step if exit. This usually + """Find and return next step if it exists. This usually implies the next configuration step (if any) defined via the config_step_line_ids on the product.template. """ @@ -1267,7 +1279,7 @@ def check_attributes_configuration( ): # TODO: Verify custom value type to be correct raise ValidationError( - _("Required attribute '%s' is empty" % (attr.name)) + _("Required attribute '%s' is empty") % (attr.name) ) @api.model @@ -1580,9 +1592,7 @@ def _compute_val_name(self): (" %s" % uom) or "", ) - name = fields.Char( - string="Name", readonly=True, compute="_compute_val_name", store=True - ) + name = fields.Char(readonly=True, compute="_compute_val_name", store=True) attribute_id = fields.Many2one( comodel_name="product.attribute", string="Attribute", required=True ) @@ -1592,7 +1602,7 @@ def _compute_val_name(self): ondelete="cascade", string="Session", ) - value = fields.Char(string="Value", help="Custom value held as string") + value = fields.Char(help="Custom value held as string") attachment_ids = fields.Many2many( comodel_name="ir.attachment", relation="product_config_session_custom_value_attachment_rel", diff --git a/product_configurator/security/configurator_security.xml b/product_configurator/security/configurator_security.xml index a4b1bfa5d..8d7f835f0 100644 --- a/product_configurator/security/configurator_security.xml +++ b/product_configurator/security/configurator_security.xml @@ -1,43 +1,38 @@ - - - Product Configurator - + + Product Configurator + - - User - - - + + User + + + - - Manager - - - - + + Manager + + + + - - - - - - - + + + + + + + - diff --git a/product_configurator/static/js/data_manager.js b/product_configurator/static/js/data_manager.js deleted file mode 100644 index 7d594f1c3..000000000 --- a/product_configurator/static/js/data_manager.js +++ /dev/null @@ -1,23 +0,0 @@ -odoo.define("product_configurator.DataManager", function (require) { - "use strict"; - - var Manager = require("web.DataManager"); - - Manager.include({ - /** - * Disable view caching for product.configurator model as it has a very - * heavy reliance on the fields_view_get method to generate and update - * dynamic content. - * - * @param {Object} params see load_view documentation - * @param {Object} options see load_view documentation - * @returns the load_views expected result - */ - load_views: function (params, options) { - if (params.context.view_cache === false) { - this.invalidate(); - } - return this._super(params, options); - }, - }); -}); diff --git a/product_configurator/static/scss/form_widget.scss b/product_configurator/static/scss/form_widget.scss deleted file mode 100644 index f91c98276..000000000 --- a/product_configurator/static/scss/form_widget.scss +++ /dev/null @@ -1,10 +0,0 @@ -.oe_stat_button { - &:hover { - .o_boolean_button .o_not_hover { - display: none; - } - .o_boolean_button .o_hover { - display: inline-block !important; - } - } -} diff --git a/product_configurator/static/src/js/boolean_button_widget.esm.js b/product_configurator/static/src/js/boolean_button_widget.esm.js new file mode 100644 index 000000000..0973764ba --- /dev/null +++ b/product_configurator/static/src/js/boolean_button_widget.esm.js @@ -0,0 +1,58 @@ +/** @odoo-module **/ +const {onMounted, onRendered, useRef, useState} = owl; +import {BooleanField} from "@web/views/fields/boolean/boolean_field"; +import {registry} from "@web/core/registry"; +import {standardFieldProps} from "@web/views/fields/standard_field_props"; + +export class BooleanButtonField extends BooleanField { + setup() { + super.setup(); + this.state1 = useState({value: 0}); + this.root = useRef("root"); + onMounted(() => { + this.updateConfigurableButton(); + }); + onRendered(() => { + this.updateConfigurableButton(); + }); + } + + onChange() { + this.state1.value++; + } + + updateConfigurableButton() { + this.text = this.props.value + ? this.props.activeString + : this.props.inactiveString; + this.hover = this.props.value + ? this.props.inactiveString + : this.props.activeString; + var val_color = this.props.value ? "text-success" : "text-danger"; + var hover_color = this.props.value ? "text-danger" : "text-success"; + var $val = $("") + .addClass("o_stat_text o_boolean_button o_not_hover " + val_color) + .text(this.text); + var $hover = $("") + .addClass("o_stat_text o_boolean_button o_hover d-none " + hover_color) + .text(this.hover); + $(this.root.el).empty(); + $(this.root.el).append($val).append($hover); + } +} + +BooleanButtonField.props = { + ...standardFieldProps, + activeString: {type: String, optional: true}, + inactiveString: {type: String, optional: true}, +}; + +BooleanButtonField.extractProps = ({attrs}) => { + return { + activeString: attrs.options.active, + inactiveString: attrs.options.inactive, + }; +}; + +BooleanButtonField.template = "product_configurator.BooleanButtonField"; +registry.category("fields").add("boolean_button", BooleanButtonField); diff --git a/product_configurator/static/src/js/boolean_button_widget.xml b/product_configurator/static/src/js/boolean_button_widget.xml new file mode 100644 index 000000000..b1d6447d5 --- /dev/null +++ b/product_configurator/static/src/js/boolean_button_widget.xml @@ -0,0 +1,16 @@ + + + + +
+ +
+
+ +
diff --git a/product_configurator/static/js/form_widgets.js b/product_configurator/static/src/js/form_widgets.js similarity index 61% rename from product_configurator/static/js/form_widgets.js rename to product_configurator/static/src/js/form_widgets.js index b93b11027..b45e17f26 100644 --- a/product_configurator/static/js/form_widgets.js +++ b/product_configurator/static/src/js/form_widgets.js @@ -1,51 +1,11 @@ -/* Add one more option to boolean_button form widget (displayed in the product.template form view) */ odoo.define("product_configurator.FieldBooleanButton", function (require) { "use strict"; - var basic_fields = require("web.basic_fields"); - var registry = require("web.field_registry"); var FormController = require("web.FormController"); var ListController = require("web.ListController"); var KanbanController = require("web.KanbanController"); var pyUtils = require("web.py_utils"); - var core = require("web.core"); - var _lt = core._lt; - - var FieldBooleanButton = basic_fields.FieldBoolean.extend({ - description: _lt("Button"), - className: basic_fields.FieldBoolean.prototype.className + " o_boolean_button", - events: { - click: "_onToggleButton", - hover: "_onHoverButton", - }, - supportedFieldTypes: ["boolean"], - _render: function () { - this._super.apply(this, arguments); - this.$el.removeClass("custom-control"); - this.$el.empty(); - this.text = this.value - ? this.attrs.options.active - : this.attrs.options.inactive; - this.hover = this.value - ? this.attrs.options.inactive - : this.attrs.options.active; - var val_color = this.value ? "text-success" : "text-danger"; - var hover_color = this.value ? "text-danger" : "text-success"; - var $val = $("") - .addClass("o_stat_text o_not_hover " + val_color) - .text(this.text); - var $hover = $("") - .addClass("o_stat_text o_hover d-none " + hover_color) - .text(this.hover); - this.$el.append($val).append($hover); - }, - - _onToggleButton: function (event) { - event.stopPropagation(); - this._setValue(!this.value); - }, - }); FormController.include({ /* eslint-disable no-unused-vars*/ @@ -116,7 +76,4 @@ odoo.define("product_configurator.FieldBooleanButton", function (require) { }, /* eslint-disable no-unused-vars*/ }); - - registry.add("boolean_button", FieldBooleanButton); - return FieldBooleanButton; }); diff --git a/product_configurator/static/js/relational_fields.js b/product_configurator/static/src/js/relational_fields.js similarity index 100% rename from product_configurator/static/js/relational_fields.js rename to product_configurator/static/src/js/relational_fields.js diff --git a/product_configurator/static/src/scss/form_widget.scss b/product_configurator/static/src/scss/form_widget.scss new file mode 100644 index 000000000..7a9323bc1 --- /dev/null +++ b/product_configurator/static/src/scss/form_widget.scss @@ -0,0 +1,20 @@ +.oe_stat_button { + &:hover { + .o_boolean_button.o_not_hover { + display: none; + } + .o_boolean_button.o_hover { + display: inline-block !important; + } + } +} + +.oe_prod_config_image { + img { + min-height: 30px; + } +} + +.pull-right { + float: right; +} diff --git a/product_configurator/tests/test_create.py b/product_configurator/tests/test_create.py index 93a80abbc..dc97ee1c4 100644 --- a/product_configurator/tests/test_create.py +++ b/product_configurator/tests/test_create.py @@ -115,21 +115,21 @@ def test_02_previous_step_incompatible_changes(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, } ) product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_color.id): self.value_red.id, - "__attribute-{}".format(self.attr_rims.id): self.value_rims_378.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_rims.id): self.value_rims_378.id, } ) product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_model_line.id ): self.value_sport_line.id, } @@ -138,14 +138,14 @@ def test_02_previous_step_incompatible_changes(self): product_config_wizard.action_previous_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_engine.id): self.value_220i.id, + "__attribute_{}".format(self.attr_engine.id): self.value_220i.id, } ) product_config_wizard.action_next_step() product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_model_line.id ): self.value_model_sport_line.id, } @@ -153,16 +153,16 @@ def test_02_previous_step_incompatible_changes(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_tapistry.id): self.value_tapistry.id, + "__attribute_{}".format(self.attr_tapistry.id): self.value_tapistry.id, } ) product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_transmission.id ): self.value_transmission.id, - "__attribute-{}".format(self.attr_options.id): [ + "__attribute_{}".format(self.attr_options.id): [ [6, 0, [self.value_options_1.id, self.value_options_2.id]] ], } diff --git a/product_configurator/tests/test_product.py b/product_configurator/tests/test_product.py index 5b44263f9..d74ccee87 100644 --- a/product_configurator/tests/test_product.py +++ b/product_configurator/tests/test_product.py @@ -120,19 +120,7 @@ def test_02_compute_weight(self): Method: _compute_weight()", ) - def test_03_get_product_attribute_values_action(self): - attribute_value_action = ( - self.product_tmpl_id.get_product_attribute_values_action() - ) - contextValue = attribute_value_action.get("context") - self.assertEqual( - contextValue["active_id"], - self.product_tmpl_id.id, - "Error: If different template id\ - Method: get_product_attribute_values_action()", - ) - - def test_04_toggle_config(self): + def test_03_toggle_config(self): configFalse = self.product_tmpl_id.toggle_config() self.assertFalse( configFalse, @@ -147,7 +135,7 @@ def test_04_toggle_config(self): Method: create_variant_ids()", ) - def test_05_unlink(self): + def test_04_unlink(self): product_config_wizard = self.ProductConfWizard.create( { "product_tmpl_id": self.product_tmpl_id.id, @@ -156,9 +144,9 @@ def test_05_unlink(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } ) product_config_wizard.action_next_step() @@ -174,13 +162,13 @@ def test_05_unlink(self): Method: unlink()", ) - def test_06_check_default_values(self): + def test_05_check_default_values(self): self.attributelinefuel.default_val = (self.value_gasoline.id,) self.attributelineengine.default_val = self.value_218d.id with self.assertRaises(ValidationError): self.config_product._check_default_values() - def test_07_configure_product(self): + def test_06_configure_product(self): # configure product self.product_tmpl_id.configure_product() self.ProductConfWizard.action_next_step() @@ -192,9 +180,9 @@ def test_07_configure_product(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } ) wizard_action = product_config_wizard.action_next_step() @@ -248,14 +236,14 @@ def test_07_configure_product(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, } ) product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } ) product_config_wizard.action_previous_step() @@ -274,7 +262,7 @@ def test_07_configure_product(self): ) product_config_wizard.action_next_step() - def test_08_get_mako_tmpl_name(self): + def test_07_get_mako_tmpl_name(self): # check for product_product product_product = self._get_product_id() mako_tmpl_vals = product_product._get_mako_tmpl_name() @@ -293,7 +281,7 @@ def test_08_get_mako_tmpl_name(self): Method: _get_mako_tmpl_name()", ) - def test_09_compute_product_weight(self): + def test_08_compute_product_weight(self): product_product = self._get_product_id() self.config_product.weight = 10 product_product.weight_extra = 20 @@ -314,18 +302,7 @@ def test_09_compute_product_weight(self): Method: _compute_product_weight()", ) - def test_10_get_product_attribute_values_action(self): - product_product = self._get_product_id() - varient_price = product_product.get_product_attribute_values_action() - context_vals = varient_price["context"] - self.assertEqual( - context_vals["default_product_tmpl_id"], - product_product.product_tmpl_id.id, - "Error: If different template id\ - Method: get_product_attribute_values_action()", - ) - - def test_11_compute_config_name(self): + def test_09_compute_config_name(self): product_product = self._get_product_id() product_product.config_ok = False product_product._compute_config_name() @@ -344,7 +321,7 @@ def test_11_compute_config_name(self): Method: _compute_config_name()", ) - def test_12_reconfigure_product(self): + def test_10_reconfigure_product(self): self.product_tmpl_id.configure_product() product_config_wizard = self.ProductConfWizard.create( { @@ -354,9 +331,9 @@ def test_12_reconfigure_product(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } ) product_config_wizard.action_next_step() @@ -371,14 +348,14 @@ def test_12_reconfigure_product(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__attribute-{}".format(self.attr_engine.id): self.value_218d.id, + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__attribute_{}".format(self.attr_engine.id): self.value_218d.id, } ) product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_color.id): self.value_silver.id, + "__attribute_{}".format(self.attr_color.id): self.value_silver.id, } ) product_config_wizard.action_next_step() @@ -395,11 +372,11 @@ def test_12_reconfigure_product(self): ) self.assertFalse( new_variant.id, - "Error: if varient id not exists\ + "Error: if variant id not exists\ Method: reconfigure_product()", ) - def test_13_compute_product_weight_extra(self): + def test_11_compute_product_weight_extra(self): product_id = self.env.ref("product.product_delivery_01") product_template_attribute_value_ids = self.env.ref( "product.product_4_attribute_1_value_2" @@ -438,7 +415,7 @@ def test_13_compute_product_weight_extra(self): Method: _compute_product_weight_extra()", ) - def test_14_unlink(self): + def test_12_unlink(self): product_product = self._get_product_id() unlinkVals = product_product.unlink() self.assertTrue( @@ -447,7 +424,7 @@ def test_14_unlink(self): Method: unlink()", ) - def test_15_copy(self): + def test_13_copy(self): vals = self.config_product.copy() self.assertEqual( vals.name, @@ -461,7 +438,7 @@ def test_15_copy(self): Method: copy()", ) - def test_16_validate_unique_config(self): + def test_14_validate_unique_config(self): self.product_tmpl_id.write( { "attribute_value_line_ids": [ @@ -494,7 +471,7 @@ def test_16_validate_unique_config(self): } ) - def test_17_check_attr_value_ids(self): + def test_15_check_attr_value_ids(self): self.product_tmpl_id.write( { "attribute_value_line_ids": [ @@ -632,7 +609,7 @@ def test_17_check_attr_value_ids(self): } ) - def test_18_check_duplicate_product(self): + def test_16_check_duplicate_product(self): self.product_tmpl_id.configure_product() product_config_wizard = self.ProductConfWizard.create( { @@ -642,9 +619,9 @@ def test_18_check_duplicate_product(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } ) product_config_wizard.action_next_step() @@ -664,15 +641,15 @@ def test_18_check_duplicate_product(self): } ) - def test_19_fields_view_get(self): + def test_17_fields_view_get(self): product_product = self._get_product_id() - product_product.with_context({"default_config_ok": True}).fields_view_get() + product_product.with_context(default_config_ok=True).get_view() - def test_20_get_conversions_dict(self): + def test_18_get_conversions_dict(self): product_product = self._get_product_id() product_product._get_conversions_dict() - def test_21_compute_product_variant_count(self): + def test_19_compute_product_variant_count(self): self.product_tmpl_id = self.env["product.template"].create( { "name": "Test Configuration", @@ -689,7 +666,7 @@ def test_21_compute_product_variant_count(self): Method: _compute_product_variant_count()", ) - def test_22_get_config_name(self): + def test_20_get_config_name(self): product_product = self._get_product_id() product_product._get_config_name() self.assertTrue( @@ -698,7 +675,7 @@ def test_22_get_config_name(self): Method: _get_config_name()", ) - def test_23_search_product_weight(self): + def test_21_search_product_weight(self): product_product = self._get_product_id() operator = "and" value = 10 @@ -709,7 +686,7 @@ def test_23_search_product_weight(self): Method: _search_product_weight()", ) - def test_24_search_weight(self): + def test_22_search_weight(self): operator = "and" value = 10 search_weight = self.product_tmpl_id._search_weight(operator, value) @@ -719,7 +696,7 @@ def test_24_search_weight(self): Method: _search_weight()", ) - def test_25_check_config_line_domain(self): + def test_23_check_config_line_domain(self): product_config_line = self.env.ref( "product_configurator.product_config_line_218_lines" ) diff --git a/product_configurator/tests/test_product_config.py b/product_configurator/tests/test_product_config.py index df2800812..9dbff9aca 100644 --- a/product_configurator/tests/test_product_config.py +++ b/product_configurator/tests/test_product_config.py @@ -355,8 +355,8 @@ def test_09_create_get_variant(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attribute_1.id): self.attribute_vals_1.id, - "__attribute-{}".format(self.attribute_2.id): self.attribute_vals_3.id, + "__attribute_{}".format(self.attribute_1.id): self.attribute_vals_1.id, + "__attribute_{}".format(self.attribute_2.id): self.attribute_vals_3.id, } ) product_config_wizard.action_next_step() @@ -471,10 +471,10 @@ def test_13_update_session_configuration_value(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attribute_1.id): self.custom_vals.id, - "__custom-{}".format(self.attribute_1.id): self.irAttachement.id, - "__attribute-{}".format(self.attribute_1.id): self.custom_vals.id, - "__custom-{}".format(self.attribute_1.id): "Test", + "__attribute_{}".format(self.attribute_1.id): self.custom_vals.id, + "__custom_{}".format(self.attribute_1.id): self.irAttachement.id, + "__attribute_{}".format(self.attribute_1.id): self.custom_vals.id, + "__custom_{}".format(self.attribute_1.id): "Test", } ) product_config_wizard.action_next_step() @@ -566,10 +566,10 @@ def test_17_custom_value_validate_configuration(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attribute_1.id): self.custom_vals.id, - "__custom-{}".format(self.attribute_1.id): self.irAttachement.id, - "__attribute-{}".format(self.attribute_1.id): self.custom_vals.id, - "__custom-{}".format(self.attribute_1.id): "Test", + "__attribute_{}".format(self.attribute_1.id): self.custom_vals.id, + "__custom_{}".format(self.attribute_1.id): self.irAttachement.id, + "__attribute_{}".format(self.attribute_1.id): self.custom_vals.id, + "__custom_{}".format(self.attribute_1.id): "Test", } ) self.attributeLine1.custom = False diff --git a/product_configurator/tests/test_product_configurator_test_cases.py b/product_configurator/tests/test_product_configurator_test_cases.py index dd176cc40..15a721cfe 100644 --- a/product_configurator/tests/test_product_configurator_test_cases.py +++ b/product_configurator/tests/test_product_configurator_test_cases.py @@ -71,21 +71,21 @@ def _configure_product_nxt_step(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, } ) product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_color.id): self.value_red.id, - "__attribute-{}".format(self.attr_rims.id): self.value_rims_378.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_rims.id): self.value_rims_378.id, } ) product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_model_line.id ): self.value_sport_line.id, } @@ -94,14 +94,14 @@ def _configure_product_nxt_step(self): product_config_wizard.action_previous_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_engine.id): self.value_220i.id, + "__attribute_{}".format(self.attr_engine.id): self.value_220i.id, } ) product_config_wizard.action_next_step() product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_model_line.id ): self.value_model_sport_line.id, } @@ -109,16 +109,16 @@ def _configure_product_nxt_step(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_tapistry.id): self.value_tapistry.id, + "__attribute_{}".format(self.attr_tapistry.id): self.value_tapistry.id, } ) product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_transmission.id ): self.value_transmission.id, - "__attribute-{}".format(self.attr_options.id): [ + "__attribute_{}".format(self.attr_options.id): [ [6, 0, [self.value_options_2.id]] ], } diff --git a/product_configurator/tests/test_wizard.py b/product_configurator/tests/test_wizard.py index acb114c64..0c35b9319 100644 --- a/product_configurator/tests/test_wizard.py +++ b/product_configurator/tests/test_wizard.py @@ -113,14 +113,14 @@ def _check_wizard_nxt_step(self): product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, } ) product_config_wizard.action_next_step() product_config_wizard.write( { - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } ) return product_config_wizard @@ -171,7 +171,7 @@ def test_03_compute_attr_lines(self): def test_04_get_state_selection(self): product_config_wizard = self._check_wizard_nxt_step() config_wiz = product_config_wizard.with_context( - {"wizard_id": product_config_wizard.id} + wizard_id=product_config_wizard.id ).get_state_selection() self.assertTrue( config_wiz[1:], @@ -239,7 +239,7 @@ def test_10_open_step(self): def test_11_onchange(self): field_name = "" - values = {"__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id} + values = {"__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id} product_config_wizard = self._check_wizard_nxt_step() field_prefix = product_config_wizard._prefixes.get("field_prefix") field_name = "%s%s" % (field_prefix, field_name) @@ -253,8 +253,8 @@ def test_11_onchange(self): } ) values2 = { - "__attribute-{}".format(self.attr_fuel.id): self.custom_vals.id, - "__custom-{}".format(self.attr_fuel.id): "Test1", + "__attribute_{}".format(self.attr_fuel.id): self.custom_vals.id, + "__custom_{}".format(self.attr_fuel.id): "Test1", } product_config_wizard.onchange(values2, field_name, specs) @@ -262,7 +262,7 @@ def test_12_fields_get(self): product_config_wizard = self._check_wizard_nxt_step() product_config_wizard.fields_get() product_config_wizard.with_context( - {"wizard_id": product_config_wizard.id} + wizard_id=product_config_wizard.id ).fields_get() # custom value @@ -276,23 +276,23 @@ def test_12_fields_get(self): product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__custom-{}".format(self.attr_fuel.id): "Test1", - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, - "__custom-{}".format(self.attr_engine.id): "Test2", + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__custom_{}".format(self.attr_fuel.id): "Test1", + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, + "__custom_{}".format(self.attr_engine.id): "Test2", } ) product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format(self.attr_color.id): self.value_red.id, - "__attribute-{}".format(self.attr_rims.id): self.value_rims_378.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_rims.id): self.value_rims_378.id, } ) product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_model_line.id ): self.value_sport_line.id, } @@ -301,14 +301,14 @@ def test_12_fields_get(self): product_config_wizard_1.action_previous_step() product_config_wizard_1.write( { - "__attribute-{}".format(self.attr_engine.id): self.value_220i.id, + "__attribute_{}".format(self.attr_engine.id): self.value_220i.id, } ) product_config_wizard_1.action_next_step() product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_model_line.id ): self.value_model_sport_line.id, } @@ -316,30 +316,30 @@ def test_12_fields_get(self): product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format(self.attr_tapistry.id): self.value_tapistry.id, + "__attribute_{}".format(self.attr_tapistry.id): self.value_tapistry.id, } ) product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_transmission.id ): self.value_transmission.id, - "__attribute-{}".format(self.attr_options.id): [ + "__attribute_{}".format(self.attr_options.id): [ [6, 0, [self.value_options_2.id]] ], } ) product_config_wizard_1.action_next_step() product_config_wizard_1.with_context( - {"wizard_id": product_config_wizard_1.id} + wizard_id=product_config_wizard_1.id ).fields_get() def test_13_fields_view_get(self): product_config_wizard = self._check_wizard_nxt_step() product_config_wizard.fields_view_get() product_config_wizard.with_context( - {"wizard_id": product_config_wizard.id} + wizard_id=product_config_wizard.id ).fields_view_get() # custom value # custom value @@ -353,23 +353,23 @@ def test_13_fields_view_get(self): product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__custom-{}".format(self.attr_fuel.id): "Test1", - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, - "__custom-{}".format(self.attr_engine.id): "Test2", + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__custom_{}".format(self.attr_fuel.id): "Test1", + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, + "__custom_{}".format(self.attr_engine.id): "Test2", } ) product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format(self.attr_color.id): self.value_red.id, - "__attribute-{}".format(self.attr_rims.id): self.value_rims_378.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_rims.id): self.value_rims_378.id, } ) product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_model_line.id ): self.value_sport_line.id, } @@ -378,14 +378,14 @@ def test_13_fields_view_get(self): product_config_wizard_1.action_previous_step() product_config_wizard_1.write( { - "__attribute-{}".format(self.attr_engine.id): self.value_220i.id, + "__attribute_{}".format(self.attr_engine.id): self.value_220i.id, } ) product_config_wizard_1.action_next_step() product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_model_line.id ): self.value_model_sport_line.id, } @@ -393,23 +393,23 @@ def test_13_fields_view_get(self): product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format(self.attr_tapistry.id): self.value_tapistry.id, + "__attribute_{}".format(self.attr_tapistry.id): self.value_tapistry.id, } ) product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format( + "__attribute_{}".format( self.attr_transmission.id ): self.value_transmission.id, - "__attribute-{}".format(self.attr_options.id): [ + "__attribute_{}".format(self.attr_options.id): [ [6, 0, [self.value_options_2.id]] ], } ) product_config_wizard_1.action_next_step() product_config_wizard_1.with_context( - {"wizard_id": product_config_wizard_1.id} + wizard_id=product_config_wizard_1.id ).fields_view_get() def test_14_unlink(self): @@ -424,9 +424,9 @@ def test_14_unlink(self): def test_15_read(self): product_config_wizard = self._check_wizard_nxt_step() values = { - "__attribute-{}".format(self.attr_fuel.id): self.value_gasoline.id, - "__attribute-{}".format(self.attr_engine.id): self.value_218i.id, - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_fuel.id): self.value_gasoline.id, + "__attribute_{}".format(self.attr_engine.id): self.value_218i.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } product_config_wizard.read(values) product_tmpl = self.env["product.template"].create( @@ -500,25 +500,25 @@ def test_15_read(self): product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format(self.attr_fuel.id): self.custom_vals.id, - "__custom-{}".format(self.attr_fuel.id): "#DEFSRE", - "__attribute-{}".format(self.attr_engine.id): self.custom_vals.id, - "__custom-{}".format(self.attr_engine.id): "#FERDFGR", + "__attribute_{}".format(self.attr_fuel.id): self.custom_vals.id, + "__custom_{}".format(self.attr_fuel.id): "#DEFSRE", + "__attribute_{}".format(self.attr_engine.id): self.custom_vals.id, + "__custom_{}".format(self.attr_engine.id): "#FERDFGR", } ) product_config_wizard_1.action_next_step() product_config_wizard_1.write( { - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } ) # check for custom value custom_vals = { - "__attribute-{}".format(self.attr_fuel.id): self.custom_vals.id, - "__custom-{}".format(self.attr_fuel.id): "#DEFSRE", - "__attribute-{}".format(self.attr_engine.id): self.custom_vals.id, - "__custom-{}".format(self.attr_engine.id): "#FERDFGR", - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_fuel.id): self.custom_vals.id, + "__custom_{}".format(self.attr_fuel.id): "#DEFSRE", + "__attribute_{}".format(self.attr_engine.id): self.custom_vals.id, + "__custom_{}".format(self.attr_engine.id): "#FERDFGR", + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } product_config_wizard_1.read(custom_vals) session = self.productConfigSession.search( @@ -536,27 +536,27 @@ def test_15_read(self): product_config_wizard_2.action_next_step() product_config_wizard_2.write( { - "__attribute-{}".format(self.attr_fuel.id): [ + "__attribute_{}".format(self.attr_fuel.id): [ (6, 0, [self.value_diesel.id, self.value_gasoline.id]) ], - "__attribute-{}".format(self.attr_engine.id): self.custom_vals.id, - "__custom-{}".format(self.attr_engine.id): "#FERDFGR", + "__attribute_{}".format(self.attr_engine.id): self.custom_vals.id, + "__custom_{}".format(self.attr_engine.id): "#FERDFGR", } ) product_config_wizard_2.action_next_step() product_config_wizard_2.write( { - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } ) # check for multi value multi_vals = { - "__attribute-{}".format(self.attr_fuel.id): [ + "__attribute_{}".format(self.attr_fuel.id): [ (6, 0, [self.value_diesel.id, self.value_gasoline.id]) ], - "__attribute-{}".format(self.attr_engine.id): self.custom_vals.id, - "__custom-{}".format(self.attr_engine.id): "#FERDFGR", - "__attribute-{}".format(self.attr_color.id): self.value_red.id, + "__attribute_{}".format(self.attr_engine.id): self.custom_vals.id, + "__custom_{}".format(self.attr_engine.id): "#FERDFGR", + "__attribute_{}".format(self.attr_color.id): self.value_red.id, } product_config_wizard_2.read(multi_vals) diff --git a/product_configurator/views/assets.xml b/product_configurator/views/assets.xml deleted file mode 100644 index d39da0280..000000000 --- a/product_configurator/views/assets.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - -