Base Custom Info

base_custom_info
REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/15.0/base_custom_info
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Rad0van
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:38
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (23)
XML IDNameModelTypeStatus
custom_info_category_form custom.info.category form New
custom_info_category_search custom.info.category search New
custom_info_category_tree custom.info.category tree New
custom_info_option_form custom.info.option form New
custom_info_option_form_full custom.info.option field Inherits custom_info_option_form
custom_info_option_search custom.info.option search New
custom_info_option_tree custom.info.option tree New
custom_info_option_tree_full custom.info.option tree Inherits custom_info_option_tree
custom_info_property_form custom.info.property form New
custom_info_property_form_full custom.info.property field Inherits custom_info_property_form
custom_info_property_search custom.info.property search New
custom_info_property_tree custom.info.property tree New
custom_info_property_tree_full custom.info.property field Inherits custom_info_property_tree
custom_info_template_form custom.info.template form New
custom_info_template_search custom.info.template search New
custom_info_template_tree custom.info.template tree New
custom_info_value_editable custom.info.value custom_info New
custom_info_value_form custom.info.value form New
custom_info_value_search custom.info.value search New
custom_info_value_tree custom.info.value tree New
custom_info_value_tree_editable custom.info.value tree Inherits custom_info_value_tree
res_config_settings_view_form Allow to enable custom information res.config.settings xpath Inherits base_setup.res_config_settings_view_form
view_partner_form res.partner xpath Inherits base.view_partner_form
Models touched (10)

New fields (2)
  • custom_info_ids One2many → custom.info.value
    auto_join=True comodel_name='custom.info.value' domain=<expr> inverse_name='res_id' string='Custom Properties'
  • custom_info_template_id Many2one → custom.info.template
    comodel_name='custom.info.template' domain=<expr> string='Custom Information Template'
Public methods (4)
  • all_custom_info_templates(self)
    Get all custom info templates involved in these owners.
  • get_custom_info_value(self, properties)
    @api.returns('custom.info.value')
    Get ``custom.info.value`` records for the given property.
  • onchange(self, values, field_name, field_onchange)
  • unlink(self)
    Remove linked custom info this way, as can't be handled automatically.

New fields (3)
  • name Char
    index=True required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' help='Properties in this category.' inverse_name='category_id' string='Properties'
  • sequence Integer
    index=True
Public methods (1)
  • check_access_rule(self, operation)
    You access a category if you access at least one property.

New fields (4)
  • name Char
    index=True required=True translate=True
  • property_ids Many2many → custom.info.property
    comodel_name='custom.info.property' help='Properties where this option is enabled.' string='Properties'
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' help='Additional template to be applied to the owner if this option is chosen.' string='Additional template'
  • value_ids One2many → custom.info.value
    comodel_name='custom.info.value' help='Values that have set this option.' inverse_name='value_id' string='Values'
Public methods (1)
  • check_access_rule(self, operation)
    You access an option if you access at least one property.

New fields (14)
  • category_id Many2one → custom.info.category
    comodel_name='custom.info.category' string='Category'
  • category_sequence Integer
    readonly=True related='category_id.sequence' store=True string='Category Sequence'
  • default_value Char
    help='Will be applied by default to all custom values of this property. This is a char field, so you have to enter some value that can be converted to the field type you choose.' translate=True
  • field_type Selection
    compute='_compute_field_type' selection=[('str', 'Text'), ('int', 'Whole number'), ('float', 'Decimal number'), ('bool', 'Yes/No'), ('date', 'Date'), ('id', 'Selection')] store=True
  • info_value_ids One2many → custom.info.value
    comodel_name='custom.info.value' inverse_name='property_id' string='Property Values'
  • maximum Float
    default=-1 help='For numeric fields, it means the maximum possible value; for text fields, it means the maximum possible length. If it is smaller than the minimum, then this check is skipped'
  • minimum Float
    help='For numeric fields, it means the minimum possible value; for text fields, it means the minimum possible length. If it is bigger than the maximum, then this check is skipped'
  • model Char
    related='template_id.model'
  • name Char
    required=True translate=True
  • option_ids Many2many → custom.info.option
    comodel_name='custom.info.option' help="When the field type is 'selection', choose the available options here." string='Options'
  • required Boolean
  • sequence Integer
    index=True
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' ondelete='cascade' required=True string='Template'
  • widget Selection
    default='char' help='Type of information that can be stored in the property.' required=True selection=[('boolean', 'Boolean'), ('float', 'Decimal'), ('integer', 'Integer'), ('date', 'Date'), ('char', 'Single line text'), ('text', 'Multi line Text'), ('html', 'Complex text'), ('many2one', 'Choice')]
Public methods (1)
  • check_access_rule(self, operation)
    You access a property if you access its template.

New fields (4)
  • model Char
    compute='_compute_model' inverse='_inverse_model' search='_search_model' string='Model technical name'
  • model_id Many2one → ir.model
    auto_join=True comodel_name='ir.model' ondelete='cascade' required=True string='Model'
  • name Char
    required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' inverse_name='template_id' string='Properties'
Public methods (2)
  • check_access_rule(self, operation)
    You access a template if you access its model.
  • write(self, vals)

New fields (19)
  • category_id Many2one
    related='property_id.category_id' store=True
  • category_sequence Integer
    related='property_id.category_id.sequence' store=True string='Category Sequence'
  • field_name Char
    compute='_compute_field_name' help='Technical name of the field where the value is stored.'
  • field_type Selection
    related='property_id.field_type'
  • model Char
    index=True readonly=True related='property_id.model' store=True
  • name Char
    related='property_id.name'
  • owner_id Reference
    compute='_compute_owner_id' help='Record that owns this custom value.' inverse='_inverse_owner_id' selection='_selection_owner_id' string='Owner'
  • property_id Many2one → custom.info.property
    comodel_name='custom.info.property' required=True string='Property'
  • property_sequence Integer
    index=True related='property_id.sequence' store=True
  • required Boolean
    related='property_id.required'
  • res_id Integer
    index=True required=True string='Resource ID'
  • value Char
    compute='_compute_value' help='Value, always converted to/from the typed field.' inverse='_inverse_value' search='_search_value'
  • value_bool Boolean
    index=True string='Yes/No value'
  • value_date Date
    index=True string='Date value'
  • value_float Float
    index=True string='Decimal number value'
  • value_id Many2one → custom.info.option
    comodel_name='custom.info.option' domain="[('property_ids', '=', property_id)]" ondelete='cascade' string='Selection value'
  • value_int Integer
    index=True string='Whole number value'
  • value_str Char
    index=True string='Text value' translate=True
  • widget Selection
    readonly=True related='property_id.widget'
Public methods (1)
  • check_access_rule(self, operation)
    You access a value if you access its owner record.

New fields (1)
  • view_mode Selection
    ondelete={'custom_info': 'cascade'} selection_add=[('custom_info', 'Custom Info')]
Public methods (0)

No public methods.

New fields (1)
  • type Selection
    ondelete={'custom_info': 'cascade'} selection_add=[('custom_info', 'Custom Info')]
Public methods (0)

No public methods.

New fields (2)
  • group_custom_info_manager Boolean
    help='Allow all employees to manage custom information' implied_group='base_custom_info.group_basic' string='Manage custom information'
  • group_custom_info_partner Boolean
    help='Add a tab in the partners form to edit custom information' implied_group='base_custom_info.group_partner' string='Edit custom information in partners'
Public methods (0)

No public methods.

New fields (2)
  • custom_info_ids One2many
    context={'default_model': _name}
  • custom_info_template_id Many2one
    context={'default_model': _name}
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/14.0/base_custom_info
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSEnric Tobella, OCA Transbot, oca-travis, Weblate, OCA-git-bot, oca-ci, Kitti U, oca-git-bot, Henrik Norlin
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:05
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
assets_backend Backend Assets (used in backend interface) ir.ui.view qweb Inherits web.assets_backend
custom_info_category_form custom.info.category form New
custom_info_category_search custom.info.category search New
custom_info_category_tree custom.info.category tree New
custom_info_option_form custom.info.option form New
custom_info_option_form_full custom.info.option field Inherits custom_info_option_form
custom_info_option_search custom.info.option search New
custom_info_option_tree custom.info.option tree New
custom_info_option_tree_full custom.info.option tree Inherits custom_info_option_tree
custom_info_property_form custom.info.property form New
custom_info_property_form_full custom.info.property field Inherits custom_info_property_form
custom_info_property_search custom.info.property search New
custom_info_property_tree custom.info.property tree New
custom_info_property_tree_full custom.info.property field Inherits custom_info_property_tree
custom_info_template_form custom.info.template form New
custom_info_template_search custom.info.template search New
custom_info_template_tree custom.info.template tree New
custom_info_value_editable custom.info.value custom_info New
custom_info_value_form custom.info.value form New
custom_info_value_search custom.info.value search New
custom_info_value_tree custom.info.value tree New
custom_info_value_tree_editable custom.info.value tree Inherits custom_info_value_tree
res_config_settings_view_form Allow to enable custom information res.config.settings xpath Inherits base_setup.res_config_settings_view_form
view_partner_form res.partner xpath Inherits base.view_partner_form
Models touched (10)

New fields (2)
  • custom_info_ids One2many → custom.info.value
    auto_join=True comodel_name='custom.info.value' domain=<expr> inverse_name='res_id' string='Custom Properties'
  • custom_info_template_id Many2one → custom.info.template
    comodel_name='custom.info.template' domain=<expr> string='Custom Information Template'
Public methods (6)
  • all_custom_info_templates(self)
    Get all custom info templates involved in these owners.
  • get_custom_info(self, property=None, code=None, option_field='display_name')
    Get the value of the given property or code.
  • get_custom_info_property_by_code(self, code)
  • get_custom_info_value(self, properties)
    @api.returns('custom.info.value')
    Get ``custom.info.value`` records for the given property.
  • onchange(self, values, field_name, field_onchange)
  • unlink(self)
    Remove linked custom info this way, as can't be handled automatically.

New fields (3)
  • name Char
    index=True required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' help='Properties in this category.' inverse_name='category_id' string='Properties'
  • sequence Integer
    index=True
Public methods (1)
  • check_access_rule(self, operation)
    You access a category if you access at least one property.

New fields (5)
  • code Char
  • name Char
    index=True required=True translate=True
  • property_ids Many2many → custom.info.property
    comodel_name='custom.info.property' help='Properties where this option is enabled.' string='Properties'
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' help='Additional template to be applied to the owner if this option is chosen.' string='Additional template'
  • value_ids One2many → custom.info.value
    comodel_name='custom.info.value' help='Values that have set this option.' inverse_name='value_id' string='Values'
Public methods (1)
  • check_access_rule(self, operation)
    You access an option if you access at least one property.

New fields (15)
  • category_id Many2one → custom.info.category
    comodel_name='custom.info.category' string='Category'
  • category_sequence Integer
    readonly=True related='category_id.sequence' store=True string='Category Sequence'
  • code Char
  • default_value Char
    help='Will be applied by default to all custom values of this property. This is a char field, so you have to enter some value that can be converted to the field type you choose.' translate=True
  • field_type Selection
    compute='_compute_field_type' selection=[('str', 'Text'), ('int', 'Whole number'), ('float', 'Decimal number'), ('bool', 'Yes/No'), ('date', 'Date'), ('id', 'Selection')] store=True
  • info_value_ids One2many → custom.info.value
    comodel_name='custom.info.value' inverse_name='property_id' string='Property Values'
  • maximum Float
    default=-1 help='For numeric fields, it means the maximum possible value; for text fields, it means the maximum possible length. If it is smaller than the minimum, then this check is skipped'
  • minimum Float
    help='For numeric fields, it means the minimum possible value; for text fields, it means the minimum possible length. If it is bigger than the maximum, then this check is skipped'
  • model Char
    related='template_id.model'
  • name Char
    required=True translate=True
  • option_ids Many2many → custom.info.option
    comodel_name='custom.info.option' help="When the field type is 'selection', choose the available options here." string='Options'
  • required Boolean
  • sequence Integer
    index=True
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' ondelete='cascade' required=True string='Template'
  • widget Selection
    default='char' help='Type of information that can be stored in the property.' required=True selection=[('boolean', 'Boolean'), ('float', 'Decimal'), ('integer', 'Integer'), ('date', 'Date'), ('char', 'Single line text'), ('text', 'Multi line Text'), ('html', 'Complex text'), ('many2one', 'Choice')]
Public methods (1)
  • check_access_rule(self, operation)
    You access a property if you access its template.

New fields (4)
  • model Char
    compute='_compute_model' inverse='_inverse_model' search='_search_model' string='Model technical name'
  • model_id Many2one → ir.model
    auto_join=True comodel_name='ir.model' ondelete='cascade' required=True string='Model'
  • name Char
    required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' inverse_name='template_id' string='Properties'
Public methods (2)
  • check_access_rule(self, operation)
    You access a template if you access its model.
  • write(self, vals)

New fields (20)
  • category_id Many2one
    related='property_id.category_id' store=True
  • category_sequence Integer
    related='property_id.category_id.sequence' store=True string='Category Sequence'
  • code Char
    related='property_id.code'
  • field_name Char
    compute='_compute_field_name' help='Technical name of the field where the value is stored.'
  • field_type Selection
    related='property_id.field_type'
  • model Char
    index=True readonly=True related='property_id.model' store=True
  • name Char
    related='property_id.name'
  • owner_id Reference
    compute='_compute_owner_id' help='Record that owns this custom value.' inverse='_inverse_owner_id' selection='_selection_owner_id' string='Owner'
  • property_id Many2one → custom.info.property
    comodel_name='custom.info.property' required=True string='Property'
  • property_sequence Integer
    index=True related='property_id.sequence' store=True
  • required Boolean
    related='property_id.required'
  • res_id Integer
    index=True required=True string='Resource ID'
  • value Char
    compute='_compute_value' help='Value, always converted to/from the typed field.' inverse='_inverse_value' search='_search_value'
  • value_bool Boolean
    index=True string='Yes/No value'
  • value_date Date
    index=True string='Date value'
  • value_float Float
    index=True string='Decimal number value'
  • value_id Many2one → custom.info.option
    comodel_name='custom.info.option' domain="[('property_ids', '=', property_id)]" ondelete='cascade' string='Selection value'
  • value_int Integer
    index=True string='Whole number value'
  • value_str Char
    index=True string='Text value' translate=True
  • widget Selection
    readonly=True related='property_id.widget'
Public methods (1)
  • check_access_rule(self, operation)
    You access a value if you access its owner record.

New fields (1)
  • view_mode Selection
    ondelete={'custom_info': 'cascade'} selection_add=[('custom_info', 'Custom Info')]
Public methods (0)

No public methods.

New fields (1)
  • type Selection
    ondelete={'custom_info': 'cascade'} selection_add=[('custom_info', 'Custom Info')]
Public methods (0)

No public methods.

New fields (2)
  • group_custom_info_manager Boolean
    help='Allow all employees to manage custom information' implied_group='base_custom_info.group_basic' string='Manage custom information'
  • group_custom_info_partner Boolean
    help='Add a tab in the partners form to edit custom information' implied_group='base_custom_info.group_partner' string='Edit custom information in partners'
Public methods (0)

No public methods.

New fields (2)
  • custom_info_ids One2many
    context={'default_model': _name}
  • custom_info_template_id Many2one
    context={'default_model': _name}
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/13.0/base_custom_info
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSStefan Rijnhart, Enric Tobella, David Alonso, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Rad0van
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:16
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
assets_backend Backend Assets (used in backend interface) ir.ui.view qweb Inherits web.assets_backend
custom_info_category_form custom.info.category form New
custom_info_category_search custom.info.category search New
custom_info_category_tree custom.info.category tree New
custom_info_option_form custom.info.option form New
custom_info_option_form_full custom.info.option field Inherits custom_info_option_form
custom_info_option_search custom.info.option search New
custom_info_option_tree custom.info.option tree New
custom_info_option_tree_full custom.info.option tree Inherits custom_info_option_tree
custom_info_property_form custom.info.property form New
custom_info_property_form_full custom.info.property field Inherits custom_info_property_form
custom_info_property_search custom.info.property search New
custom_info_property_tree custom.info.property tree New
custom_info_property_tree_full custom.info.property field Inherits custom_info_property_tree
custom_info_template_form custom.info.template form New
custom_info_template_search custom.info.template search New
custom_info_template_tree custom.info.template tree New
custom_info_value_editable custom.info.value custom_info New
custom_info_value_form custom.info.value form New
custom_info_value_search custom.info.value search New
custom_info_value_tree custom.info.value tree New
custom_info_value_tree_editable custom.info.value tree Inherits custom_info_value_tree
res_config_settings_view_form Allow to enable custom information res.config.settings xpath Inherits base_setup.res_config_settings_view_form
view_partner_form res.partner xpath Inherits base.view_partner_form
Models touched (10)

New fields (2)
  • custom_info_ids One2many → custom.info.value
    auto_join=True comodel_name='custom.info.value' domain=<expr> inverse_name='res_id' string='Custom Properties'
  • custom_info_template_id Many2one → custom.info.template
    comodel_name='custom.info.template' domain=<expr> string='Custom Information Template'
Public methods (4)
  • all_custom_info_templates(self)
    Get all custom info templates involved in these owners.
  • get_custom_info_value(self, properties)
    @api.returns('custom.info.value')
    Get ``custom.info.value`` records for the given property.
  • onchange(self, values, field_name, field_onchange)
  • unlink(self)
    Remove linked custom info this way, as can't be handled automatically.

New fields (3)
  • name Char
    index=True required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' help='Properties in this category.' inverse_name='category_id' string='Properties'
  • sequence Integer
    index=True
Public methods (1)
  • check_access_rule(self, operation)
    You access a category if you access at least one property.

New fields (4)
  • name Char
    index=True required=True translate=True
  • property_ids Many2many → custom.info.property
    comodel_name='custom.info.property' help='Properties where this option is enabled.' string='Properties'
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' help='Additional template to be applied to the owner if this option is chosen.' string='Additional template'
  • value_ids One2many → custom.info.value
    comodel_name='custom.info.value' help='Values that have set this option.' inverse_name='value_id' string='Values'
Public methods (1)
  • check_access_rule(self, operation)
    You access an option if you access at least one property.

New fields (14)
  • category_id Many2one → custom.info.category
    comodel_name='custom.info.category' string='Category'
  • category_sequence Integer
    readonly=True related='category_id.sequence' store=True string='Category Sequence'
  • default_value Char
    help='Will be applied by default to all custom values of this property. This is a char field, so you have to enter some value that can be converted to the field type you choose.' translate=True
  • field_type Selection
    compute='_compute_field_type' selection=[('str', 'Text'), ('int', 'Whole number'), ('float', 'Decimal number'), ('bool', 'Yes/No'), ('date', 'Date'), ('id', 'Selection')] store=True
  • info_value_ids One2many → custom.info.value
    comodel_name='custom.info.value' inverse_name='property_id' string='Property Values'
  • maximum Float
    default=-1 help='For numeric fields, it means the maximum possible value; for text fields, it means the maximum possible length. If it is smaller than the minimum, then this check is skipped'
  • minimum Float
    help='For numeric fields, it means the minimum possible value; for text fields, it means the minimum possible length. If it is bigger than the maximum, then this check is skipped'
  • model Char
    auto_join=True related='template_id.model'
  • name Char
    required=True translate=True
  • option_ids Many2many → custom.info.option
    comodel_name='custom.info.option' help="When the field type is 'selection', choose the available options here." string='Options'
  • required Boolean
  • sequence Integer
    index=True
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' ondelete='cascade' required=True string='Template'
  • widget Selection
    default='char' help='Type of information that can be stored in the property.' required=True selection=[('boolean', 'Boolean'), ('float', 'Decimal'), ('integer', 'Integer'), ('date', 'Date'), ('char', 'Single line text'), ('text', 'Multi line Text'), ('html', 'Complex text'), ('many2one', 'Choice')]
Public methods (1)
  • check_access_rule(self, operation)
    You access a property if you access its template.

New fields (4)
  • model Char
    compute='_compute_model' inverse='_inverse_model' search='_search_model' string='Model technical name'
  • model_id Many2one → ir.model
    auto_join=True comodel_name='ir.model' ondelete='restrict' required=True string='Model'
  • name Char
    required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' inverse_name='template_id' string='Properties'
Public methods (2)
  • check_access_rule(self, operation)
    You access a template if you access its model.
  • write(self, vals)

New fields (19)
  • category_id Many2one
    related='property_id.category_id' store=True
  • category_sequence Integer
    related='property_id.category_id.sequence' store=True string='Category Sequence'
  • field_name Char
    compute='_compute_field_name' help='Technical name of the field where the value is stored.'
  • field_type Selection
    related='property_id.field_type'
  • model Char
    auto_join=True index=True readonly=True related='property_id.model' store=True
  • name Char
    related='property_id.name'
  • owner_id Reference
    compute='_compute_owner_id' help='Record that owns this custom value.' inverse='_inverse_owner_id' selection='_selection_owner_id' string='Owner'
  • property_id Many2one → custom.info.property
    comodel_name='custom.info.property' required=True string='Property'
  • property_sequence Integer
    index=True related='property_id.sequence' store=True
  • required Boolean
    related='property_id.required'
  • res_id Integer
    index=True ondelete='cascade' required=True string='Resource ID'
  • value Char
    compute='_compute_value' help='Value, always converted to/from the typed field.' inverse='_inverse_value' search='_search_value'
  • value_bool Boolean
    index=True string='Yes/No value'
  • value_date Date
    index=True string='Date value'
  • value_float Float
    index=True string='Decimal number value'
  • value_id Many2one → custom.info.option
    comodel_name='custom.info.option' domain="[('property_ids', '=', property_id)]" ondelete='cascade' string='Selection value'
  • value_int Integer
    index=True string='Whole number value'
  • value_str Char
    index=True string='Text value' translate=True
  • widget Selection
    readonly=True related='property_id.widget'
Public methods (1)
  • check_access_rule(self, operation)
    You access a value if you access its owner record.

New fields (1)
  • view_mode Selection
    selection_add=[('custom_info', 'Custom Info')]
Public methods (0)

No public methods.

New fields (1)
  • type Selection
    selection_add=[('custom_info', 'Custom Info')]
Public methods (0)

No public methods.

New fields (2)
  • group_custom_info_manager Boolean
    help='Allow all employees to manage custom information' implied_group='base_custom_info.group_basic' string='Manage custom information'
  • group_custom_info_partner Boolean
    help='Add a tab in the partners form to edit custom information' implied_group='base_custom_info.group_partner' string='Edit custom information in partners'
Public methods (0)

No public methods.

New fields (2)
  • custom_info_ids One2many
    context={'default_model': _name}
  • custom_info_template_id Many2one
    context={'default_model': _name}
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/12.0/base_custom_info
VERSION
VERSION 2.1.0
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, Enric Tobella, Alexandre Díaz, OCA Transbot, oca-travis, Weblate, OCA-git-bot, Adrià Gil Sorribes
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:22
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
assets_backend Backend Assets (used in backend interface) ir.ui.view qweb Inherits web.assets_backend
custom_info_category_form custom.info.category form New
custom_info_category_search custom.info.category search New
custom_info_category_tree custom.info.category tree New
custom_info_option_form custom.info.option form New
custom_info_option_form_full custom.info.option field Inherits custom_info_option_form
custom_info_option_search custom.info.option search New
custom_info_option_tree custom.info.option tree New
custom_info_option_tree_full custom.info.option tree Inherits custom_info_option_tree
custom_info_property_form custom.info.property form New
custom_info_property_form_full custom.info.property field Inherits custom_info_property_form
custom_info_property_search custom.info.property search New
custom_info_property_tree custom.info.property tree New
custom_info_property_tree_full custom.info.property field Inherits custom_info_property_tree
custom_info_template_form custom.info.template form New
custom_info_template_search custom.info.template search New
custom_info_template_tree custom.info.template tree New
custom_info_value_editable custom.info.value custom_info New
custom_info_value_form custom.info.value form New
custom_info_value_search custom.info.value search New
custom_info_value_tree custom.info.value tree New
custom_info_value_tree_editable custom.info.value tree Inherits custom_info_value_tree
res_config_settings_view_form Allow to enable custom information res.config.settings xpath Inherits base_setup.res_config_settings_view_form
view_partner_form res.partner xpath Inherits base.view_partner_form
Models touched (10)

New fields (2)
  • custom_info_ids One2many → custom.info.value
    auto_join=True comodel_name='custom.info.value' domain=<expr> inverse_name='res_id' string='Custom Properties'
  • custom_info_template_id Many2one → custom.info.template
    comodel_name='custom.info.template' domain=<expr> string='Custom Information Template'
Public methods (4)
  • all_custom_info_templates(self)
    @api.multi
    Get all custom info templates involved in these owners.
  • get_custom_info_value(self, properties)
    @api.multi@api.returns('custom.info.value')
    Get ``custom.info.value`` records for the given property.
  • onchange(self, values, field_name, field_onchange)
    @api.multi
  • unlink(self)
    @api.multi
    Remove linked custom info this way, as can't be handled automatically.

New fields (3)
  • name Char
    index=True required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' help='Properties in this category.' inverse_name='category_id' string='Properties'
  • sequence Integer
    index=True
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access a category if you access at least one property.

New fields (4)
  • name Char
    index=True required=True translate=True
  • property_ids Many2many → custom.info.property
    comodel_name='custom.info.property' help='Properties where this option is enabled.' string='Properties'
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' help='Additional template to be applied to the owner if this option is chosen.' string='Additional template'
  • value_ids One2many → custom.info.value
    comodel_name='custom.info.value' help='Values that have set this option.' inverse_name='value_id' string='Values'
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access an option if you access at least one property.

New fields (14)
  • category_id Many2one → custom.info.category
    comodel_name='custom.info.category' string='Category'
  • category_sequence Integer
    readonly=True related='category_id.sequence' store=True string='Category Sequence'
  • default_value Char
    help='Will be applied by default to all custom values of this property. This is a char field, so you have to enter some value that can be converted to the field type you choose.' translate=True
  • field_type Selection
    compute='_compute_field_type' selection=[('str', 'Text'), ('int', 'Whole number'), ('float', 'Decimal number'), ('bool', 'Yes/No'), ('date', 'Date'), ('id', 'Selection')] store=True
  • info_value_ids One2many → custom.info.value
    comodel_name='custom.info.value' inverse_name='property_id' string='Property Values'
  • maximum Float
    default=-1 help='For numeric fields, it means the maximum possible value; for text fields, it means the maximum possible length. If it is smaller than the minimum, then this check is skipped'
  • minimum Float
    help='For numeric fields, it means the minimum possible value; for text fields, it means the minimum possible length. If it is bigger than the maximum, then this check is skipped'
  • model Char
    auto_join=True readonly=True related='template_id.model'
  • name Char
    required=True translate=True
  • option_ids Many2many → custom.info.option
    comodel_name='custom.info.option' help="When the field type is 'selection', choose the available options here." string='Options'
  • required Boolean
  • sequence Integer
    index=True
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' ondelete='cascade' required=True string='Template'
  • widget Selection
    default='char' help='Type of information that can be stored in the property.' required=True selection=[('boolean', 'Boolean'), ('float', 'Decimal'), ('integer', 'Integer'), ('date', 'Date'), ('char', 'Single line text'), ('text', 'Multi line Text'), ('html', 'Complex text'), ('many2one', 'Choice')]
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access a property if you access its template.

New fields (4)
  • model Char
    compute='_compute_model' inverse='_inverse_model' search='_search_model' string='Model technical name'
  • model_id Many2one → ir.model
    auto_join=True comodel_name='ir.model' ondelete='restrict' required=True string='Model'
  • name Char
    required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' inverse_name='template_id' oldname='info_ids' string='Properties'
Public methods (2)
  • check_access_rule(self, operation)
    @api.multi
    You access a template if you access its model.
  • write(self, vals)
    @api.multi

New fields (19)
  • category_id Many2one
    readonly=True related='property_id.category_id' store=True
  • category_sequence Integer
    readonly=True related='property_id.category_id.sequence' store=True string='Category Sequence'
  • field_name Char
    compute='_compute_field_name' help='Technical name of the field where the value is stored.'
  • field_type Selection
    readonly=True related='property_id.field_type'
  • model Char
    auto_join=True compute_sudo=True index=True readonly=True related='property_id.model' store=True
  • name Char
    readonly=True related='property_id.name'
  • owner_id Reference
    compute='_compute_owner_id' compute_sudo=True help='Record that owns this custom value.' inverse='_inverse_owner_id' selection='_selection_owner_id' string='Owner'
  • property_id Many2one → custom.info.property
    comodel_name='custom.info.property' required=True string='Property'
  • property_sequence Integer
    index=True readonly=True related='property_id.sequence' store=True
  • required Boolean
    readonly=True related='property_id.required'
  • res_id Integer
    index=True ondelete='cascade' required=True store=True string='Resource ID'
  • value Char
    compute='_compute_value' help='Value, always converted to/from the typed field.' search='_search_value'
  • value_bool Boolean
    index=True string='Yes/No value'
  • value_date Date
    index=True string='Date value'
  • value_float Float
    index=True string='Decimal number value'
  • value_id Many2one → custom.info.option
    comodel_name='custom.info.option' domain="[('property_ids', '=', property_id)]" ondelete='cascade' string='Selection value'
  • value_int Integer
    index=True string='Whole number value'
  • value_str Char
    index=True string='Text value' translate=True
  • widget Selection
    readonly=True related='property_id.widget'
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access a value if you access its owner record.

New fields (1)
  • view_mode Selection
    selection_add=[('custom_info', 'Custom Info')]
Public methods (0)

No public methods.

New fields (1)
  • type Selection
    selection_add=[('custom_info', 'Custom Info')]
Public methods (0)

No public methods.

New fields (2)
  • group_custom_info_manager Boolean
    help='Allow all employees to manage custom information' implied_group='base_custom_info.group_basic' string='Manage custom information'
  • group_custom_info_partner Boolean
    help='Add a tab in the partners form to edit custom information' implied_group='base_custom_info.group_partner' string='Edit custom information in partners'
Public methods (0)

No public methods.

New fields (2)
  • custom_info_ids One2many
    context={'default_model': _name}
  • custom_info_template_id Many2one
    context={'default_model': _name}
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/10.0/base_custom_info
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, Laurent Mignon (ACSONE), oca-travis, Weblate, OCA-git-bot, Fanha Giang
WEBSITE
WEBSITEhttps://github.com/OCA/server-tools
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:19:59
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web_kanban
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (22)
XML IDNameModelTypeStatus
custom_info_category_form custom.info.category form New
custom_info_category_search custom.info.category search New
custom_info_category_tree custom.info.category tree New
custom_info_option_form custom.info.option form New
custom_info_option_form_full custom.info.option field Inherits custom_info_option_form
custom_info_option_search custom.info.option search New
custom_info_option_tree custom.info.option tree New
custom_info_option_tree_full custom.info.option tree Inherits custom_info_option_tree
custom_info_property_form custom.info.property form New
custom_info_property_form_full custom.info.property field Inherits custom_info_property_form
custom_info_property_search custom.info.property search New
custom_info_property_tree custom.info.property tree New
custom_info_property_tree_full custom.info.property field Inherits custom_info_property_tree
custom_info_template_form custom.info.template form New
custom_info_template_search custom.info.template search New
custom_info_template_tree custom.info.template tree New
custom_info_value_form custom.info.value form New
custom_info_value_search custom.info.value search New
custom_info_value_tree custom.info.value tree New
custom_info_value_tree_editable custom.info.value tree Inherits custom_info_value_tree
view_general_configuration Allow to enable partners custom info base.config.settings xpath Inherits base_setup.view_general_configuration
view_partner_form res.partner xpath Inherits base.view_partner_form
Models touched (8)

New fields (2)
  • group_custom_info_manager Boolean
    help='Allow all employees to manage custom information' implied_group='base_custom_info.group_basic' string='Manage custom information'
  • group_custom_info_partner Boolean
    help='Add a tab in the partners form to edit custom information' implied_group='base_custom_info.group_partner' string='Edit custom information in partners'
Public methods (0)

No public methods.

New fields (2)
  • custom_info_ids One2many → custom.info.value
    auto_join=True comodel_name='custom.info.value' domain=<expr> inverse_name='res_id' string='Custom Properties'
  • custom_info_template_id Many2one → custom.info.template
    comodel_name='custom.info.template' domain=<expr> string='Custom Information Template'
Public methods (4)
  • all_custom_info_templates(self)
    @api.multi
    Get all custom info templates involved in these owners.
  • get_custom_info_value(self, properties)
    @api.multi@api.returns('custom.info.value')
    Get ``custom.info.value`` records for the given property.
  • onchange(self, values, field_name, field_onchange)
    @api.multi
  • unlink(self)
    @api.multi
    Remove linked custom info this way, as can't be handled automatically.

New fields (3)
  • name Char
    index=True required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' help='Properties in this category.' inverse_name='category_id' string='Properties'
  • sequence Integer
    index=True
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access a category if you access at least one property.

New fields (4)
  • name Char
    index=True required=True translate=True
  • property_ids Many2many → custom.info.property
    comodel_name='custom.info.property' help='Properties where this option is enabled.' string='Properties'
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' help='Additional template to be applied to the owner if this option is chosen.' string='Additional template'
  • value_ids One2many → custom.info.value
    comodel_name='custom.info.value' help='Values that have set this option.' inverse_name='value_id' string='Values'
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access an option if you access at least one property.

New fields (13)
  • category_id Many2one → custom.info.category
    comodel_name='custom.info.category' string='Category'
  • category_sequence Integer
    readonly=True related='category_id.sequence' store=True
  • default_value Char
    help='Will be applied by default to all custom values of this property. This is a char field, so you have to enter some value that can be converted to the field type you choose.' translate=True
  • field_type Selection
    default='str' help='Type of information that can be stored in the property.' required=True selection=[('str', 'Text'), ('int', 'Whole number'), ('float', 'Decimal number'), ('bool', 'Yes/No'), ('id', 'Selection')]
  • info_value_ids One2many → custom.info.value
    comodel_name='custom.info.value' inverse_name='property_id' string='Property Values'
  • maximum Float
    default=-1 help='For numeric fields, it means the maximum possible value; for text fields, it means the maximum possible length. If it is smaller than the minimum, then this check is skipped'
  • minimum Float
    help='For numeric fields, it means the minimum possible value; for text fields, it means the minimum possible length. If it is bigger than the maximum, then this check is skipped'
  • model Char
    auto_join=True readonly=True related='template_id.model'
  • name Char
    required=True translate=True
  • option_ids Many2many → custom.info.option
    comodel_name='custom.info.option' help="When the field type is 'selection', choose the available options here." string='Options'
  • required Boolean
  • sequence Integer
    index=True
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' ondelete='cascade' required=True string='Template'
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access a property if you access its template.

New fields (4)
  • model Char
    compute='_compute_model' inverse='_inverse_model' search='_search_model' string='Model technical name'
  • model_id Many2one → ir.model
    auto_join=True comodel_name='ir.model' ondelete='restrict' required=True string='Model'
  • name Char
    required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' inverse_name='template_id' oldname='info_ids' string='Properties'
Public methods (2)
  • check_access_rule(self, operation)
    @api.multi
    You access a template if you access its model.
  • write(self, vals)
    @api.multi

New fields (17)
  • category_id Many2one
    readonly=True related='property_id.category_id' store=True
  • category_sequence Integer
    readonly=True related='property_id.category_id.sequence' store=True
  • field_name Char
    compute='_compute_field_name' help='Technical name of the field where the value is stored.'
  • field_type Selection
    readonly=True related='property_id.field_type'
  • model Char
    auto_join=True index=True readonly=True related='property_id.model' store=True
  • name Char
    readonly=True related='property_id.name'
  • owner_id Reference
    compute='_compute_owner_id' help='Record that owns this custom value.' inverse='_inverse_owner_id' selection='_selection_owner_id' string='Owner'
  • property_id Many2one → custom.info.property
    comodel_name='custom.info.property' readonly=True required=True string='Property'
  • property_sequence Integer
    index=True readonly=True related='property_id.sequence' store=True
  • required Boolean
    readonly=True related='property_id.required'
  • res_id Integer
    index=True ondelete='cascade' required=True store=True string='Resource ID'
  • value Char
    compute='_compute_value' help='Value, always converted to/from the typed field.' inverse='_inverse_value' search='_search_value'
  • value_bool Boolean
    index=True string='Yes/No value'
  • value_float Float
    index=True string='Decimal number value'
  • value_id Many2one → custom.info.option
    comodel_name='custom.info.option' domain="[('property_ids', 'in', [property_id])]" ondelete='cascade' string='Selection value'
  • value_int Integer
    index=True string='Whole number value'
  • value_str Char
    index=True string='Text value' translate=True
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access a value if you access its owner record.

New fields (2)
  • custom_info_ids One2many
    context={'default_model': _name}
  • custom_info_template_id Many2one
    context={'default_model': _name}
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/9.0/base_custom_info
VERSION
VERSION 2.0.0
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSPedro M. Baeza, GitHub, Jairo Llopis, Stéphane Bidoul (ACSONE), OCA Transbot, oca-travis, Weblate
WEBSITE
WEBSITEhttps://www.tecnativa.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:15:22
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_setup
    - base
    - web_kanban
    - web
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (22)
XML IDNameModelTypeStatus
custom_info_category_form custom.info.category form New
custom_info_category_search custom.info.category search New
custom_info_category_tree custom.info.category tree New
custom_info_option_form custom.info.option form New
custom_info_option_form_full custom.info.option field Inherits custom_info_option_form
custom_info_option_search custom.info.option search New
custom_info_option_tree custom.info.option tree New
custom_info_option_tree_full custom.info.option tree Inherits custom_info_option_tree
custom_info_property_form custom.info.property form New
custom_info_property_form_full custom.info.property field Inherits custom_info_property_form
custom_info_property_search custom.info.property search New
custom_info_property_tree custom.info.property tree New
custom_info_property_tree_full custom.info.property field Inherits custom_info_property_tree
custom_info_template_form custom.info.template form New
custom_info_template_search custom.info.template search New
custom_info_template_tree custom.info.template tree New
custom_info_value_form custom.info.value form New
custom_info_value_search custom.info.value search New
custom_info_value_tree custom.info.value tree New
custom_info_value_tree_editable custom.info.value tree Inherits custom_info_value_tree
view_general_configuration Allow to enable partners custom info base.config.settings xpath Inherits base_setup.view_general_configuration
view_partner_form res.partner xpath Inherits base.view_partner_form
Models touched (8)

New fields (2)
  • group_custom_info_manager Boolean
    help='Allow all employees to manage custom information' implied_group='base_custom_info.group_basic' string='Manage custom information'
  • group_custom_info_partner Boolean
    help='Add a tab in the partners form to edit custom information' implied_group='base_custom_info.group_partner' string='Edit custom information in partners'
Public methods (0)

No public methods.

New fields (2)
  • custom_info_ids One2many → custom.info.value
    auto_join=True comodel_name='custom.info.value' domain=<expr> inverse_name='res_id' string='Custom Properties'
  • custom_info_template_id Many2one → custom.info.template
    comodel_name='custom.info.template' domain=<expr> string='Custom Information Template'
Public methods (4)
  • all_custom_info_templates(self)
    @api.multi
    Get all custom info templates involved in these owners.
  • get_custom_info_value(self, properties)
    @api.multi@api.returns('custom.info.value')
    Get ``custom.info.value`` records for the given property.
  • onchange(self, values, field_name, field_onchange)
    @api.multi
  • unlink(self)
    @api.multi
    Remove linked custom info this way, as can't be handled automatically.

New fields (3)
  • name Char
    index=True required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' help='Properties in this category.' inverse_name='category_id' string='Properties'
  • sequence Integer
    index=True
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access a category if you access at least one property.

New fields (4)
  • name Char
    index=True required=True translate=True
  • property_ids Many2many → custom.info.property
    comodel_name='custom.info.property' help='Properties where this option is enabled.' string='Properties'
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' help='Additional template to be applied to the owner if this option is chosen.' string='Additional template'
  • value_ids One2many → custom.info.value
    comodel_name='custom.info.value' help='Values that have set this option.' inverse_name='value_id' string='Values'
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access an option if you access at least one property.

New fields (13)
  • category_id Many2one → custom.info.category
    comodel_name='custom.info.category' string='Category'
  • category_sequence Integer
    readonly=True related='category_id.sequence' store=True
  • default_value Char
    help='Will be applied by default to all custom values of this property. This is a char field, so you have to enter some value that can be converted to the field type you choose.' translate=True
  • field_type Selection
    default='str' help='Type of information that can be stored in the property.' required=True selection=[('str', 'Text'), ('int', 'Whole number'), ('float', 'Decimal number'), ('bool', 'Yes/No'), ('id', 'Selection')]
  • info_value_ids One2many → custom.info.value
    comodel_name='custom.info.value' inverse_name='property_id' string='Property Values'
  • maximum Float
    default=-1 help='For numeric fields, it means the maximum possible value; for text fields, it means the maximum possible length. If it is smaller than the minimum, then this check is skipped'
  • minimum Float
    help='For numeric fields, it means the minimum possible value; for text fields, it means the minimum possible length. If it is bigger than the maximum, then this check is skipped'
  • model Char
    auto_join=True readonly=True related='template_id.model'
  • name Char
    required=True translate=True
  • option_ids Many2many → custom.info.option
    comodel_name='custom.info.option' help="When the field type is 'selection', choose the available options here." string='Options'
  • required Boolean
  • sequence Integer
    index=True
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' ondelete='cascade' required=True string='Template'
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access a property if you access its template.

New fields (4)
  • model Char
    compute='_compute_model' inverse='_inverse_model' search='_search_model' string='Model technical name'
  • model_id Many2one → ir.model
    auto_join=True comodel_name='ir.model' ondelete='restrict' required=True string='Model'
  • name Char
    required=True translate=True
  • property_ids One2many → custom.info.property
    comodel_name='custom.info.property' inverse_name='template_id' oldname='info_ids' string='Properties'
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access a template if you access its model.

New fields (17)
  • category_id Many2one
    readonly=True related='property_id.category_id' store=True
  • category_sequence Integer
    readonly=True related='property_id.category_id.sequence' store=True
  • field_name Char
    compute='_compute_field_name' help='Technical name of the field where the value is stored.'
  • field_type Selection
    readonly=True related='property_id.field_type'
  • model Char
    auto_join=True index=True readonly=True related='property_id.model' store=True
  • name Char
    readonly=True related='property_id.name'
  • owner_id Reference
    compute='_compute_owner_id' help='Record that owns this custom value.' inverse='_inverse_owner_id' selection='_selection_owner_id' string='Owner'
  • property_id Many2one → custom.info.property
    comodel_name='custom.info.property' readonly=True required=True string='Property'
  • property_sequence Integer
    index=True readonly=True related='property_id.sequence' store=True
  • required Boolean
    readonly=True related='property_id.required'
  • res_id Integer
    index=True ondelete='cascade' required=True store=True string='Resource ID'
  • value Char
    compute='_compute_value' help='Value, always converted to/from the typed field.' inverse='_inverse_value' search='_search_value'
  • value_bool Boolean
    index=True string='Yes/No value'
  • value_float Float
    index=True string='Decimal number value'
  • value_id Many2one → custom.info.option
    comodel_name='custom.info.option' domain="[('property_ids', 'in', [property_id])]" ondelete='cascade' string='Selection value'
  • value_int Integer
    index=True string='Whole number value'
  • value_str Char
    index=True string='Text value' translate=True
Public methods (1)
  • check_access_rule(self, operation)
    @api.multi
    You access a value if you access its owner record.

New fields (2)
  • custom_info_ids One2many
    context={'default_model': _name}
  • custom_info_template_id Many2one
    context={'default_model': _name}
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-tools
GIT
GIThttps://github.com/OCA/server-tools.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-tools/tree/8.0/base_custom_info
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Antiun Ingeniería S.L., Incaser Informatica S.L.
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Antiun Ingeniería S.L., Incaser Informatica S.L.
COMMITTERS
COMMITTERSJairo Llopis, Stéphane Bidoul (ACSONE), OCA Transbot, oca-travis, Weblate, OCA-git-bot
WEBSITE
WEBSITEhttp://www.antiun.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:11:25
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (5)
XML IDNameModelTypeStatus
base_custom_info_template_form base.custom.info.template.form custom.info.template form New
base_custom_info_template_line_form base.custom.info.property.form custom.info.property form New
base_custom_info_template_line_tree base.custom.info.property.tree custom.info.property tree New
base_custom_info_template_tree base.custom.info.template.tree custom.info.template tree New
base_custom_info_value_tree base.custom.info.value.tree custom.info.value tree New
Models touched (5)

New fields (2)
  • custom_info_ids One2many → custom.info.value
    auto_join=True comodel_name='custom.info.value' domain=<expr> inverse_name='res_id' string='Custom Properties'
  • custom_info_template_id Many2one → custom.info.template
    comodel_name='custom.info.template' string='Custom Information Template'
Public methods (1)
  • unlink(self)
    @api.multi

New fields (2)
  • model Char
    index=True readonly=True required=True
  • model_id Many2one → ir.model
    compute='_compute_model_id' store=True args: 'ir.model', 'Model'
Public methods (0)

No public methods.

New fields (3)
  • info_value_ids One2many → custom.info.value
    comodel_name='custom.info.value' inverse_name='property_id' string='Property Values'
  • name Char
    translate=True
  • template_id Many2one → custom.info.template
    comodel_name='custom.info.template' string='Template'
Public methods (0)

No public methods.

New fields (2)
  • info_ids One2many → custom.info.property
    args: 'custom.info.property', 'template_id', 'Properties'
  • name Char
    required=True translate=True
Public methods (0)

No public methods.

New fields (4)
  • name Char
    related='property_id.name'
  • property_id Many2one → custom.info.property
    comodel_name='custom.info.property' required=True string='Property'
  • res_id Integer
    index=True required=True args: 'Resource ID'
  • value Char
    translate=True
Public methods (0)

No public methods.