Attribute Set

attribute_set
REPOSITORY
REPOSITORYOCA/odoo-pim
GIT
GIThttps://github.com/OCA/odoo-pim.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/odoo-pim/tree/19.0/attribute_set
VERSION
VERSION 1.1.3
CATEGORY
CATEGORYGeneric Modules/Others
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSJordi Ballester Alomar, Miquel Raïch, AaronHForgeFlow, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/odoo-pim
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:47
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES unidecode
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows the user to create Attributes to any model. This is a
basic module in the way that **it does not provide views to display
these new Attributes.**

Each Attribute created will be related to an **existing field** (in case
of a *"native"* Attribute) or to a newly **created field** (in case of a
*"custom"* Attribute).

A *"custom"* Attribute can be of any type : Char, Text, Boolean, Date,
Binary... but also Many2one or Many2many.

In case of m2o or m2m, these attributes can be related to **custom
options** created for the Attribute, or to **existing Odoo objects**
from other models.

Last but not least an Attribute can be **serialized** using the Odoo SA
module
[base_sparse_field](https://github.com/odoo/odoo/tree/16.0/addons/base_sparse_field)
. It means that all the serialized attributes will be stored in a single
"JSON serialization field" and will not create new columns in the
database (and better, it will not create new SQL tables in case of
Many2many Attributes), **increasing significantly the requests speed**
when dealing with thousands of Attributes.

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
attribute_attribute_form_view attribute.attribute.form attribute.attribute form New
attribute_attribute_tree_view attribute.attribute.list attribute.attribute list New
attribute_group_form_view attribute.group form New
attribute_group_search_view attribute.group search New
attribute_group_tree_view attribute.group list New
attribute_option_form_popup_view attribute.option.form.popup attribute.option form New
attribute_option_form_view attribute.option.form attribute.option form New
attribute_option_tree_view attribute.option.list attribute.option list New
attribute_option_wizard_form_view attribute.option.wizard attribute.option.wizard form New
attribute_set_form_view attribute.set.form attribute.set form New
attribute_set_tree_view attribute.set.list attribute.set list New
view_attribute_attribute_search attribute.attribute.list attribute.attribute search New
view_attribute_option_search attribute.option.list attribute.option search New
view_attribute_set_search attribute.set.list attribute.set search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (8)

New fields (14)
  • allowed_attribute_set_ids Many2many → attribute.set
    comodel_name='attribute.set' compute='_compute_allowed_attribute_set_ids'
  • attribute_group_id Many2one → attribute.group
    ondelete='cascade' required=True args: 'attribute.group', 'Attribute Group'
  • attribute_set_ids Many2many → attribute.set
    column1='attribute_id' column2='attribute_set_id' comodel_name='attribute.set' relation='rel_attribute_set' string='Attribute Sets'
  • attribute_type Selection
    args: [('char', 'Char'), ('text', 'Text'), ('select', 'Select'), ('multiselect', 'Multiselect'), ('boolean', 'Boolean'), ('integer', 'Integer'), ('float', 'Float'), ('date', 'Date'), ('datetime', 'Datetime'), ('binary', 'Binary (file)'), ('image', 'Image')]
  • create_date Datetime
    readonly=True args: 'Created date'
  • field_id Many2one → ir.model.fields
    ondelete='cascade' required=True args: 'ir.model.fields', 'Ir Model Fields'
  • nature Selection
    default='custom' required=True string='Attribute Nature' args: [('custom', 'Custom'), ('native', 'Native')]
  • option_ids One2many → attribute.option
    args: 'attribute.option', 'attribute_id', 'Attribute Options'
  • relation_model_id Many2one → ir.model
    ondelete='cascade' args: 'ir.model', 'Relational Model'
  • required_on_views Boolean
    help='If activated, the attribute will be mandatory on the views, but not in the database' args: 'Required (on views)'
  • sequence Integer
    help="The attribute's order in his group" args: 'Sequence in Group'
  • sequence_group Integer
    help='The sequence of the group' related='attribute_group_id.sequence' store='True' args: 'Sequence of the Group'
  • serialized Boolean
    help="If serialized, the attribute's field will be stored in the serialization\n field 'x_custom_json_attrs' (i.e. a JSON containing all the serialized\n fields values) instead of creating a new SQL column for this\n attribute's field. Useful to increase speed requests if creating a\n high number of attributes."
  • widget Char
    help='Specify widget to add to the field on the views.'
Public methods (9)
  • button_add_options(self)
  • copy(self, default=None)
    Ensure unique name when duplicating attribute.
  • create(self, vals_list)
    @api.model_create_multi
    Create an attribute.attribute - In case of a new "custom" attribute, a new field object 'ir.model.fields' will be created as this model "_inherits" 'ir.model.fields'. So we need to add here the mandatory 'ir.model.fields' instance's attributes to the new 'attribute.attribute'. - In case of a new "native" attribute, it will be linked to an existing field object 'ir.model.fields' (through "field_id") that cannot be modified. That's why we remove all the 'ir.model.fields' instance's attributes values from `vals` before creating our new 'attribute.attribute'.
  • onchange_attribute_type(self)
    @api.onchange('attribute_type')
  • onchange_field_description(self)
    @api.onchange('field_description')
  • onchange_model_id(self)
    @api.onchange('model_id')
  • onchange_name(self)
    @api.onchange('name')
  • unlink(self)
    Delete the Attribute's related field when deleting a custom Attribute
  • write(self, vals)

New fields (4)
  • attribute_ids One2many → attribute.attribute
    args: 'attribute.attribute', 'attribute_group_id', 'Attributes'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True
  • sequence Integer
    help="The Group order in his attribute's Set" args: 'Sequence in Set'
Public methods (0)

No public methods.

New fields (5)
  • attribute_id Many2one → attribute.attribute
    ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • name Char
    required=True translate=True
  • relation_model_id Many2one → ir.model
    ondelete='cascade' related='attribute_id.relation_model_id' args: 'ir.model', 'Relational Model'
  • sequence Integer
  • value_ref Reference
    selection='_selection_model_list' string='Reference'
Public methods (0)

No public methods.

New fields (2)
  • attribute_id Many2one → attribute.attribute
    default=<expr> ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • option_ids Many2many → attribute.option
    string='Attribute Options' args: 'attribute.option'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • get_views(self, views, options=None)
    @api.model
  • validate(self)

New fields (8)
  • attribute_ids Many2many → attribute.attribute
    column1='attribute_set_id' column2='attribute_id' comodel_name='attribute.attribute' relation='rel_attribute_set' string='Attributes'
  • child_ids One2many → attribute.set
    comodel_name='attribute.set' inverse_name='parent_id' string='Child Sets'
  • complete_attribute_ids Many2many → attribute.attribute
    comodel_name='attribute.attribute' compute='_compute_complete_attribute_ids' recursive=True string='All Attributes (inherited)'
  • model Char
    help='This is a technical field in order to build filters on this one to avoidaccess on ir.model' related='model_id.model' store=True string='Model Name'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True
  • parent_id Many2one → attribute.set
    comodel_name='attribute.set' domain="[('model_id', '=', model_id)]" index=True ondelete='restrict' string='Parent Set'
  • parent_path Char
    index=True
Public methods (0)

No public methods.

New fields (1)
  • attribute_set_id Many2one → attribute.set
    domain=<expr> args: 'attribute.set', 'Attribute Set'
Public methods (2)
  • get_view(self, view_id=None, view_type='form', **options)
  • remove_native_fields(self, eview)
    @api.model
    Remove native fields related to native attributes from eview

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/odoo-pim
GIT
GIThttps://github.com/OCA/odoo-pim.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/odoo-pim/tree/18.0/attribute_set
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYGeneric Modules/Others
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, Don Kendall, oca-ci, kobros-tech
WEBSITE
WEBSITEhttps://github.com/OCA/odoo-pim
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES unidecode
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows the user to create Attributes to any model. This is a
basic module in the way that **it does not provide views to display
these new Attributes.**

Each Attribute created will be related to an **existing field** (in case
of a *"native"* Attribute) or to a newly **created field** (in case of a
*"custom"* Attribute).

A *"custom"* Attribute can be of any type : Char, Text, Boolean, Date,
Binary... but also Many2one or Many2many.

In case of m2o or m2m, these attributes can be related to **custom
options** created for the Attribute, or to **existing Odoo objects**
from other models.

Last but not least an Attribute can be **serialized** using the Odoo SA
module
[base_sparse_field](https://github.com/odoo/odoo/tree/16.0/addons/base_sparse_field)
. It means that all the serialized attributes will be stored in a single
"JSON serialization field" and will not create new columns in the
database (and better, it will not create new SQL tables in case of
Many2many Attributes), **increasing significantly the requests speed**
when dealing with thousands of Attributes.

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
attribute_attribute_form_view attribute.attribute.form attribute.attribute form New
attribute_attribute_tree_view attribute.attribute.list attribute.attribute list New
attribute_group_form_view attribute.group form New
attribute_group_search_view attribute.group search New
attribute_group_tree_view attribute.group list New
attribute_option_form_popup_view attribute.option.form.popup attribute.option form New
attribute_option_form_view attribute.option.form attribute.option form New
attribute_option_tree_view attribute.option.list attribute.option list New
attribute_option_wizard_form_view attribute.option.wizard attribute.option.wizard form New
attribute_set_form_view attribute.set.form attribute.set form New
attribute_set_tree_view attribute.set.list attribute.set list New
view_attribute_attribute_search attribute.attribute.list attribute.attribute search New
view_attribute_option_search attribute.option.list attribute.option search New
view_attribute_set_search attribute.set.list attribute.set search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (6)

New fields (14)
  • allowed_attribute_set_ids Many2many → attribute.set
    comodel_name='attribute.set' compute='_compute_allowed_attribute_set_ids'
  • attribute_group_id Many2one → attribute.group
    ondelete='cascade' required=True args: 'attribute.group', 'Attribute Group'
  • attribute_set_ids Many2many → attribute.set
    column1='attribute_id' column2='attribute_set_id' comodel_name='attribute.set' relation='rel_attribute_set' string='Attribute Sets'
  • attribute_type Selection
    args: [('char', 'Char'), ('text', 'Text'), ('select', 'Select'), ('multiselect', 'Multiselect'), ('boolean', 'Boolean'), ('integer', 'Integer'), ('date', 'Date'), ('datetime', 'Datetime'), ('binary', 'Binary'), ('float', 'Float')]
  • create_date Datetime
    readonly=True args: 'Created date'
  • field_id Many2one → ir.model.fields
    ondelete='cascade' required=True args: 'ir.model.fields', 'Ir Model Fields'
  • nature Selection
    default='custom' required=True string='Attribute Nature' args: [('custom', 'Custom'), ('native', 'Native')]
  • option_ids One2many → attribute.option
    args: 'attribute.option', 'attribute_id', 'Attribute Options'
  • relation_model_id Many2one → ir.model
    ondelete='cascade' args: 'ir.model', 'Relational Model'
  • required_on_views Boolean
    help='If activated, the attribute will be mandatory on the views, but not in the database' args: 'Required (on views)'
  • sequence Integer
    help="The attribute's order in his group" args: 'Sequence in Group'
  • sequence_group Integer
    help='The sequence of the group' related='attribute_group_id.sequence' store='True' args: 'Sequence of the Group'
  • serialized Boolean
    help="If serialized, the attribute's field will be stored in the serialization\n field 'x_custom_json_attrs' (i.e. a JSON containing all the serialized\n fields values) instead of creating a new SQL column for this\n attribute's field. Useful to increase speed requests if creating a\n high number of attributes."
  • widget Char
    help='Specify widget to add to the field on the views.'
Public methods (8)
  • button_add_options(self)
  • create(self, vals_list)
    @api.model_create_multi
    Create an attribute.attribute - In case of a new "custom" attribute, a new field object 'ir.model.fields' will be created as this model "_inherits" 'ir.model.fields'. So we need to add here the mandatory 'ir.model.fields' instance's attributes to the new 'attribute.attribute'. - In case of a new "native" attribute, it will be linked to an existing field object 'ir.model.fields' (through "field_id") that cannot be modified. That's why we remove all the 'ir.model.fields' instance's attributes values from `vals` before creating our new 'attribute.attribute'.
  • onchange_attribute_type(self)
    @api.onchange('attribute_type')
  • onchange_field_description(self)
    @api.onchange('field_description')
  • onchange_model_id(self)
    @api.onchange('model_id')
  • onchange_name(self)
    @api.onchange('name')
  • unlink(self)
    Delete the Attribute's related field when deleting a custom Attribute
  • write(self, vals)

New fields (4)
  • attribute_ids One2many → attribute.attribute
    args: 'attribute.attribute', 'attribute_group_id', 'Attributes'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True
  • sequence Integer
    help="The Group order in his attribute's Set" args: 'Sequence in Set'
Public methods (0)

No public methods.

New fields (5)
  • attribute_id Many2one → attribute.attribute
    ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • name Char
    required=True translate=True
  • relation_model_id Many2one → ir.model
    ondelete='cascade' related='attribute_id.relation_model_id' args: 'ir.model', 'Relational Model'
  • sequence Integer
  • value_ref Reference
    selection='_selection_model_list' string='Reference'
Public methods (0)

No public methods.

New fields (2)
  • attribute_id Many2one → attribute.attribute
    default=<expr> ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • option_ids Many2many → attribute.option
    string='Attribute Options' args: 'attribute.option'
Public methods (3)
  • create(self, vals_list)
    @api.model_create_multi
  • get_views(self, views, options=None)
    @api.model
  • validate(self)

New fields (4)
  • attribute_ids Many2many → attribute.attribute
    column1='attribute_set_id' column2='attribute_id' comodel_name='attribute.attribute' relation='rel_attribute_set' string='Attributes'
  • model Char
    help='This is a technical field in order to build filters on this one to avoidaccess on ir.model' related='model_id.model' store=True string='Model Name'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (1)
  • attribute_set_id Many2one → attribute.set
    domain=<expr> args: 'attribute.set', 'Attribute Set'
Public methods (2)
  • get_view(self, view_id=None, view_type='form', **options)
  • remove_native_fields(self, eview)
    @api.model
    Remove native fields related to native attributes from eview
REPOSITORY
REPOSITORYOCA/odoo-pim
GIT
GIThttps://github.com/OCA/odoo-pim.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/odoo-pim/tree/16.0/attribute_set
VERSION
VERSION 1.3.0
CATEGORY
CATEGORYGeneric Modules/Others
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSDenis Roussel, sbejaoui, JordiMForgeFlow, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/odoo-pim
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:53:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES unidecode
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
attribute_attribute_form_view attribute.attribute.form attribute.attribute form New
attribute_attribute_tree_view attribute.attribute.tree attribute.attribute tree New
attribute_group_form_view attribute.group form New
attribute_group_search_view attribute.group search New
attribute_group_tree_view attribute.group tree New
attribute_option_form_popup_view attribute.option.form.popup attribute.option form New
attribute_option_form_view attribute.option.form attribute.option form New
attribute_option_tree_view attribute.option.tree attribute.option tree New
attribute_option_wizard_form_view attribute.option.wizard attribute.option.wizard form New
attribute_set_form_view attribute.set.form attribute.set form New
attribute_set_tree_view attribute.set.tree attribute.set tree New
view_attribute_attribute_search attribute.attribute.list attribute.attribute search New
view_attribute_option_search attribute.option.list attribute.option search New
view_attribute_set_search attribute.set.list attribute.set search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (6)

New fields (14)
  • allowed_attribute_set_ids Many2many → attribute.set
    comodel_name='attribute.set' compute='_compute_allowed_attribute_set_ids'
  • attribute_group_id Many2one → attribute.group
    ondelete='cascade' required=True args: 'attribute.group', 'Attribute Group'
  • attribute_set_ids Many2many → attribute.set
    column1='attribute_id' column2='attribute_set_id' comodel_name='attribute.set' relation='rel_attribute_set' string='Attribute Sets'
  • attribute_type Selection
    args: [('char', 'Char'), ('text', 'Text'), ('select', 'Select'), ('multiselect', 'Multiselect'), ('boolean', 'Boolean'), ('integer', 'Integer'), ('date', 'Date'), ('datetime', 'Datetime'), ('binary', 'Binary'), ('float', 'Float')]
  • create_date Datetime
    readonly=True args: 'Created date'
  • field_id Many2one → ir.model.fields
    ondelete='cascade' required=True args: 'ir.model.fields', 'Ir Model Fields'
  • nature Selection
    default='custom' required=True store=True string='Attribute Nature' args: [('custom', 'Custom'), ('native', 'Native')]
  • option_ids One2many → attribute.option
    args: 'attribute.option', 'attribute_id', 'Attribute Options'
  • relation_model_id Many2one → ir.model
    ondelete='cascade' args: 'ir.model', 'Relational Model'
  • required_on_views Boolean
    help='If activated, the attribute will be mandatory on the views, but not in the database' args: 'Required (on views)'
  • sequence Integer
    help="The attribute's order in his group" args: 'Sequence in Group'
  • sequence_group Integer
    help='The sequence of the group' related='attribute_group_id.sequence' store='True' args: 'Sequence of the Group'
  • serialized Boolean
    help="If serialized, the attribute's field will be stored in the serialization\n field 'x_custom_json_attrs' (i.e. a JSON containing all the serialized\n fields values) instead of creating a new SQL column for this\n attribute's field. Useful to increase speed requests if creating a\n high number of attributes."
  • widget Char
    help='Specify widget to add to the field on the views.'
Public methods (8)
  • button_add_options(self)
  • create(self, vals_list)
    @api.model_create_multi
    Create an attribute.attribute - In case of a new "custom" attribute, a new field object 'ir.model.fields' will be created as this model "_inherits" 'ir.model.fields'. So we need to add here the mandatory 'ir.model.fields' instance's attributes to the new 'attribute.attribute'. - In case of a new "native" attribute, it will be linked to an existing field object 'ir.model.fields' (through "field_id") that cannot be modified. That's why we remove all the 'ir.model.fields' instance's attributes values from `vals` before creating our new 'attribute.attribute'.
  • onchange_attribute_type(self)
    @api.onchange('attribute_type')
  • onchange_field_description(self)
    @api.onchange('field_description')
  • onchange_model_id(self)
    @api.onchange('model_id')
  • onchange_name(self)
    @api.onchange('name')
  • unlink(self)
    Delete the Attribute's related field when deleting a custom Attribute
  • write(self, vals)

New fields (4)
  • attribute_ids One2many → attribute.attribute
    args: 'attribute.attribute', 'attribute_group_id', 'Attributes'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True
  • sequence Integer
    help="The Group order in his attribute's Set" args: 'Sequence in Set'
Public methods (0)

No public methods.

New fields (5)
  • attribute_id Many2one → attribute.attribute
    ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • name Char
    required=True translate=True
  • relation_model_id Many2one → ir.model
    ondelete='cascade' related='attribute_id.relation_model_id' args: 'ir.model', 'Relational Model'
  • sequence Integer
  • value_ref Reference
    groups='base.group_erp_manager' selection='_selection_model_list' string='Reference'
Public methods (0)

No public methods.

New fields (1)
  • attribute_id Many2one → attribute.attribute
    default=<expr> ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
Public methods (4)
  • create(self, vals_list)
    @api.model_create_multi
  • get_views(self, views, options=None)
    @api.model
  • read(self, fields=None, load='_classic_read')
  • validate(self)

New fields (4)
  • attribute_ids Many2many → attribute.attribute
    column1='attribute_set_id' column2='attribute_id' comodel_name='attribute.attribute' relation='rel_attribute_set' string='Attributes'
  • model Char
    help='This is a technical field in order to build filters on this one to avoidaccess on ir.model' related='model_id.model' store=True string='Model Name'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (1)
  • attribute_set_id Many2one → attribute.set
    domain=<expr> args: 'attribute.set', 'Attribute Set'
Public methods (2)
  • get_view(self, view_id=None, view_type='form', **options)
  • remove_native_fields(self, eview)
    @api.model
    Remove native fields related to native attributes from eview
REPOSITORY
REPOSITORYOCA/odoo-pim
GIT
GIThttps://github.com/OCA/odoo-pim.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/odoo-pim/tree/15.0/attribute_set
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYGeneric Modules/Others
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSMiquel Raïch, Weblate, OCA-git-bot, Simone Orsi, oca-ci, Jasmin Solanki
WEBSITE
WEBSITEhttps://github.com/OCA/odoo-pim
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:30
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES unidecode
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
attribute_attribute_form_view attribute.attribute.form attribute.attribute form New
attribute_attribute_tree_view attribute.attribute.tree attribute.attribute tree New
attribute_group_form_view attribute.group form New
attribute_group_search_view attribute.group search New
attribute_group_tree_view attribute.group tree New
attribute_option_form_popup_view attribute.option.form.popup attribute.option form New
attribute_option_form_view attribute.option.form attribute.option form New
attribute_option_tree_view attribute.option.tree attribute.option tree New
attribute_option_wizard_form_view attribute.option.wizard attribute.option.wizard form New
attribute_set_form_view attribute.set.form attribute.set form New
attribute_set_tree_view attribute.set.tree attribute.set tree New
view_attribute_attribute_search attribute.attribute.list attribute.attribute search New
view_attribute_option_search attribute.option.list attribute.option search New
view_attribute_set_search attribute.set.list attribute.set search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (6)

New fields (13)
  • attribute_group_id Many2one → attribute.group
    ondelete='cascade' required=True args: 'attribute.group', 'Attribute Group'
  • attribute_set_ids Many2many → attribute.set
    column1='attribute_id' column2='attribute_set_id' comodel_name='attribute.set' relation='rel_attribute_set' string='Attribute Sets'
  • attribute_type Selection
    args: [('char', 'Char'), ('text', 'Text'), ('select', 'Select'), ('multiselect', 'Multiselect'), ('boolean', 'Boolean'), ('integer', 'Integer'), ('date', 'Date'), ('datetime', 'Datetime'), ('binary', 'Binary'), ('float', 'Float')]
  • create_date Datetime
    readonly=True args: 'Created date'
  • field_id Many2one → ir.model.fields
    ondelete='cascade' required=True args: 'ir.model.fields', 'Ir Model Fields'
  • nature Selection
    default='custom' required=True store=True string='Attribute Nature' args: [('custom', 'Custom'), ('native', 'Native')]
  • option_ids One2many → attribute.option
    args: 'attribute.option', 'attribute_id', 'Attribute Options'
  • relation_model_id Many2one → ir.model
    ondelete='cascade' args: 'ir.model', 'Relational Model'
  • required_on_views Boolean
    help='If activated, the attribute will be mandatory on the views, but not in the database' args: 'Required (on views)'
  • sequence Integer
    help="The attribute's order in his group" args: 'Sequence in Group'
  • sequence_group Integer
    help='The sequence of the group' related='attribute_group_id.sequence' store='True' args: 'Sequence of the Group'
  • serialized Boolean
    help="If serialized, the attribute's field will be stored in the serialization\n field 'x_custom_json_attrs' (i.e. a JSON containing all the serialized\n fields values) instead of creating a new SQL column for this\n attribute's field. Useful to increase speed requests if creating a\n high number of attributes."
  • widget Char
    help='Specify widget to add to the field on the views.'
Public methods (10)
  • button_add_options(self)
  • create(self, vals)
    @api.model
    Create an attribute.attribute - In case of a new "custom" attribute, a new field object 'ir.model.fields' will be created as this model "_inherits" 'ir.model.fields'. So we need to add here the mandatory 'ir.model.fields' instance's attributes to the new 'attribute.attribute'. - In case of a new "native" attribute, it will be linked to an existing field object 'ir.model.fields' (through "field_id") that cannot be modified. That's why we remove all the 'ir.model.fields' instance's attributes values from `vals` before creating our new 'attribute.attribute'.
  • domain_change(self)
    @api.onchange('domain')
  • onchange_attribute_type(self)
    @api.onchange('attribute_type')
  • onchange_field_description(self)
    @api.onchange('field_description')
  • onchange_model_id(self)
    @api.onchange('model_id')
  • onchange_name(self)
    @api.onchange('name')
  • relation_model_id_change(self)
    @api.onchange('relation_model_id')
    Remove selected options as they would be inconsistent
  • unlink(self)
    Delete the Attribute's related field when deleting a custom Attribute
  • write(self, vals)

New fields (4)
  • attribute_ids One2many → attribute.attribute
    args: 'attribute.attribute', 'attribute_group_id', 'Attributes'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model', 'Model'
  • name Char
    required=True size=128 translate=True
  • sequence Integer
    help="The Group order in his attribute's Set" args: 'Sequence in Set'
Public methods (0)

No public methods.

New fields (5)
  • attribute_id Many2one → attribute.attribute
    ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • name Char
    required=True translate=True
  • relation_model_id Many2one → ir.model
    ondelete='cascade' related='attribute_id.relation_model_id' args: 'ir.model', 'Relational Model'
  • sequence Integer
  • value_ref Reference
    args: _get_model_list, 'Reference'
Public methods (1)
  • name_change(self)
    @api.onchange('name')
    Prevent the user from adding manually an option to m2o or m2m Attributes linked to another model (through 'relation_model_id')

New fields (1)
  • attribute_id Many2one → attribute.attribute
    default=<expr> ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
Public methods (4)
  • create(self, vals)
    @api.model
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • read(self, fields=None, load='_classic_read')
  • validate(self)

New fields (3)
  • attribute_ids Many2many → attribute.attribute
    column1='attribute_set_id' column2='attribute_id' comodel_name='attribute.attribute' relation='rel_attribute_set' string='Attributes'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (1)
  • attribute_set_id Many2one → attribute.set
    args: 'attribute.set', 'Attribute Set'
Public methods (2)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • remove_native_fields(self, eview)
    @api.model
    Remove native fields related to native attributes from eview
REPOSITORY
REPOSITORYOCA/odoo-pim
GIT
GIThttps://github.com/OCA/odoo-pim.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/odoo-pim/tree/14.0/attribute_set
VERSION
VERSION 1.4.0
CATEGORY
CATEGORYGeneric Modules/Others
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSStéphane Bidoul, GitHub, Miquel Raïch, Florian da Costa, Weblate, OCA-git-bot, hparfr, Pierrick Brun, shopinvader-git-bot, oca-ci, kobros-tech, Xavier Bouquiaux, oca-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/odoo-pim
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:51
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES unidecode
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
attribute_attribute_form_view attribute.attribute.form attribute.attribute form New
attribute_attribute_tree_view attribute.attribute.tree attribute.attribute tree New
attribute_group_form_view attribute.group form New
attribute_group_search_view attribute.group search New
attribute_group_tree_view attribute.group tree New
attribute_option_form_popup_view attribute.option.form.popup attribute.option form New
attribute_option_form_view attribute.option.form attribute.option form New
attribute_option_tree_view attribute.option.tree attribute.option tree New
attribute_option_wizard_form_view attribute.option.wizard attribute.option.wizard form New
attribute_set_form_view attribute.set.form attribute.set form New
attribute_set_tree_view attribute.set.tree attribute.set tree New
view_attribute_attribute_search attribute.attribute.list attribute.attribute search New
view_attribute_option_search attribute.option.list attribute.option search New
view_attribute_set_search attribute.set.list attribute.set search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (7)

New fields (14)
  • attribute_group_id Many2one → attribute.group
    ondelete='cascade' required=True args: 'attribute.group', 'Attribute Group'
  • attribute_set_ids Many2many → attribute.set
    column1='attribute_id' column2='attribute_set_id' comodel_name='attribute.set' relation='rel_attribute_set' string='Attribute Sets'
  • attribute_type Selection
    args: [('char', 'Char'), ('text', 'Text'), ('select', 'Select'), ('multiselect', 'Multiselect'), ('boolean', 'Boolean'), ('integer', 'Integer'), ('date', 'Date'), ('datetime', 'Datetime'), ('binary', 'Binary'), ('float', 'Float')]
  • company_dependent Boolean
  • create_date Datetime
    readonly=True args: 'Created date'
  • field_id Many2one → ir.model.fields
    ondelete='cascade' required=True args: 'ir.model.fields', 'Ir Model Fields'
  • nature Selection
    default='custom' required=True store=True string='Attribute Nature' args: [('custom', 'Custom'), ('native', 'Native')]
  • option_ids One2many → attribute.option
    args: 'attribute.option', 'attribute_id', 'Attribute Options'
  • relation_model_id Many2one → ir.model
    ondelete='cascade' args: 'ir.model', 'Relational Model'
  • required_on_views Boolean
    help='If activated, the attribute will be mandatory on the views, but not in the database' args: 'Required (on views)'
  • sequence Integer
    help="The attribute's order in his group" args: 'Sequence in Group'
  • sequence_group Integer
    help='The sequence of the group' related='attribute_group_id.sequence' store='True' args: 'Sequence of the Group'
  • serialized Boolean
    help="If serialized, the attribute's field will be stored in the serialization\n field 'x_custom_json_attrs' (i.e. a JSON containing all the serialized\n fields values) instead of creating a new SQL column for this\n attribute's field. Useful to increase speed requests if creating a\n high number of attributes." args: 'Serialized'
  • widget Char
    help='Specify widget to add to the field on the views.'
Public methods (10)
  • button_add_options(self)
  • create(self, vals)
    @api.model
    Create an attribute.attribute - In case of a new "custom" attribute, a new field object 'ir.model.fields' will be created as this model "_inherits" 'ir.model.fields'. So we need to add here the mandatory 'ir.model.fields' instance's attributes to the new 'attribute.attribute'. - In case of a new "native" attribute, it will be linked to an existing field object 'ir.model.fields' (through "field_id") that cannot be modified. That's why we remove all the 'ir.model.fields' instance's attributes values from `vals` before creating our new 'attribute.attribute'.
  • domain_change(self)
    @api.onchange('domain')
  • onchange_attribute_type(self)
    @api.onchange('attribute_type')
  • onchange_field_description(self)
    @api.onchange('field_description')
  • onchange_model_id(self)
    @api.onchange('model_id')
  • onchange_name(self)
    @api.onchange('name')
  • relation_model_id_change(self)
    @api.onchange('relation_model_id')
    Remove selected options as they would be inconsistent
  • unlink(self)
    Delete the Attribute's related field when deleting a custom Attribute
  • write(self, vals)

New fields (4)
  • attribute_ids One2many → attribute.attribute
    args: 'attribute.attribute', 'attribute_group_id', 'Attributes'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model', 'Model'
  • name Char
    required=True size=128 translate=True args: 'Name'
  • sequence Integer
    help="The Group order in his attribute's Set" args: 'Sequence in Set'
Public methods (0)

No public methods.

New fields (5)
  • attribute_id Many2one → attribute.attribute
    ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • name Char
    required=True translate=True args: 'Name'
  • relation_model_id Many2one → ir.model
    ondelete='cascade' related='attribute_id.relation_model_id' args: 'ir.model', 'Relational Model'
  • sequence Integer
    args: 'Sequence'
  • value_ref Reference
    args: _get_model_list, 'Reference'
Public methods (1)
  • name_change(self)
    @api.onchange('name')
    Prevent the user from adding manually an option to m2o or m2m Attributes linked to another model (through 'relation_model_id')

New fields (2)
  • attribute_id Many2one → attribute.attribute
    default=<expr> ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • option_ids Many2many → attribute.option
    string='Attribute Options' args: 'attribute.option'
Public methods (3)
  • create(self, vals)
    @api.model
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • validate(self)

New fields (3)
  • attribute_ids Many2many → attribute.attribute
    column1='attribute_set_id' column2='attribute_id' comodel_name='attribute.attribute' relation='rel_attribute_set' string='Attributes'
  • model_id Many2one → ir.model
    ondelete='cascade' required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (1)
  • attribute_set_id Many2one → attribute.set
    args: 'attribute.set', 'Attribute Set'
Public methods (2)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • remove_native_fields(self, eview)
    @api.model
    Remove native fields related to native attributes from eview

New fields (0)

No new fields.

Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/odoo-pim
GIT
GIThttps://github.com/OCA/odoo-pim.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/odoo-pim/tree/13.0/attribute_set
VERSION
VERSION 1.2.0
CATEGORY
CATEGORYGeneric Modules/Others
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSStéphane Bidoul, Cédric Pigeon, Denis Roussel, david, OCA-git-bot, Simone Orsi, shopinvader-git-bot, oca-ci, Héctor Villarreal Ortega
WEBSITE
WEBSITEhttps://github.com/OCA/odoo-pim
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:10
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES unidecode
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
attribute_attribute_form_view attribute.attribute.form attribute.attribute form New
attribute_attribute_tree_view attribute.attribute.tree attribute.attribute tree New
attribute_group_form_view attribute.group form New
attribute_group_search_view attribute.group search New
attribute_group_tree_view attribute.group tree New
attribute_option_form_popup_view attribute.option.form.popup attribute.option form New
attribute_option_form_view attribute.option.form attribute.option form New
attribute_option_tree_view attribute.option.tree attribute.option tree New
attribute_option_wizard_form_view attribute.option.wizard attribute.option.wizard form New
attribute_set_form_view attribute.set.form attribute.set form New
attribute_set_tree_view attribute.set.tree attribute.set tree New
view_attribute_attribute_search attribute.attribute.list attribute.attribute search New
view_attribute_option_search attribute.option.list attribute.option search New
view_attribute_set_search attribute.set.list attribute.set search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (6)

New fields (13)
  • attribute_group_id Many2one → attribute.group
    ondelete='cascade' required=True args: 'attribute.group', 'Attribute Group'
  • attribute_set_ids Many2many → attribute.set
    column1='attribute_id' column2='attribute_set_id' comodel_name='attribute.set' relation='rel_attribute_set' string='Attribute Sets'
  • attribute_type Selection
    args: [('char', 'Char'), ('text', 'Text'), ('select', 'Select'), ('multiselect', 'Multiselect'), ('boolean', 'Boolean'), ('integer', 'Integer'), ('date', 'Date'), ('datetime', 'Datetime'), ('binary', 'Binary'), ('float', 'Float')]
  • create_date Datetime
    readonly=True args: 'Created date'
  • field_id Many2one → ir.model.fields
    ondelete='cascade' required=True args: 'ir.model.fields', 'Ir Model Fields'
  • nature Selection
    default='custom' required=True store=True string='Attribute Nature' args: [('custom', 'Custom'), ('native', 'Native')]
  • option_ids One2many → attribute.option
    args: 'attribute.option', 'attribute_id', 'Attribute Options'
  • relation_model_id Many2one → ir.model
    args: 'ir.model', 'Relational Model'
  • required_on_views Boolean
    help='If activated, the attribute will be mandatory on the views, but not in the database' args: 'Required (on views)'
  • sequence Integer
    help="The attribute's order in his group" args: 'Sequence in Group'
  • sequence_group Integer
    help='The sequence of the group' related='attribute_group_id.sequence' store='True' args: 'Sequence of the Group'
  • serialized Boolean
    help="If serialized, the attribute's field will be stored in the serialization\n field 'x_custom_json_attrs' (i.e. a JSON containing all the serialized\n fields values) instead of creating a new SQL column for this\n attribute's field. Useful to increase speed requests if creating a\n high number of attributes." args: 'Serialized'
  • widget Char
    help='Specify widget to add to the field on the views.'
Public methods (10)
  • button_add_options(self)
  • create(self, vals)
    @api.model
    Create an attribute.attribute - In case of a new "custom" attribute, a new field object 'ir.model.fields' will be created as this model "_inherits" 'ir.model.fields'. So we need to add here the mandatory 'ir.model.fields' instance's attributes to the new 'attribute.attribute'. - In case of a new "native" attribute, it will be linked to an existing field object 'ir.model.fields' (through "field_id") that cannot be modified. That's why we remove all the 'ir.model.fields' instance's attributes values from `vals` before creating our new 'attribute.attribute'.
  • domain_change(self)
    @api.onchange('domain')
  • onchange_attribute_type(self)
    @api.onchange('attribute_type')
  • onchange_field_description(self)
    @api.onchange('field_description')
  • onchange_model_id(self)
    @api.onchange('model_id')
  • onchange_name(self)
    @api.onchange('name')
  • relation_model_id_change(self)
    @api.onchange('relation_model_id')
    Remove selected options as they would be inconsistent
  • unlink(self)
    Delete the Attribute's related field when deleting a custom Attribute
  • write(self, vals)

New fields (4)
  • attribute_ids One2many → attribute.attribute
    args: 'attribute.attribute', 'attribute_group_id', 'Attributes'
  • model_id Many2one → ir.model
    required=True args: 'ir.model', 'Model'
  • name Char
    required=True size=128 translate=True args: 'Name'
  • sequence Integer
    help="The Group order in his attribute's Set" args: 'Sequence in Set'
Public methods (0)

No public methods.

New fields (5)
  • attribute_id Many2one → attribute.attribute
    ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • name Char
    required=True translate=True args: 'Name'
  • relation_model_id Many2one → ir.model
    related='attribute_id.relation_model_id' args: 'ir.model', 'Relational Model'
  • sequence Integer
    args: 'Sequence'
  • value_ref Reference
    args: _get_model_list, 'Reference'
Public methods (1)
  • name_change(self)
    @api.onchange('name')
    Prevent the user from adding manually an option to m2o or m2m Attributes linked to another model (through 'relation_model_id')

New fields (1)
  • attribute_id Many2one → attribute.attribute
    default=<expr> ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
Public methods (3)
  • create(self, vals)
    @api.model
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • validate(self)

New fields (3)
  • attribute_ids Many2many → attribute.attribute
    column1='attribute_set_id' column2='attribute_id' comodel_name='attribute.attribute' relation='rel_attribute_set' string='Attributes'
  • model_id Many2one → ir.model
    required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (1)
  • attribute_set_id Many2one → attribute.set
    args: 'attribute.set', 'Attribute Set'
Public methods (2)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • remove_native_fields(self, eview)
    @api.model
    Remove native fields related to native attributes from eview
REPOSITORY
REPOSITORYOCA/odoo-pim
GIT
GIThttps://github.com/OCA/odoo-pim.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/odoo-pim/tree/12.0/attribute_set
VERSION
VERSION 0.0.3
CATEGORY
CATEGORYGeneric Modules/Others
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Akretion
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Akretion
COMMITTERS
COMMITTERSStéphane Bidoul, Cédric Pigeon, OCA-git-bot, Simone Orsi, clementmbr, shopinvader-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/odoo-pim
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:14
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES unidecode
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
attribute_attribute_form_view attribute.attribute.form attribute.attribute form New
attribute_attribute_tree_view attribute.attribute.tree attribute.attribute tree New
attribute_group_form_view attribute.group form New
attribute_group_search_view attribute.group search New
attribute_group_tree_view attribute.group tree New
attribute_option_form_popup_view attribute.option.form.popup attribute.option form New
attribute_option_form_view attribute.option.form attribute.option form New
attribute_option_tree_view attribute.option.tree attribute.option tree New
attribute_option_wizard_form_view attribute.option.wizard attribute.option.wizard form New
attribute_set_form_view attribute.set.form attribute.set form New
attribute_set_tree_view attribute.set.tree attribute.set tree New
view_attribute_attribute_search attribute.attribute.list attribute.attribute search New
view_attribute_option_search attribute.option.list attribute.option search New
view_attribute_set_search attribute.set.list attribute.set search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (6)

New fields (12)
  • attribute_group_id Many2one → attribute.group
    ondelete='cascade' required=True args: 'attribute.group', 'Attribute Group'
  • attribute_set_ids Many2many → attribute.set
    column1='attribute_id' column2='attribute_set_id' comodel_name='attribute.set' relation='rel_attribute_set' string='Attribute Sets'
  • attribute_type Selection
    args: [('char', 'Char'), ('text', 'Text'), ('select', 'Select'), ('multiselect', 'Multiselect'), ('boolean', 'Boolean'), ('integer', 'Integer'), ('date', 'Date'), ('datetime', 'Datetime'), ('binary', 'Binary'), ('float', 'Float')]
  • create_date Datetime
    readonly=True args: 'Created date'
  • field_id Many2one → ir.model.fields
    ondelete='cascade' required=True args: 'ir.model.fields', 'Ir Model Fields'
  • nature Selection
    default='custom' required=True store=True string='Attribute Nature' args: [('custom', 'Custom'), ('native', 'Native')]
  • option_ids One2many → attribute.option
    args: 'attribute.option', 'attribute_id', 'Attribute Options'
  • relation_model_id Many2one → ir.model
    args: 'ir.model', 'Relational Model'
  • required_on_views Boolean
    help='If activated, the attribute will be mandatory on the views, but not in the database' args: 'Required (on views)'
  • sequence Integer
    help="The attribute's order in his group" args: 'Sequence in Group'
  • sequence_group Integer
    help='The sequence of the group' related='attribute_group_id.sequence' store='True' args: 'Sequence of the Group'
  • serialized Boolean
    help="If serialized, the attribute's field will be stored in the serialization\n field 'x_custom_json_attrs' (i.e. a JSON containing all the serialized fields\n values) instead of creating a new SQL column for this attribute's field.\n Useful to increase speed requests if creating a high number of attributes." args: 'Serialized'
Public methods (9)
  • button_add_options(self)
  • create(self, vals)
    @api.model
    Create an attribute.attribute - In case of a new "custom" attribute, a new field object 'ir.model.fields' will be created as this model "_inherits" 'ir.model.fields'. So we need to add here the mandatory 'ir.model.fields' instance's attributes to the new 'attribute.attribute'. - In case of a new "native" attribute, it will be linked to an existing field object 'ir.model.fields' (through "field_id") that cannot be modified. That's why we remove all the 'ir.model.fields' instance's attributes values from `vals` before creating our new 'attribute.attribute'.
  • domain_change(self)
    @api.onchange('domain')
  • onchange_field_description(self)
    @api.onchange('field_description')
  • onchange_model_id(self)
    @api.onchange('model_id')
  • onchange_name(self)
    @api.onchange('name')
  • relation_model_id_change(self)
    @api.onchange('relation_model_id')
    Remove selected options as they would be inconsistent
  • unlink(self)
    Delete the Attribute's related field when deleting a custom Attribute
  • write(self, vals)

New fields (4)
  • attribute_ids One2many → attribute.attribute
    args: 'attribute.attribute', 'attribute_group_id', 'Attributes'
  • model_id Many2one → ir.model
    required=True args: 'ir.model', 'Model'
  • name Char
    required=True size=128 translate=True args: 'Name'
  • sequence Integer
    help="The Group order in his attribute's Set" args: 'Sequence in Set'
Public methods (0)

No public methods.

New fields (5)
  • attribute_id Many2one → attribute.attribute
    ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • name Char
    required=True translate=True args: 'Name'
  • relation_model_id Many2one → ir.model
    related='attribute_id.relation_model_id' args: 'ir.model', 'Relational Model'
  • sequence Integer
    args: 'Sequence'
  • value_ref Reference
    args: _get_model_list, 'Reference'
Public methods (1)
  • name_change(self)
    @api.onchange('name')
    Prevent the user from adding manually an option to m2o or m2m Attributes linked to another model (through 'relation_model_id')

New fields (1)
  • attribute_id Many2one → attribute.attribute
    default=<expr> ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
Public methods (3)
  • create(self, vals)
    @api.model
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • validate(self)

New fields (3)
  • attribute_ids Many2many → attribute.attribute
    column1='attribute_set_id' column2='attribute_id' comodel_name='attribute.attribute' relation='rel_attribute_set' string='Attributes'
  • model_id Many2one → ir.model
    required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (1)
  • attribute_set_id Many2one → attribute.set
    args: 'attribute.set', 'Attribute Set'
Public methods (2)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • remove_native_fields(self, eview)
    @api.model
    Remove native fields related to native attributes from eview
REPOSITORY
REPOSITORYOCA/odoo-pim
GIT
GIThttps://github.com/OCA/odoo-pim.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/odoo-pim/tree/10.0/attribute_set
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYGeneric Modules/Others
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSAkretion
MAINTAINERS
MAINTAINERSAkretion
COMMITTERS
COMMITTERSStéphane Bidoul, Denis Roussel, OCA-git-bot, shopinvader-git-bot
WEBSITE
WEBSITEhttps://github.com/shopinvader/odoo-pim
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:19:54
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES unidecode
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (14)
XML IDNameModelTypeStatus
attribute_attribute_form_view attribute.attribute.form attribute.attribute form New
attribute_attribute_tree_view attribute.attribute.tree attribute.attribute tree New
attribute_group_form_view attribute.group form New
attribute_group_search_view attribute.group search New
attribute_group_tree_view attribute.group tree New
attribute_option_form_popup_view attribute.option.form.popup attribute.option form New
attribute_option_form_view attribute.option.form attribute.option form New
attribute_option_tree_view attribute.option.tree attribute.option tree New
attribute_option_wizard_form_view attribute.option.wizard attribute.option.wizard form New
attribute_set_form_view attribute.set.form attribute.set form New
attribute_set_tree_view attribute.set.tree attribute.set tree New
view_attribute_attribute_search attribute.attribute.list attribute.attribute search New
view_attribute_option_search attribute.option.list attribute.option search New
view_attribute_set_search attribute.set.list attribute.set search New
HTTP endpoints (0)

No HTTP endpoints found for this module.

Models touched (6)

New fields (13)
  • attribute_group_id Many2one → attribute.group
    ondelete='cascade' required=True args: 'attribute.group', 'Attribute Group'
  • attribute_set_ids Many2many → attribute.set
    column1='attribute_id' column2='attribute_set_id' comodel_name='attribute.set' relation='rel_attribute_set' string='Attribute Sets'
  • attribute_type Selection
    args: [('char', 'Char'), ('text', 'Text'), ('select', 'Select'), ('multiselect', 'Multiselect'), ('boolean', 'Boolean'), ('integer', 'Integer'), ('date', 'Date'), ('datetime', 'Datetime'), ('binary', 'Binary'), ('float', 'Float')]
  • copy Boolean
  • create_date Datetime
    readonly=True args: 'Created date'
  • field_id Many2one → ir.model.fields
    ondelete='cascade' required=True args: 'ir.model.fields', 'Ir Model Fields'
  • nature Selection
    default='custom' required=True store=True string='Attribute Nature' args: [('custom', 'Custom'), ('native', 'Native')]
  • option_ids One2many → attribute.option
    args: 'attribute.option', 'attribute_id', 'Attribute Options'
  • relation_model_id Many2one → ir.model
    args: 'ir.model', 'Relational Model'
  • required_on_views Boolean
    help='If activated, the attribute will be mandatory on the views, but not in the database' args: 'Required (on views)'
  • sequence Integer
    help="The attribute's order in his group" args: 'Sequence in Group'
  • sequence_group Integer
    help='The sequence of the group' related='attribute_group_id.sequence' store='True' args: 'Sequence of the Group'
  • serialized Boolean
    help="If serialized, the attribute's field will be stored in the\n serialization field 'x_custom_json_attrs' (i.e. a JSON containing\n all the serialized fields values) instead of creating a new SQL\n column for this attribute's field. Useful to increase speed\n requests if creating a high number of attributes." args: 'Serialized'
Public methods (9)
  • button_add_options(self)
  • create(self, vals)
    @api.model
    Create an attribute.attribute - In case of a new "custom" attribute, a new field object 'ir.model.fields' will be created as this model "_inherits" 'ir.model.fields'. So we need to add here the mandatory 'ir.model.fields' instance's attributes to the new 'attribute.attribute'. - In case of a new "native" attribute, it will be linked to an existing field object 'ir.model.fields' (through "field_id") that cannot be modified. That's why we remove all the 'ir.model.fields' instance's attributes values from `vals` before creating our new 'attribute.attribute'.
  • domain_change(self)
    @api.onchange('domain')
  • onchange_field_description(self)
    @api.onchange('field_description')
  • onchange_model_id(self)
    @api.onchange('model_id')
  • onchange_name(self)
    @api.onchange('name')
  • relation_model_id_change(self)
    @api.onchange('relation_model_id')
    Remove selected options as they would be inconsistent
  • unlink(self)
    @api.multi
    Delete the Attribute's related field when deleting a custom Attribute
  • write(self, vals)
    @api.multi

New fields (4)
  • attribute_ids One2many → attribute.attribute
    args: 'attribute.attribute', 'attribute_group_id', 'Attributes'
  • model_id Many2one → ir.model
    required=True args: 'ir.model', 'Model'
  • name Char
    required=True size=128 translate=True args: 'Name'
  • sequence Integer
    help="The Group order in his attribute's Set" args: 'Sequence in Set'
Public methods (0)

No public methods.

New fields (5)
  • attribute_id Many2one → attribute.attribute
    ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
  • name Char
    required=True translate=True args: 'Name'
  • relation_model_id Many2one → ir.model
    related='attribute_id.relation_model_id' args: 'ir.model', 'Relational Model'
  • sequence Integer
    args: 'Sequence'
  • value_ref Reference
    selection=<expr> string='Reference'
Public methods (1)
  • name_change(self)
    @api.onchange('name')
    Prevent the user from adding manually an option to m2o or m2m Attributes linked to another model (through 'relation_model_id')

New fields (1)
  • attribute_id Many2one → attribute.attribute
    default=<expr> ondelete='cascade' required=True args: 'attribute.attribute', 'Product Attribute'
Public methods (3)
  • create(self, vals)
    @api.model
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • validate(self)

New fields (3)
  • attribute_ids Many2many → attribute.attribute
    column1='attribute_set_id' column2='attribute_id' comodel_name='attribute.attribute' relation='rel_attribute_set' string='Attributes'
  • model_id Many2one → ir.model
    required=True args: 'ir.model', 'Model'
  • name Char
    required=True translate=True args: 'Name'
Public methods (0)

No public methods.

New fields (1)
  • attribute_set_id Many2one → attribute.set
    args: 'attribute.set', 'Attribute Set'
Public methods (2)
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    @api.model
  • remove_native_fields(self, eview)
    @api.model
    Remove native fields related to native attributes from eview