Product Variant Configurator

product_variant_configurator
REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/19.0/product_variant_configurator
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, arantxa-s73
WEBSITE
WEBSITEhttps://github.com/OCA/product-variant
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Provides an abstract model for product variant configuration. It
provides the basic functionality for presenting a table with the
attributes of a template and the possibility to select one of the valid
values. You can try this functionality creating a product variant
directly selecting a product template that has attributes.

This module also prevents in a configurable way the creation of the
product variants when defining the attributes and attribute values of
the product template.

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
product_attribute_view_form product.attribute.form product.attribute field Inherits product.product_attribute_view_form
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template xpath Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
product_variants_view_2 product.product.variants.form product.product xpath Inherits product_variant_configurator.product_variants_view
view_product_configurator_tree product.configurator.attribute list New
Models touched (9)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (7)
  • can_create_product Boolean
    compute='_compute_can_be_created'
  • create_product_variant Boolean
    string='Create product now!'
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product Variant'
  • product_id_configurator_domain Binary
    compute='_compute_product_id_configurator_domain' readonly=True store=False
  • product_tmpl_id Many2one → product.template
    bypass_search_access=True comodel_name='product.template' string='Product Template'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
    Fill `product_tmpl_id` in case `product_id` is supplied but not the other one.
  • create_variant_if_needed(self)
    Create the product variant if needed. It searches for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found or newly created)
  • unlink(self)
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Many2oneReference
    index=True model_field='owner_model' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.' string='Attribute Price Extra'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('id', 'in', possible_value_ids)]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • template_price_get(self, prod_id, qty, partner=None)
  • template_price_rule_get(self, prod_id, qty, partner=None)

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • no_create_variants Selection
    default='no' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', "Use Odoo's default variant management"), ('empty', 'Use the category value')]
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • name_search(self, name='', domain=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (1)
  • required Boolean
    default=False
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/18.0/product_variant_configurator
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Bhavesh Heliconia
WEBSITE
WEBSITEhttps://github.com/OCA/product-variant
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:13
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Provides an abstract model for product variant configuration. It
provides the basic functionality for presenting a table with the
attributes of a template and the possibility to select one of the valid
values. You can try this functionality creating a product variant
directly selecting a product template that has attributes.

This module also prevents in a configurable way the creation of the
product variants when defining the attributes and attribute values of
the product template.

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
product_attribute_view_form product.attribute.form product.attribute field Inherits product.product_attribute_view_form
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template xpath Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
product_variants_view_2 product.product.variants.form product.product xpath Inherits product_variant_configurator.product_variants_view
view_product_configurator_tree product.configurator.attribute list New
Models touched (9)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (7)
  • can_create_product Boolean
    compute='_compute_can_be_created'
  • create_product_variant Boolean
    string='Create product now!'
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product Variant'
  • product_id_configurator_domain Binary
    compute='_compute_product_id_configurator_domain' readonly=True store=False
  • product_tmpl_id Many2one → product.template
    auto_join=True comodel_name='product.template' string='Product Template'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
    Fill `product_tmpl_id` in case `product_id` is supplied but not the other one.
  • create_variant_if_needed(self)
    Create the product variant if needed. It searches for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found or newly created)
  • unlink(self)
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Many2oneReference
    index=True model_field='owner_model' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.' string='Attribute Price Extra'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('id', 'in', possible_value_ids)]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • template_price_get(self, prod_id, qty, partner=None)
  • template_price_rule_get(self, prod_id, qty, partner=None)

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi

New fields (1)
  • no_create_variants Selection
    default='no' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', "Use Odoo's default variant management"), ('empty', 'Use the category value')]
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (1)
  • required Boolean
    default=False
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/17.0/product_variant_configurator
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSmanu, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/product-variant
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:06
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Provides an abstract model for product variant configuration. It
provides the basic functionality for presenting a table with the
attributes of a template and the possibility to select one of the valid
values. You can try this functionality creating a product variant
directly selecting a product template that has attributes.

This module also prevents in a configurable way the creation of the
product variants when defining the attributes and attribute values of
the product template.

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
product_attribute_view_form product.attribute.form product.attribute field Inherits product.product_attribute_view_form
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template xpath Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
product_variants_view_2 product.product.variants.form product.product xpath Inherits product_variant_configurator.product_variants_view
view_product_configurator_tree product.configurator.attribute tree New
Models touched (9)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (7)
  • can_create_product Boolean
    compute='_compute_can_be_created'
  • create_product_variant Boolean
    string='Create product now!'
  • price_extra Float
    compute='_compute_can_be_created' digits='Product Price' help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product Variant'
  • product_id_configurator_domain Binary
    compute='_compute_product_id_configurator_domain' readonly=True store=False
  • product_tmpl_id Many2one → product.template
    auto_join=True comodel_name='product.template' string='Product Template'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
    Fill `product_tmpl_id` in case `product_id` is supplied but not the other one.
  • create_variant_if_needed(self)
    Create the product variant if needed. It searches for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found or newly created)
  • unlink(self)
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Many2oneReference
    index=True model_field='owner_model' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.' string='Attribute Price Extra'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('id', 'in', possible_value_ids)]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • template_price_get(self, prod_id, qty, partner=None)
  • template_price_rule_get(self, prod_id, qty, partner=None)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • name_get(self)
    We need to add this for avoiding an odoo.exceptions.AccessError due to some refactoring done upstream on read method + variant name_get in Odoo. With this, we avoid to call super on the specific case of virtual records, providing simply the name, which is acceptable.

New fields (1)
  • no_create_variants Selection
    default='no' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', "Use Odoo's default variant management"), ('empty', 'Use the category value')]
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (1)
  • required Boolean
    default=False
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/16.0/product_variant_configurator
VERSION
VERSION 1.0.8
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSStéphane Bidoul, Jordi Ballester Alomar, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, Justine Doutreloux, Carolina Fernandez, SergiCForgeFlow, hda, Mantux11, Alexandra Bottemanne
WEBSITE
WEBSITEhttps://github.com/OCA/product-variant
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:48
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
product_attribute_view_form product.attribute.form product.attribute field Inherits product.product_attribute_view_form
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template xpath Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
product_variants_view_2 product.product.variants.form product.product xpath Inherits product_variant_configurator.product_variants_view
view_product_configurator_tree product.configurator.attribute tree New
Models touched (9)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals_list)
    @api.model_create_multi
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (7)
  • can_create_product Boolean
    compute='_compute_can_be_created'
  • create_product_variant Boolean
    string='Create product now!'
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product Variant'
  • product_id_configurator_domain Binary
    compute='_compute_product_id_configurator_domain' readonly=True store=False
  • product_tmpl_id Many2one → product.template
    auto_join=True comodel_name='product.template' string='Product Template'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
    Fill `product_tmpl_id` in case `product_id` is supplied but not the other one.
  • create_variant_if_needed(self)
    Create the product variant if needed. It searches for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found or newly created)
  • unlink(self)
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Many2oneReference
    index=True model_field='owner_model' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.' string='Attribute Price Extra'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('id', 'in', possible_value_ids)]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • template_price_get(self, prod_id, qty, partner=None)
  • template_price_rule_get(self, prod_id, qty, partner=None)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • name_get(self)
    We need to add this for avoiding an odoo.exceptions.AccessError due to some refactoring done upstream on read method + variant name_get in Odoo. With this, we avoid to call super on the specific case of virtual records, providing simply the name, which is acceptable.

New fields (1)
  • no_create_variants Selection
    default='no' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', "Use Odoo's default variant management"), ('empty', 'Use the category value')]
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (1)
  • required Boolean
    default=False
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/15.0/product_variant_configurator
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Jasmin Solanki
WEBSITE
WEBSITEhttps://github.com/OCA/product-variant
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:35
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
product_attribute_view_form product.attribute.form product.attribute field Inherits product.product_attribute_view_form
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template xpath Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
product_variants_view_2 product.product.variants.form product.product xpath Inherits product_variant_configurator.product_variants_view
view_product_configurator_tree product.configurator.attribute tree New
Models touched (8)

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals)
    @api.model
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (6)
  • can_create_product Boolean
    compute='_compute_can_be_created' store=False
  • create_product_variant Boolean
    string='Create product now!'
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product Variant'
  • product_tmpl_id Many2one → product.template
    auto_join=True comodel_name='product.template' string='Product Template'
Public methods (3)
  • create(self, vals)
    @api.model
    Fill `product_tmpl_id` in case `product_id` is supplied but not the other one.
  • create_variant_if_needed(self)
    Create the product variant if needed. It searches for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found or newly created)
  • unlink(self)
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Many2oneReference
    index=True model_field='owner_model' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.' string='Attribute Price Extra'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('id', 'in', possible_value_ids)]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • template_price_get(self, prod_id, qty, partner=None)
  • template_price_rule_get(self, prod_id, qty, partner=None)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals)
    @api.model
  • name_get(self)
    We need to add this for avoiding an odoo.exceptions.AccessError due to some refactoring done upstream on read method + variant name_get in Odoo. With this, we avoid to call super on the specific case of virtual records, providing simply the name, which is acceptable.

New fields (1)
  • no_create_variants Selection
    default='no' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', "Use Odoo's default variant management"), ('empty', 'Use the category value')]
Public methods (4)
  • create(self, vals)
    @api.model
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (1)
  • required Boolean
    default=False
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/14.0/product_variant_configurator
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Héctor Villarreal Ortega
WEBSITE
WEBSITEhttps://github.com/OCA/product-variant
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
product_attribute_view_form product.attribute.form product.attribute field Inherits product.product_attribute_view_form
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template xpath Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
product_variants_view_2 product.product.variants.form product.product xpath Inherits product_variant_configurator.product_variants_view
view_product_configurator_tree product.configurator.attribute tree New
Models touched (8)

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals)
    @api.model
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (6)
  • can_create_product Boolean
    compute='_compute_can_be_created' store=False
  • create_product_variant Boolean
    string='Create product now!'
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product Variant'
  • product_tmpl_id Many2one → product.template
    auto_join=True comodel_name='product.template' string='Product Template'
Public methods (3)
  • create(self, vals)
    @api.model
    Fill `product_tmpl_id` in case `product_id` is supplied but not the other one.
  • create_variant_if_needed(self)
    Create the product variant if needed. It searches for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found or newly created)
  • unlink(self)
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Many2oneReference
    index=True model_field='owner_model' ondelete='cascade' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.' string='Attribute Price Extra'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('id', 'in', possible_value_ids)]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • template_price_get(self, prod_id, qty, partner=None)
  • template_price_rule_get(self, prod_id, qty, partner=None)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals)
    @api.model
  • name_get(self)
    We need to add this for avoiding an odoo.exceptions.AccessError due to some refactoring done upstream on read method + variant name_get in Odoo. With this, we avoid to call super on the specific case of virtual records, providing simply the name, which is acceptable.

New fields (1)
  • no_create_variants Selection
    default='no' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', "Use Odoo's default variant management"), ('empty', 'Use the category value')]
Public methods (4)
  • create(self, vals)
    @api.model
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (1)
  • required Boolean
    default=False string='Required'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/13.0/product_variant_configurator
VERSION
VERSION 1.1.6
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSPedro M. Baeza, david, Jordi Ballester, OCA Transbot, Thomas Binsfeld, oca-travis, Weblate, OCA-git-bot, Héctor Villarreal Ortega, HviorForgeFlow, Rad0van, John
WEBSITE
WEBSITEhttps://github.com/OCA/product-variant
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:14
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
product_attribute_view_form product.attribute.form product.attribute field Inherits product.product_attribute_view_form
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template xpath Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
product_variants_view_2 product.product.variants.form product.product xpath Inherits product_variant_configurator.product_variants_view
view_product_configurator_tree product.configurator.attribute tree New
Models touched (8)

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals)
    @api.model
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (6)
  • can_create_product Boolean
    compute='_compute_can_be_created' store=False
  • create_product_variant Boolean
    string='Create product now!'
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product Variant'
  • product_tmpl_id Many2one → product.template
    auto_join=True comodel_name='product.template' string='Product Template'
Public methods (3)
  • create(self, vals)
    @api.model
    Fill `product_tmpl_id` in case `product_id` is supplied but not the other one.
  • create_variant_if_needed(self)
    Create the product variant if needed. It searches for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found or newly created)
  • unlink(self)
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Many2oneReference
    index=True model_field='owner_model' ondelete='cascade' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits='Product Price' help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.' string='Attribute Price Extra'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('id', 'in', possible_value_ids)]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • template_price_get(self, prod_id, qty, partner=None)
  • template_price_rule_get(self, prod_id, qty, partner=None)

New fields (0)

No new fields.

Public methods (2)
  • create(self, vals)
    @api.model
  • name_get(self)
    We need to add this for avoiding an odoo.exceptions.AccessError due to some refactoring done upstream on read method + variant name_get in Odoo. With this, we avoid to call super on the specific case of virtual records, providing simply the name, which is acceptable.

New fields (1)
  • no_create_variants Selection
    default='no' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', "Use Odoo's default variant management"), ('empty', 'Use the category value')]
Public methods (4)
  • create(self, vals)
    @api.model
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)

New fields (1)
  • required Boolean
    default=False string='Required'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/12.0/product_variant_configurator
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSOCA Transbot, oca-travis, Weblate, OCA-git-bot, Adrià Gil Sorribes
WEBSITE
WEBSITEhttps://github.com/OCA/product-variant
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:19
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - uom
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
product_attribute_view_form product.attribute.form product.attribute group Inherits product.product_attribute_view_form
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template xpath Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
view_product_configurator_tree product.configurator.attribute tree New
Models touched (8)

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals)
    @api.model
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)
    @api.multi

New fields (7)
  • can_create_product Boolean
    compute='_compute_can_be_created' store=False
  • create_product_variant Boolean
    string='Create product now!'
  • name Char
  • price_extra Float
    compute='_compute_price_extra' digits=dp.get_precision('Product Price') help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product Variant'
  • product_tmpl_id Many2one → product.template
    auto_join=True comodel_name='product.template' string='Product Template'
Public methods (3)
  • create(self, vals)
    @api.model
    Fill `product_tmpl_id` in case `product_id` is supplied but not the other one.
  • create_variant_if_needed(self)
    @api.multi
    Create the product variant if needed. It searches for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found or newly created)
  • unlink(self)
    @api.multi
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Integer
    ondelete='cascade' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits=dp.get_precision('Product Price') help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.' string='Attribute Price Extra'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('attribute_id', '=', attribute_id), ('id', 'in', possible_value_ids)]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • template_price_get(self, prod_id, qty, partner=None)
    @api.multi
  • template_price_rule_get(self, prod_id, qty, partner=None)
    @api.multi

New fields (1)
  • name Char
    related='product_tmpl_id.name'
Public methods (2)
  • create(self, vals)
    @api.model
  • name_get(self)
    We need to add this for avoiding an odoo.exceptions.AccessError due to some refactoring done upstream on read method + variant name_get in Odoo. With this, we avoid to call super on the specific case of virtual records, providing simply the name, which is acceptable.

New fields (1)
  • no_create_variants Selection
    default='no' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', "Use Odoo's default variant management"), ('empty', 'Use the category value')]
Public methods (5)
  • create(self, vals)
    @api.model
  • create_variant_ids(self)
    @api.multi
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)
    @api.multi

New fields (1)
  • required Boolean
    default=False string='Required'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/11.0/product_variant_configurator
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Adrià Gil Sorribes
WEBSITE
WEBSITEhttps://github.com/OCA/product-variant
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:23:58
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
attribute_price_tree_view product.attribute.price.tree product.attribute.price tree New
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template div Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
view_product_configurator_tree product.configurator.attribute tree New
Models touched (9)

New fields (1)
  • required Boolean
    default=False string='Required'
Public methods (0)

No public methods.

New fields (1)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True related='value_id.attribute_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals)
    @api.model
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)
    @api.multi

New fields (7)
  • can_create_product Boolean
    compute='_compute_can_be_created' store=False
  • create_product_variant Boolean
    string='Create product now!'
  • name Char
  • price_extra Float
    compute='_compute_price_extra' digits=dp.get_precision('Product Price') help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product'
  • product_tmpl_id Many2one → product.template
    auto_join=True comodel_name='product.template' string='Product Template'
Public methods (3)
  • create(self, vals)
    @api.model
    Fill `product_tmpl_id` in case `product_id` is supplied but not the other one.
  • create_variant_if_needed(self)
    @api.multi
    Create the product variant if needed. It searches for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found or newly created)
  • unlink(self)
    @api.multi
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Integer
    ondelete='cascade' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits=dp.get_precision('Product Price') help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('attribute_id', '=', attribute_id), ('id', 'in', possible_value_ids)]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • template_price_get(self, prod_id, qty, partner=None)
    @api.multi
  • template_price_rule_get(self, prod_id, qty, partner=None)
    @api.multi

New fields (1)
  • name Char
    related='product_tmpl_id.name'
Public methods (2)
  • create(self, vals)
    @api.model
  • name_get(self)
    We need to add this for avoiding an odoo.exceptions.AccessError due to some refactoring done upstream on read method + variant name_get in Odoo. With this, we avoid to call super on the specific case of virtual records, providing simply the name, which is acceptable.

New fields (1)
  • no_create_variants Selection
    default='empty' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', 'Create them automatically'), ('empty', 'Use the category value')]
Public methods (6)
  • action_open_attribute_prices(self)
    @api.multi
  • create(self, vals)
    @api.model
  • create_variant_ids(self)
    @api.multi
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)
    @api.multi
REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/10.0/product_variant_configurator
VERSION
VERSION 2.0.0
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSPedro M. Baeza, OCA Transbot, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttps://odoo-community.org/
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:19:57
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - web_tour
    - report
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
attribute_price_tree_view product.attribute.price.tree product.attribute.price tree New
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template div Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
view_product_configurator_tree product.configurator.attribute tree New
Models touched (9)

New fields (1)
  • required Boolean
    default=True args: 'Required'
Public methods (0)

No public methods.

New fields (1)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' related='value_id.attribute_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals)
    @api.model
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)
    @api.multi

New fields (7)
  • can_create_product Boolean
    compute='_compute_can_be_created' store=False
  • create_product_variant Boolean
    string='Create product now!'
  • name Char
  • price_extra Float
    compute='_compute_price_extra' digits=dp.get_precision('Product Price') help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product'
  • product_tmpl_id Many2one → product.template
    auto_join=True comodel_name='product.template' string='Product Template'
Public methods (3)
  • create(self, vals)
    @api.model
    Fill `product_tmpl_id` in case `product_id` is supplied but not the other one.
  • create_variant_if_needed(self)
    @api.multi
    Create the product variant if needed. It searches for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found or newly created)
  • unlink(self)
    @api.multi
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Integer
    ondelete='cascade' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits=dp.get_precision('Product Price') help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('attribute_id', '=', attribute_id), ('id', 'in', possible_value_ids[0][2])]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (2)
  • template_price_get(self, prod_id, qty, partner=None)
    @api.multi
  • template_price_rule_get(self, prod_id, qty, partner=None)
    @api.multi

New fields (1)
  • name Char
    related='product_tmpl_id.name'
Public methods (2)
  • create(self, vals)
    @api.model
  • name_get(self)
    We need to add this for avoiding an odoo.exceptions.AccessError due to some refactoring done upstream on read method + variant name_get in Odoo. With this, we avoid to call super on the specific case of virtual records, providing simply the name, which is acceptable.

New fields (1)
  • no_create_variants Selection
    default='empty' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', 'Create them automatically'), ('empty', 'Use the category value')]
Public methods (6)
  • action_open_attribute_prices(self)
    @api.multi
  • create(self, vals)
    @api.model
  • create_variant_ids(self)
    @api.multi
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)
    @api.multi
REPOSITORY
REPOSITORYOCA/product-variant
GIT
GIThttps://github.com/OCA/product-variant.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/product-variant/tree/9.0/product_variant_configurator
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYProduct Variant
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), AvanzOSC, ACSONE SA/NV
COMMITTERS
COMMITTERSPedro M. Baeza, OCA Transbot, Thomas Binsfeld, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttps://odoo-community.org/
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:15:21
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - product
    - base
    - decimal_precision
    - mail
    - base_setup
    - web_kanban
    - web
    - bus
    - report
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
attribute_price_tree_view product.attribute.price.tree product.attribute.price tree New
product_category_no_variant_form_view product.category.no.variant.form product.category field Inherits product.product_category_form_view
product_template_no_variant_form_view product.template.no.variant.form product.template div Inherits product.product_template_only_form_view
product_variants_view product.product.variants.form product.product field Inherits product.product_normal_form_view
view_product_configurator_tree product.configurator.attribute tree New
Models touched (9)

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (1)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' related='value_id.attribute_id'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • create(self, vals)
    @api.model
    Link created attribute value to the associated template if proceed. This happens when quick-creating values from the product configurator.

New fields (1)
  • no_create_variants Boolean
    default=True help='This check disables the automatic creation of product variants for all the products of this category.' string="Don't create variants automatically"
Public methods (2)
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)
    @api.multi

New fields (7)
  • can_create_product Boolean
    compute='_compute_can_be_created' store=False
  • create_product_variant Boolean
    string='Create product now!'
  • name Char
  • price_extra Float
    compute='_compute_price_extra' digits=dp.get_precision('Product Price') help='Price Extra: Extra price for the variant with the currently selected attributes values on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_attribute_ids One2many → product.configurator.attribute
    comodel_name='product.configurator.attribute' copy=True domain=<expr> inverse_name='owner_id' string='Product attributes'
  • product_id Many2one → product.product
    comodel_name='product.product' string='Product'
  • product_tmpl_id Many2one → product.template
    auto_join=True comodel_name='product.template' string='Product Template'
Public methods (2)
  • create_variant_if_needed(self)
    @api.multi
    Create the product variant Check if the configuration if valid by calling check_configuration_validity. The search for an existing product with the selected attributes. If not found, create a new product. :returns: the product (found our newly created)
  • unlink(self)
    @api.multi
    Mimic `ondelete="cascade"`.

New fields (7)
  • attribute_id Many2one → product.attribute
    comodel_name='product.attribute' readonly=True string='Attribute'
  • owner_id Integer
    ondelete='cascade' required=True string='Owner'
  • owner_model Char
    required=True
  • possible_value_ids Many2many → product.attribute.value
    comodel_name='product.attribute.value' compute='_compute_possible_value_ids' readonly=True
  • price_extra Float
    compute='_compute_price_extra' digits=dp.get_precision('Product Price') help='Price Extra: Extra price for the variant with this attribute value on sale price. eg. 200 price extra, 1000 + 200 = 1200.'
  • product_tmpl_id Many2one → product.template
    comodel_name='product.template' required=True string='Product Template'
  • value_id Many2one → product.attribute.value
    comodel_name='product.attribute.value' domain="[('attribute_id', '=', attribute_id), ('id', 'in', possible_value_ids[0][2])]" string='Value'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (3)
  • price_rule_get_multi(self, products_by_qty_by_partner)
    @api.multi
  • template_price_get(self, prod_id, qty, partner=None)
    @api.multi
  • template_price_rule_get(self, prod_id, qty, partner=None)
    @api.multi

New fields (1)
  • name Char
    related='product_tmpl_id.name'
Public methods (1)
  • create(self, vals)
    @api.model

New fields (1)
  • no_create_variants Selection
    default='empty' help='This selection defines if variants for all attribute combinations are going to be created automatically at saving time.' required=True string='Variant creation' args: [('yes', "Don't create them automatically"), ('no', 'Create them automatically'), ('empty', 'Use the category value')]
Public methods (6)
  • action_open_attribute_prices(self)
    @api.multi
  • create(self, vals)
    @api.model
  • create_variant_ids(self)
    @api.multi
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    @api.model
  • onchange_no_create_variants(self)
    @api.onchange('no_create_variants')
  • write(self, values)
    @api.multi