This module allows to import / update records from files using the
connector framework and job queue.
Import types are the main configuration of the import. They describe
which models you want to import and how to import them.
Exaple of configuration:
<record id="import_type_product_product_all_in_one" model="import.type">
<field name="name">Import Product - all in one</field>
<field name="key">product_product_all_in_one</field>
<field name="options">
- model: product.product
options:
importer:
odoo_unique_key: barcode
mapper:
name: product.product.mapper
- model: res.partner
options:
importer:
odoo_unique_key: name
override_existing: false
mapper:
name: importer.mapper.dynamic
source_key_prefix: supplier.
source_key_whitelist: supplier.name
default_keys:
supplier_rank: 1
- model: product.supplierinfo
options:
importer:
odoo_unique_key: name
mapper:
name: product.supplierinfo.mapper
source_key_prefix: supplier.
</field>
</record>
In this example we have 3 models to import one after the other using the
same source file:
- product.product
- res.partner
- product.supplierinfo
The import will run in the order of the configuration: first
product.product, then res.partner and finally product.supplierinfo. For
each model we have a configuration that describes how to import the
data. With the options key we can define the configuration of the
import for each component: importer, mapper, record_handler,
tracking_handler.
The are 4 main components in the import configuration:
- importer
- mapper
- record_handler
- tracking_handler
Each of them is responsible for a specific part of the import.
importer is the main component that will import the data. It will
use the mapper to map the data from the source to the destination
model. If no name is defined the importer will use the default
importer for the model which is capable of importing any model. Most of
the time you don’t need a specific importer.
As the importer is the main component of the import if you want to
customize it you’ll have to declare it at an higher level, next to the
options key:
- model: product.product
importer:
name: product.product.importer
options:
mapper:
name: product.product.mapper
The importer accepts the following options:
odoo_unique_key: the field that will be used to find the record
in Odoo. If the record is found it will be updated, otherwise it will
be created.
NOTE: the value in the column declared as odoo_unique_key will
be treated as xid only if the name of the column is ìd or if
it starts with xid::.
break_on_error: if set to True the import will stop if an error
occurs. Default is False.
override_existing: if set to True the existing records will be
updated. Default is True.
translation_key_sep: the separator used to split the translation
key. Default is :. See below for information about translation
keys.
translation_use_regional_lang: if set to True the importer will
use the regional language, eg: fr_CH vs fr.
ctx: a dictionary of values to inject in the context of the
import.
write_only: if set to True the importer will not create new
records, it will only update existing ones. Default is False.
The mapper is the component that will map the data from the source to
the destination model.
The most flexible mapper is the importer.mapper.dynamic that will
map the data based on the model introspection and some options that you
can define. The dynamic mapper accepts the following options:
- name: the name of the mapper to use. If no name is defined the
default mapper for the model will be used.
- source_key_prefix: a prefix to add to the source key. This is
useful when you want to map the same source key to different
destination fields.
- source_key_whitelist: a list of source keys to import. If not
defined all the keys will be imported.
- source_key_blacklist: a list of source keys to exclude from the
import.
- source_key_rename: a dictionary of source keys to rename. The key
is the source key and the value is the new key.
- default_keys: a dictionary of default values to set on the
destination record. The key is the field name and the value is the
default value.
- translation_keys: a list of keys that will be used to translate
the data. See below for information about translation keys.
- required_keys: a list of keys that are required. If one of the
keys is missing the record will be skipped. Please refer to the
documentation of the mapper to see advanced options.
Considering the example above:
- model: product.product
options:
mapper:
name: importer.mapper.dynamic
source_key_prefix: supplier.
source_key_whitelist: supplier.name
default_keys:
supplier_rank: 1
The mapper will:
- import only keys starting with supplier. ignoring the rest
- import only the key supplier.name
- set the default value of supplier_rank to 1
The record handler is the component that will handle the record create
or update in Odoo. This component is responsible for:
- finding the record in Odoo
- creating the record if not found
- updating the record if found
- handling the translations
If no name is defined the importer will use the default record
handler for the model which is capable of handling any model. If you
want to customize the record handler you’ll have to declare it at an
higher level, next to the options key:
- model: product.product
options:
record_handler:
name: product.product.record_handler
To find the record in Odoo the record handler will use the
odoo_unique_key if defined in the importer otherwise it will
fallback to the matching domain. See below.
The record handler accepts the following options:
name: the name of the record handler to use. If no name is
defined the default record handler for the model will be used.
match_domain: a domain to match the record in Odoo. When no
odoo_unique_key is provided by the importer you must provide a
match_domain.
This key accepts a snippet returning a domain. The snippet will be
evaluated in the context of the import and will receive:
orig_values: the values from the source
values: values computed by the mapper for the record
env
user
datetime
dateutil
time
ref_id: a function to get a record ID from a reference
ref: a function to get a record from a reference
Example:
match_domain: |
[('name', '=', values.get('name'))]
must_generate_xmlid: if set to True the importer will generate an
XML ID for the record. Default is True if the unique key is an xmlid.
skip_fields_unchanged: if set to True the importer will skip the
fields that are unchanged. Default is False.
The importer can translate the data using the translation keys. The
translation keys are a list of keys (column) that will be handled as
translatable. Whenever a key is found in the translation keys the
importer will look for a column with the same name suffixed by the
language code (eg: name:fr_CH). If the column is found the importer will
translate the data using the language code as context.
Bugs are tracked on GitHub Issues.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
feedback.
Do not contact contributors directly about support or help with technical issues.
Simone Orsi (Camptocamp) for the original implementation.
Other contributors include:
- Guewen Baconnier (Camptocamp)
- Mykhailo Panarin (Camptocamp)
- Sébastien Alix (Camptocamp)
- Thien Vo (Trobz)
The migration of this module from 16.0 to 18.0 was financially supported
by Camptocamp.
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
Current maintainer:

This module is part of the OCA/connector-interfaces project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.