Sale Product Configurator

sale_product_configurator
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/sale_product_configurator
VERSION
VERSION 1.0
CATEGORY
CATEGORYHidden
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Aaron Bohy, Yannick Tivisse, Odoo Online, Victor Feyens, Adrien Dieudonné, Samuel Degueldre, Tiffany Chang (tic), Gorash, MerlinGuillaume, Antoine Vandevenne (anv), Demesmaeker, Mathieu Walravens, Valentin Chevalier, Iván Todorovich, Thomas Lefebvre (thle), Louis Wicket (wil), Julien (jula), Mahamadasif Ansari, Tom De Caluwé, Andrew Gavgavian, Valentin Vallaeys (vava), Bruno Boi, Antoine (ande), FrancoisGe, Michael (mcm), Valeriya(vchu), Leloup Loïc (lole), stcc-odoo, Renilkumar Kajavadra, Mahdi Cheikh Rouhou (macr), Eteil Djoumatchoua (etdj), Lina (liew), Louis (wil), Pierre Pulinckx (pipu), Pulinckx Pierre (PIPU), aksi-odoo, shrm-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:11
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account_payment
    - account
    - onboarding
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Technical module:
The main purpose is to override the sale_order view to allow configuring products in the SO form.

It also enables the "optional products" feature.
    

Code Analysis

Views touched (2)
XML IDNameModelTypeStatus
product_template_view_form product.template.form.inherit.sale.product.configurator product.template group Inherits product.product_template_form_view
sale_order_view_form sale.order.form.inherit.sale.product.configurator sale.order xpath Inherits sale.view_order_form
Models touched (2)

New fields (1)
  • optional_product_ids Many2many → product.template
    check_company=True column1='src_id' column2='dest_id' comodel_name='product.template' help='Optional Products are suggested whenever the customer hits *Add to Cart* (cross-sell strategy, e.g. for computers: warranty, software, etc.).' relation='product_optional_rel' string='Optional Products'
Public methods (1)
  • get_single_product_variant(self)
    Method used by the product configurator to check if the product is configurable or not. We need to open the product configurator if the product: - is configurable (see has_configurable_attributes) - has optional products

New fields (2)
  • is_configurable_product Boolean
    depends=['product_id'] related='product_template_id.has_configurable_attributes' string='Is the product configurable?'
  • product_template_attribute_value_ids Many2many
    depends=['product_id'] related='product_id.product_template_attribute_value_ids'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/sale_product_configurator
VERSION
VERSION 1.0
CATEGORY
CATEGORYHidden
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Yannick Tivisse, Laurent Smet, Romeo Fragomeli, Victor Feyens, Adrien Dieudonné, Samuel Degueldre, Touati Djamel (otd), Pierre Paridans, Merlin (megu), MerlinGuillaume, Thibault Libioulle, Demesmaeker, Thomas Lefebvre (thle), Mylyna Hy, Tom De Caluwé, Valentin Vallaeys (vava), Levi Siuzdak (sile), Louis (loti), Eteil Djoumatchoua (etdj), Julien Carion (juca), Martin Trigaux (mat)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:55
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - account_payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - payment
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Technical module:
The main purpose is to override the sale_order view to allow configuring products in the SO form.

It also enables the "optional products" feature.
    

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
configure Configure ir.ui.view qweb New
configure_optional_products configure_optional_products ir.ui.view qweb New
optional_product_items optional_product_items ir.ui.view qweb New
optional_products_modal Optional Products ir.ui.view qweb New
product_quantity_config product_quantity_config ir.ui.view qweb New
product_template_view_form product.template.form.inherit.sale.product.configurator product.template group Inherits product.product_template_form_view
sale_order_view_form sale.order.form.inherit.sale.product.configurator sale.order xpath Inherits sale.view_order_form
Models touched (2)

New fields (1)
  • optional_product_ids Many2many → product.template
    check_company=True column1='src_id' column2='dest_id' comodel_name='product.template' help='Optional Products are suggested whenever the customer hits *Add to Cart* (cross-sell strategy, e.g. for computers: warranty, software, etc.).' relation='product_optional_rel' string='Optional Products'
Public methods (1)
  • get_single_product_variant(self)
    Method used by the product configurator to check if the product is configurable or not. We need to open the product configurator if the product: - is configurable (see has_configurable_attributes) - has optional products

New fields (2)
  • is_configurable_product Boolean
    depends=['product_id'] related='product_template_id.has_configurable_attributes' string='Is the product configurable?'
  • product_template_attribute_value_ids Many2many
    depends=['product_id'] related='product_id.product_template_attribute_value_ids'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/sale_product_configurator
VERSION
VERSION 1.0
CATEGORY
CATEGORYHidden
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Goffin Simon, Nicolas Lempereur, Jeremy Kersten, Yannick Tivisse, qsm-odoo, Aurélien Warnon, Xavier-Do, Victor Feyens, Adrien Dieudonné, oco-odoo, Florent de Labarre, Julien Mougenot, Touati Djamel (otd), Pierre Paridans, Kamen Zhekov, Arnaud Joset, Kevin Baptiste, william-andre, MerlinGuillaume, yhu-odoo, Michael Mattiello (mcm), Thomas Lefebvre (thle), Tom De Caluwé, Valeriya(vchu), SilvioC2C, vava-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Technical module installed when the user checks the "module_sale_product_configurator" setting.
The main purpose is to override the sale_order view to allow configuring products in the SO form.

It also enables the "optional products" feature.
    

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
configure Configure ir.ui.view qweb New
configure_optional_products configure_optional_products ir.ui.view qweb New
optional_product_items optional_product_items ir.ui.view qweb New
optional_products_modal Optional Products ir.ui.view qweb New
product_quantity_config product_quantity_config ir.ui.view qweb New
product_template_view_form product.template.form.inherit.sale.product.configurator product.template group Inherits product.product_template_form_view
sale_order_view_form sale.order.form.inherit.sale.product.configurator sale.order xpath Inherits sale.view_order_form
sale_product_configurator_view_form sale_product_configurator.product.configurator.view.form sale.product.configurator form New
Models touched (3)

New fields (1)
  • optional_product_ids Many2many → product.template
    check_company=True help='Optional Products are suggested whenever the customer hits *Add to Cart* (cross-sell strategy, e.g. for computers: warranty, software, etc.).' string='Optional Products' args: 'product.template', 'product_optional_rel', 'src_id', 'dest_id'
Public methods (1)
  • get_single_product_variant(self)
    Method used by the product configurator to check if the product is configurable or not. We need to open the product configurator if the product: - is configurable (see has_configurable_attributes) - has optional products

New fields (2)
  • is_configurable_product Boolean
    related='product_template_id.has_configurable_attributes' args: 'Is the product configurable?'
  • product_template_attribute_value_ids Many2many
    readonly=True related='product_id.product_template_attribute_value_ids'
Public methods (0)

No public methods.

New fields (6)
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_custom_attribute_value_ids Many2many → product.attribute.custom.value
    string='Custom Values' args: 'product.attribute.custom.value', 'product_configurator_custom_attribute_value_rel'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    string='Extra Values' args: 'product.template.attribute.value', 'product_configurator_no_variant_attribute_value_rel'
  • product_template_attribute_value_ids Many2many → product.template.attribute.value
    readonly=True string='Attribute Values' args: 'product.template.attribute.value', 'product_configurator_template_attribute_value_rel'
  • product_template_id Many2one → product.template
    domain=[('sale_ok', '=', True), ('attribute_line_ids.value_ids', '!=', False)] required=True string='Product' args: 'product.template'
  • quantity Integer
    args: 'Quantity'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/sale_product_configurator
VERSION
VERSION 1.0
CATEGORY
CATEGORYHidden
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Olivier Dony, Christophe Simonis, Goffin Simon, Nicolas Lempereur, Aaron Bohy, Yannick Tivisse, Adrien Dieudonne, Aurélien Warnon, Xavier-Do, jvm-odoo, Victor Feyens, Julien Mougenot, Pierre Paridans, Hiral Bhavsar, Arnaud Joset, Jinal Patel, Kevin Baptiste, MerlinGuillaume, yhu-odoo, SilvioC2C
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:31
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Technical module installed when the user checks the "module_sale_product_configurator" setting.
The main purpose is to override the sale_order view to allow configuring products in the SO form.

It also enables the "optional products" feature.
    

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
assets_backend sale_product_configurator assets backend ir.ui.view qweb Inherits web.assets_backend
assets_tests Sale Product Configurator Assets Tests ir.ui.view qweb Inherits web.assets_tests
configure Configure ir.ui.view qweb New
configure_optional_products configure_optional_products ir.ui.view qweb New
optional_product_items optional_product_items ir.ui.view qweb New
optional_products_modal Optional Products ir.ui.view qweb New
product_template_view_form product.template.form.inherit.sale.product.configurator product.template xpath Inherits product.product_template_form_view
qunit_suite sale_product_configurator_tests ir.ui.view qweb Inherits web.qunit_suite_tests
sale_order_view_form sale.order.form.inherit.sale.product.configurator sale.order xpath Inherits sale.view_order_form
sale_product_configurator_view_form sale_product_configurator.product.configurator.view.form sale.product.configurator form New
Models touched (3)

New fields (1)
  • optional_product_ids Many2many → product.template
    check_company=True help='Optional Products are suggested whenever the customer hits *Add to Cart* (cross-sell strategy, e.g. for computers: warranty, software, etc.).' string='Optional Products' args: 'product.template', 'product_optional_rel', 'src_id', 'dest_id'
Public methods (1)
  • get_single_product_variant(self)
    Method used by the product configurator to check if the product is configurable or not. We need to open the product configurator if the product: - is configurable (see has_configurable_attributes) - has optional products

New fields (2)
  • is_configurable_product Boolean
    related='product_template_id.has_configurable_attributes' args: 'Is the product configurable?'
  • product_template_attribute_value_ids Many2many
    readonly=True related='product_id.product_template_attribute_value_ids'
Public methods (0)

No public methods.

New fields (6)
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_custom_attribute_value_ids Many2many → product.attribute.custom.value
    string='Custom Values' args: 'product.attribute.custom.value', 'product_configurator_custom_attribute_value_rel'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    string='Extra Values' args: 'product.template.attribute.value', 'product_configurator_no_variant_attribute_value_rel'
  • product_template_attribute_value_ids Many2many → product.template.attribute.value
    readonly=True string='Attribute Values' args: 'product.template.attribute.value', 'product_configurator_template_attribute_value_rel'
  • product_template_id Many2one → product.template
    domain=[('sale_ok', '=', True), ('attribute_line_ids.value_ids', '!=', False)] required=True string='Product' args: 'product.template'
  • quantity Integer
    args: 'Quantity'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/sale_product_configurator
VERSION
VERSION 1.0
CATEGORY
CATEGORYHidden
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Christophe Simonis, Goffin Simon, Nicolas Lempereur, Géry Debongnie, Jeremy Kersten, Damien Bouvy, qsm-odoo, Alexandre Kühn, Adrian Torres, Aurélien Warnon, Xavier-Do, jvm-odoo, Victor Feyens, Sébastien Theys, Hiral Bhavsar, Arnaud Joset, MerlinGuillaume, Antoine Vandevenne (anv)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:44
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - sale
    - sales_team
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - payment
    - account
    - product
    - uom
    - analytic
    - portal
    - web_editor
    - http_routing
    - auth_signup
    - digest
    - resource
    - utm
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Technical module installed when the user checks the "module_sale_product_configurator" setting.
The main purpose is to override the sale_order view to allow configuring products in the SO form.

It also enables the "optional products" feature.
    

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
assets_backend sale_product_configurator assets backend ir.ui.view qweb Inherits web.assets_backend
assets_tests Sale Product Configurator Assets Tests ir.ui.view qweb Inherits web.assets_tests
configure Configure ir.ui.view qweb New
configure_optional_products configure_optional_products ir.ui.view qweb New
optional_product_items optional_product_items ir.ui.view qweb New
optional_products_modal Optional Products ir.ui.view qweb New
product_template_view_form product.template.form.inherit.sale.product.configurator product.template xpath Inherits product.product_template_form_view
qunit_suite sale_product_configurator_tests ir.ui.view qweb Inherits web.qunit_suite
sale_order_view_form sale.order.form.inherit.sale.product.configurator sale.order xpath Inherits sale.view_order_form
sale_product_configurator_view_form sale_product_configurator.product.configurator.view.form sale.product.configurator form New
Models touched (3)

New fields (1)
  • optional_product_ids Many2many → product.template
    check_company=True help='Optional Products are suggested whenever the customer hits *Add to Cart* (cross-sell strategy, e.g. for computers: warranty, software, etc.).' string='Optional Products' args: 'product.template', 'product_optional_rel', 'src_id', 'dest_id'
Public methods (1)
  • get_single_product_variant(self)
    Method used by the product configurator to check if the product is configurable or not. We need to open the product configurator if the product: - is configurable (see has_configurable_attributes) - has optional products

New fields (2)
  • is_configurable_product Boolean
    related='product_template_id.has_configurable_attributes' args: 'Is the product configurable?'
  • product_template_attribute_value_ids Many2many
    readonly=True related='product_id.product_template_attribute_value_ids'
Public methods (0)

No public methods.

New fields (6)
  • pricelist_id Many2one → product.pricelist
    readonly=True args: 'product.pricelist', 'Pricelist'
  • product_custom_attribute_value_ids Many2many → product.attribute.custom.value
    string='Custom Values' args: 'product.attribute.custom.value', 'product_configurator_custom_attribute_value_rel'
  • product_no_variant_attribute_value_ids Many2many → product.template.attribute.value
    string='Extra Values' args: 'product.template.attribute.value', 'product_configurator_no_variant_attribute_value_rel'
  • product_template_attribute_value_ids Many2many → product.template.attribute.value
    readonly=True string='Attribute Values' args: 'product.template.attribute.value', 'product_configurator_template_attribute_value_rel'
  • product_template_id Many2one → product.template
    domain=[('sale_ok', '=', True), ('attribute_line_ids.value_ids', '!=', False)] required=True string='Product' args: 'product.template'
  • quantity Integer
    args: 'Quantity'
Public methods (0)

No public methods.