Skip to main content

Odoo Connect

A simple library to use Odoo RPC.

PyPI version

Usage

import odoo_connect
odoo = env = odoo_connect.connect(url='http://localhost:8069', username='admin', password='admin')
so = env['sale.order']
so.search_read([('create_uid', '=', 1)], [])

/json/2/ support

Since the introduction of /json/2 in Odoo 19, there is no need to use this library. You can use any HTTP client and simply send RPC calls. You could use this library to explore the data more easily. If this is the case, pass a token instead of user/password when connecting.

import httpx
API_KEY = ...
cli = httpx.Client(base_url=..., headers={'Authorization': f'Bearer {API_KEY}'})
resp = cli.post('/json/2/sale.order/search_read', json={'domain': [], 'limit': 5})
resp.raise_for_status().json()

Rationale

OdooRPC or Odoo RPC Client are both more complete and mimic internal Odoo API. Then aio-odoorpc provides an asynchronous API.

This library provides only a simple API for connecting to the server and call methods, so the maintenance should be minimal.

Note that each RPC call is executed in a transaction. So the following code on the server, will add one to every line ordered quantity or fail and do nothing. However, RPC client libraries will perform multiple steps, on a failure, already executed code was committed. You can end with race conditions where some other code sets product_uom_qty to 0 before you increment it. A better way of doing this is to implement a function on Odoo side and call it.

lines = env['sale.order.line'].search([
	('order_id.name', '=', 'S00001')
])
# this is fine on the server, but not in RPC (multiple transactions)
for line in lines:
	if line.product_uom_qty > 1:
		line.product_uom_qty += 1
# single transaction
lines.increment_qty([('product_uom_qty', '>', 1)])

Export and import data

A separate package provides utilities to more easily extract data from Odoo.

Since Odoo doesn't accept all kind of values, the format package will help with converting between python values and values returned by Odoo.

The provided function will return a table-like (list of lists) structure with the requested data. You can also pass ir.filters names or ir.exports names instead of, respectively, domains and fields. Note that this doesn't support groupping.

import odoo_connect.data as odoo_data
so = env['sale.order']

# Read data as usual
data = so.search_read_dict([('state', '=', 'sale')], ['name', 'partner_id.name'])
so.read_group([], ['amount_untaxed'], ['partner_id', 'create_date:month'])
odoo_data.add_url(so, data)

# Exporting flattened data
all_data = odoo_data.export_data(so, [('state', '=', 'sale')], ['name', 'partner_id.name'])
with io.StringIO(newline='') as f:
    w = csv.writer(f, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    w.writerows(all_data.to_csv())
all_data.to_pandas()  # as a data frame
all_data.to_dbapi(con, 'table_name')  # create a table

# Import data using Odoo's load() function
odoo_data.load_data(so, data)

# Import data using writes and creates (or another custom method)
for batch in odoo_data.make_batches(data):
	# add ids by querying the model using the 'name' field
	# if you remove 'id' from the data, only create() is called
	odoo_data.add_fields(so, batch, 'name', ['id'])
	odoo_data.load_data(so, batch, method='write')

Explore

Provides a simple abstraction for querying data with a local cache. It may be easier than executing and parsing a read(). Also, auto-completion for fields is provided in jupyter.

from odoo_connect.explore import explore
sale_order = explore(env['sale.order'])
sale_order = sale_order.search([], limit=1)
sale_order.read()

Development

You can use a vscode container and open this repository inside it. Alternatively, clone and setup the repository manually.

git clone $url
cd odoo-connect
# Install dev libraries
pip install -e .[pinned,dev,test]
./pre-commit install
# Run some tests
pytest

Metadata

Release files for odoo-connect 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for odoo-connect 0.6.0
File Size Uploaded
odoo_connect-0.6.0.tar.gz 38.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for odoo-connect 0.6.0
File Interpreter ABI Platform
odoo_connect-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 66.7 kB

Release files / odoo_connect-0.6.0.tar.gz

Download URL odoo_connect-0.6.0.tar.gz
Size 38.7 kB
Tags Source
SHA-256 checksum
How to use checksums
196c0b071d84f2657f494aafc7facc4ae4bd3f8baf650d5a02f291164f0ad517
BLAKE2b-256 checksum
How to use checksums
e5a37988ef8cd3874b5cada0da6244c7aae576ccb210163701c2b72591b5b57c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / odoo_connect-0.6.0-py3-none-any.whl

Download URL odoo_connect-0.6.0-py3-none-any.whl
Size 28.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b5ba7b3841e14200c69558c4e9687a15917f5ec74b40cd4f3fb3999b9417e8d2
BLAKE2b-256 checksum
How to use checksums
3102efd30a81e3563ac81b1e141db687eb921bc6db16e9047441f35c93f551c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page