Base Import Match

base_import_match
REPOSITORY
REPOSITORYOCA/server-backend
GIT
GIThttps://github.com/OCA/server-backend.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-backend/tree/18.0/base_import_match
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Celina Devigili
WEBSITE
WEBSITEhttps://github.com/OCA/server-backend
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:19
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
By default, when importing data (like CSV import) with the `base_import`
module, Odoo follows this rule:

- If you import the XMLID of a record, make an **update**.
- If you do not, **create** a new record.

This module allows you to set additional rules to match if a given
import is an update or a new record.

This is useful when you need to sync heterogeneous databases, and the
field you use to match records in those databases with Odoo's is not the
XMLID but the name, VAT, email, etc.

After installing this module, the import logic will be changed to:

- If you import the XMLID of a record, make an **update**.
- If you do not:
  - If there are import match rules for the model you are importing:
    - Discard the rules that require fields you are not importing.
    - Traverse the remaining rules one by one in order to find a match
      in the database.
      - Skip the rule if it requires a special condition that is not
        satisfied.
      - If one match is found:
        - Stop traversing the rest of valid rules.
        - **Update** that record.
      - If zero or multiple matches are found:
        - Continue with the next rule.
      - If all rules are exhausted and no single match is found:
        - **Create** a new record.
  - If there are no match rules for your model:
    - **Create** a new record.

By default 2 rules are installed for production instances:

- One rule that will allow you to update companies based on their VAT,
  when `is_company` is `True`.
- One rule that will allow you to update users based on their login.

In demo instances there are more examples.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match list view base_import.match list New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • load(self, fields, data)
    @api.model
    Try to identify rows by other pseudo-unique keys. It searches for rows that have no XMLID specified, and gives them one if any :attr:`~.field_ids` combination is found. With a valid XMLID in place, Odoo will understand that it must *update* the record instead of *creating* a new one.

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('transient', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True string='Model name'
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (0)

No public methods.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.name'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-backend
GIT
GIThttps://github.com/OCA/server-backend.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-backend/tree/17.0/base_import_match
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSOCA-git-bot, oca-ci, sygel
WEBSITE
WEBSITEhttps://github.com/OCA/server-backend
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:11
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
By default, when importing data (like CSV import) with the `base_import`
module, Odoo follows this rule:

- If you import the XMLID of a record, make an **update**.
- If you do not, **create** a new record.

This module allows you to set additional rules to match if a given
import is an update or a new record.

This is useful when you need to sync heterogeneous databases, and the
field you use to match records in those databases with Odoo's is not the
XMLID but the name, VAT, email, etc.

After installing this module, the import logic will be changed to:

- If you import the XMLID of a record, make an **update**.
- If you do not:
  - If there are import match rules for the model you are importing:
    - Discard the rules that require fields you are not importing.
    - Traverse the remaining rules one by one in order to find a match
      in the database.
      - Skip the rule if it requires a special condition that is not
        satisfied.
      - If one match is found:
        - Stop traversing the rest of valid rules.
        - **Update** that record.
      - If zero or multiple matches are found:
        - Continue with the next rule.
      - If all rules are exhausted and no single match is found:
        - **Create** a new record.
  - If there are no match rules for your model:
    - **Create** a new record.

By default 2 rules are installed for production instances:

- One rule that will allow you to update companies based on their VAT,
  when `is_company` is `True`.
- One rule that will allow you to update users based on their login.

In demo instances there are more examples.

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match tree view base_import.match tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • load(self, fields, data)
    @api.model
    Try to identify rows by other pseudo-unique keys. It searches for rows that have no XMLID specified, and gives them one if any :attr:`~.field_ids` combination is found. With a valid XMLID in place, Odoo will understand that it must *update* the record instead of *creating* a new one.

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('transient', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True string='Model name'
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (0)

No public methods.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.name'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-backend
GIT
GIThttps://github.com/OCA/server-backend.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-backend/tree/16.0/base_import_match
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSWeblate, OCA-git-bot, oca-ci, Gil Arasa Verge, anjeel.haria
WEBSITE
WEBSITEhttps://github.com/OCA/server-backend
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:54:00
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match tree view base_import.match tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • load(self, fields, data)
    @api.model
    Try to identify rows by other pseudo-unique keys. It searches for rows that have no XMLID specified, and gives them one if any :attr:`~.field_ids` combination is found. With a valid XMLID in place, Odoo will understand that it must *update* the record instead of *creating* a new one.

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('transient', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True string='Model name'
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (0)

No public methods.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.name'
Public methods (1)
  • name_get(self)
    @api.depends('conditional', 'field_id', 'imported_value')
REPOSITORY
REPOSITORYOCA/server-backend
GIT
GIThttps://github.com/OCA/server-backend.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-backend/tree/15.0/base_import_match
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSSébastien Alix, Augusto Weiss, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/server-backend
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:43
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match tree view base_import.match tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • load(self, fields, data)
    @api.model
    Try to identify rows by other pseudo-unique keys. It searches for rows that have no XMLID specified, and gives them one if any :attr:`~.field_ids` combination is found. With a valid XMLID in place, Odoo will understand that it must *update* the record instead of *creating* a new one.

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('transient', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True string='Model name'
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (0)

No public methods.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.name'
Public methods (1)
  • name_get(self)
    @api.depends('conditional', 'field_id', 'imported_value')
REPOSITORY
REPOSITORYOCA/server-backend
GIT
GIThttps://github.com/OCA/server-backend.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-backend/tree/14.0/base_import_match
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSDaniel Reis, Enric Tobella, OCA Transbot, oca-travis, Weblate, OCA-git-bot, oca-ci, Jesus Ramoneda, oca-git-bot
WEBSITE
WEBSITEhttps://github.com/OCA/server-backend
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:12
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match tree view base_import.match tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • load(self, fields, data)
    @api.model
    Try to identify rows by other pseudo-unique keys. It searches for rows that have no XMLID specified, and gives them one if any :attr:`~.field_ids` combination is found. With a valid XMLID in place, Odoo will understand that it must *update* the record instead of *creating* a new one.

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('transient', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True string='Model name'
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (0)

No public methods.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.name'
Public methods (1)
  • name_get(self)
    @api.depends('conditional', 'field_id', 'imported_value')
REPOSITORY
REPOSITORYOCA/server-backend
GIT
GIThttps://github.com/OCA/server-backend.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-backend/tree/13.0/base_import_match
VERSION
VERSION 1.0.3
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSKatherine Zaoral, JordiMForgeFlow, oca-travis, Weblate, OCA-git-bot, Radovan Skolnik, Rad0van
WEBSITE
WEBSITEhttps://tecnativa.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:34:20
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match tree view base_import.match tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • load(self, fields, data)
    @api.model
    Try to identify rows by other pseudo-unique keys. It searches for rows that have no XMLID specified, and gives them one if any :attr:`~.field_ids` combination is found. With a valid XMLID in place, Odoo will understand that it must *update* the record instead of *creating* a new one.

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('transient', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True string='Model name'
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (0)

No public methods.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.name'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-backend
GIT
GIThttps://github.com/OCA/server-backend.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-backend/tree/12.0/base_import_match
VERSION
VERSION 1.1.1
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA)
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA)
COMMITTERS
COMMITTERSDaniel Reis, OCA Transbot, oca-travis, Weblate, OCA-git-bot, ernesto, hugues de keyzer
WEBSITE
WEBSITEhttps://github.com/OCA/server-backend
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:29:25
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match tree view base_import.match tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • load(self, fields, data)
    @api.model
    Try to identify rows by other pseudo-unique keys. It searches for rows that have no XMLID specified, and gives them one if any :attr:`~.field_ids` combination is found. With a valid XMLID in place, Odoo will understand that it must *update* the record instead of *creating* a new one.

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('transient', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True string='Model name'
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (0)

No public methods.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.name'
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/server-backend
GIT
GIThttps://github.com/OCA/server-backend.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/server-backend/tree/11.0/base_import_match
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Grupo ESOC Ingeniería de Servicios
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Grupo ESOC Ingeniería de Servicios
COMMITTERS
COMMITTERSoca-travis, Weblate, OCA-git-bot, Marçal Isern
WEBSITE
WEBSITEhttps://tecnativa.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:24:02
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match tree view base_import.match tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • load(self, fields, data)
    @api.model
    Try to identify rows by other pseudo-unique keys. It searches for rows that have no XMLID specified, and gives them one if any :attr:`~.field_ids` combination is found. With a valid XMLID in place, Odoo will understand that it must *update* the record instead of *creating* a new one.

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('transient', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (0)

No public methods.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.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_import_match
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Grupo ESOC Ingeniería de Servicios
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Grupo ESOC Ingeniería de Servicios
COMMITTERS
COMMITTERSPedro M. Baeza, OCA Transbot, oca-travis, Weblate
WEBSITE
WEBSITEhttps://tecnativa.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:20:00
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
    - web_kanban
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match tree view base_import.match tree New
Models touched (3)

New fields (0)

No new fields.

Public methods (1)
  • load(self, fields, data)
    @api.model
    Try to identify rows by other pseudo-unique keys. It searches for rows that have no XMLID specified, and gives them one if any :attr:`~.field_ids` combination is found. With a valid XMLID in place, Odoo will understand that it must *update* the record instead of *creating* a new one.

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('transient', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (0)

No public methods.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.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_import_match
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSTecnativa, Odoo Community Association (OCA), Grupo ESOC Ingeniería de Servicios
MAINTAINERS
MAINTAINERSTecnativa, Odoo Community Association (OCA), Grupo ESOC Ingeniería de Servicios
COMMITTERS
COMMITTERSPedro M. Baeza, Jairo Llopis, OCA Transbot, oca-travis, Weblate
WEBSITE
WEBSITEhttps://tecnativa.com
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:15:23
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match tree view base_import.match tree New
Models touched (2)

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('transient', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (3)
  • create(self, vals)
    @api.model
    Wrap the model after creation.
  • unlink(self)
    @api.multi
    Unwrap the model after deletion.
  • write(self, vals)
    @api.multi
    Wrap the model after writing.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.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_import_match
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Grupo ESOC Ingeniería de Servicios
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Grupo ESOC Ingeniería de Servicios
COMMITTERS
COMMITTERSJairo Llopis, Moisés López, Stéphane Bidoul (ACSONE), OCA Transbot, Moises Lopez - https://www.vauxoo.com/, oca-travis, Weblate
WEBSITE
WEBSITEhttps://grupoesoc.es
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:11:25
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - base_import
    - web
    - base
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (3)
XML IDNameModelTypeStatus
match_form_view Import match form view base_import.match form New
match_search_view Import match search view base_import.match search New
match_tree_view Import match tree view base_import.match tree New
Models touched (2)

New fields (5)
  • field_ids One2many → base_import.match.field
    comodel_name='base_import.match.field' help='Fields that will define an unique key.' inverse_name='match_id' required=True string='Fields'
  • model_id Many2one → ir.model
    domain=[('osv_memory', '=', False)] help='In this model you will apply the match.' ondelete='cascade' required=True args: 'ir.model', 'Model'
  • model_name Char
    index=True related='model_id.model' store=True
  • name Char
    compute='_compute_name' index=True store=True
  • sequence Integer
    index=True
Public methods (3)
  • create(self, vals)
    @api.model
    Wrap the model after creation.
  • unlink(self)
    @api.multi
    Unwrap the model after deletion.
  • write(self, vals)
    @api.multi
    Wrap the model after writing.

New fields (6)
  • conditional Boolean
    help='Enable if you want to use this field only in some conditions.'
  • field_id Many2one → ir.model.fields
    comodel_name='ir.model.fields' domain="[('model_id', '=', model_id)]" help='Field that will be part of an unique key.' ondelete='cascade' required=True string='Field'
  • imported_value Char
    help="If the imported value is not this, the whole matching rule will be discarded. Be careful, this data is always treated as a string, and comparison is case-sensitive so if you set 'True', it will NOT match '1' nor 'true', only EXACTLY 'True'."
  • match_id Many2one → base_import.match
    comodel_name='base_import.match' ondelete='cascade' required=True string='Match'
  • model_id Many2one
    related='match_id.model_id'
  • name Char
    related='field_id.name'
Public methods (0)

No public methods.

STATUS
STATUSOpen migration PR - not merged yet for this version
REPOSITORY
REPOSITORYOCA/server-backend
PULL REQUEST
PULL REQUEST[19.0][MIG] base_import_match: Migration to 19.0 (#467)