Frequently Asked Questions (FAQ)

Why OdooRPC? And why migrate from OERPLib to OdooRPC?

It was a tough decision, but several reasons motivated the OdooRPC project:

RPC Protocol

The first point is about the supported protocol, XML-RPC is kept in Odoo for compatibility reasons (and will not evolve anymore, maybe removed one day), replaced by the JSON-RPC one. Although these protocols are almost similar in the way we build RPC requests, some points make JSON-RPC a better and reliable choice like the way to handle errors raised by the Odoo server (access to the type of exception raised, the complete server traceback...). To keep a clean and maintainable base code, it would have been difficult to support both protocols in OERPLib, and it is why OdooRPC only support JSON-RPC.

Another good point with JSON-RPC is the ability to request all server web controllers to reproduce requests (type=’json’ ones) made by the official Javascript web client. As the code to make such requests is based on standard HTTP related Python modules, OdooRPC is also able to request HTTP web controllers (type=’http’ ones).

In fact, you could see OdooRPC as a high level API for Odoo with which you could replicate the behaviour of the official Javascript web client, but in Python.

New server API
One goal of OERPLib was to give an API not too different from the server side API to reduce the learning gap between server-side development and client-side with an RPC library. With the new API which appears in Odoo 8.0 this is another brake (the old API has even been removed since Odoo 10.0), so the current API of OERPLib is not anymore consistent. As such, OdooRPC mimics A LOT the new API of Odoo, for more consistency (see the tutorials).
New brand Odoo
OpenERP became Odoo, so what does OERPLib mean? OEWhat? This is obvious for old developers which start the OpenERP adventure since the early days, but the OpenERP brand is led to disappear, and it can be confusing for newcomers in the Odoo world. So, OdooRPC speaks for itself.
Maintenance cost, code cleanup

OpenERP has evolved a lot since the version 5.0 (2009), making OERPLib hard to maintain (write tests for all versions before each OERPLib and OpenERP release is very time consuming). All the compatibility code for OpenERP 5.0 to 7.0 was dropped for OdooRPC, making the project more maintainable. Odoo is now a more mature product, and OdooRPC should suffer less about compatibility issues from one release to another.

As OdooRPC has not the same constraints concerning Python environments where it could be running on, it is able to work on Python 2.7 to 3.X.

OdooRPC is turned towards the future, so you are encouraged to use or migrate on it for projects based on Odoo >= 8.0. It is more reliable, better covered by unit tests, and almost identical to the server side new API.

Connect to an Odoo Online (SaaS) instance

First, you have to connect on your Odoo instance, and set a password for your user account in order to active the RPC interface.

Then, just use the jsonrpc+ssl protocol with the port 443:

>>> import odoorpc
>>> odoo = odoorpc.ODOO('foobar.my.odoo.com', protocol='jsonrpc+ssl', port=443)
>>> odoo.version
'8.saas~5'

Update a record with an on_change method

OdooRPC does not provide helpers for such methods currently. A call to an on_change method intend to be executed from a view and there is no support for that (not yet?) such as fill a form, validate it, etc...

But you can emulate an on_change by writing your own function, for instance:

def on_change(record, method, args=None, kwargs=None):
    """Update `record` with the result of the on_change `method`"""
    res = record._odoo.execute_kw(record._name, method, args, kwargs)
    for k, v in res['value'].iteritems():
        setattr(record, k, v)

And call it on a record with the desired method and its parameters:

>>> order = odoo.get('sale.order').browse(42)
>>> on_change(order, 'product_id_change', args=[ARGS], kwargs={KWARGS})

Some model methods does not accept the context parameter

The context parameter is sent automatically for each call to a Model method. But on the side of the Odoo server, some methods have no context parameter, and OdooRPC has no way to guess it, which results in an nasty exception. So you have to disable temporarily this behaviour by yourself by setting the auto_context option to False:

>>> odoo.config['auto_context'] = False  # 'get()' method of 'ir.sequence' does not support the context parameter
>>> next_seq = odoo.get('ir.sequence').get('stock.lot.serial')
>>> odoo.config['auto_context'] = True  # Restore the configuration

Change the behaviour of a script according to the version of Odoo

You can compare versions of Odoo servers with the v function applied on the ODOO.version property, for instance:

import odoorpc
from odoorpc.tools import v

for session in odoorpc.ODOO.list():
    odoo = odoorpc.ODOO.load(session)
    if v(odoo.version) < v('10.0'):
        pass  # do some stuff
    else:
        pass  # do something else