- Use CSI x1b[ for colors, which is more universal than x9b.
- Handle signal SIGWINCH to adjust width of output printing.
Replace
colswithPrinter.widthto match output's width.
- Remove
selffrom vars available in interactive mode. It was giving wrong suggestions in case of typing error. - Inject
clearcommand in built-ins for Python <= 3.12. - Adjust
call_kwpath to/web/dataset/call_kw/<model>/<methodfor adequate HTTP logging, and to be consistent with Odoo Web.
- Improve output coloring. Do not color Python keywords and built-ins.
- Fix command-line parsing.
- Fix invocation like
odooly https://demo.odoo.com.
- Colorize interactive console with Python 3.13+.
- Switch to
argparsefor colored command line parser. - Backport output coloring for Python <= 3.13. Use environment
variable
FORCE_COLOR=1to enable it. - Display error when identity check is not successful.
- Add method :meth:`Env.sql` to execute SQL queries as an administrator.
- Drop support for Python 3.6 and 3.7.
- Drop support for OpenERP and for Odoo 8.
- Drop support for XML-RPC protocol. Use JSON-2 or JSON-RPC.
- Remove
dbService. UseClient.database:class:`WebAPI` instead. - Remove
reportService and workflow helpers. It was for Odoo <= 10. - Remove option for CSV output.
- Remove
%(...)formatting for :meth:`RecordList.read`. Use{...}instead.
- Change
dir(...)of :class:`Record` and :class:`RecordList` to avoid extra API calls on readline completion. - Json2: print details for internal server error 500.
- Print API protocol on login: JSON-2, Web API, JSON-RPC, ...
- Support Odoo saas-19.1. RPC service
Client.dbis removed. - Fix
Envcaching when API switches to JSON-2.
- Fix error handling.
- Fix module upgrade.
- Fix
Envcaching when switching between databases. - Clear API key when re-authenticating with password.
- In case of :meth:`Client.connect` error, list known configurations.
- Optional argument
databasefor :meth:`Client.connect`. - Improve performance of :meth:`Model.search` when a single record is retrieved.
- Preserve context for lazy :class:`RecordList` evaluation.
- Fix :meth:`Env.refresh` to preserve base methods.
- Hide password when
verboseis enabled. - Improve error display.
- Fix XML-RPC methods.
- Odoo 19 and beyond: add documentation when using Web API or Json2 API. Stored on :attr:`Model._doc` attribute.
- Odoo 19 and beyond: list methods and arguments with :meth:`Model._methods` or :meth:`RecordList._methods`.
- Support HTTP Basic Authentication in URL, for example
odooly https://user:password@odoo.example.net/. - Json2: internal refactoring, to detect
"ids"argument. - Json2: fix arguments of :meth:`Record.copy`.
- Support Python 3.15.
- Json2: performance improvement. Parameters of standard public methods are predefined.
- Json2: improve error handling, catch HTTP status 401, 403 and 404.
- Json2: set
Accept: application/jsonHTTP header. - Fix login with
__system__user. Note: it is not supported, and disabled during Odoo installation, for safety reason. Use :meth:`Env.sudo` or :meth:`Model.sudo` instead.
- Fix Json2 API.
- Simplify signature of :meth:`Model.search`: arguments
order,limitandoffsetbecome keyword-only, and undocumented argumentreverseis abandoned. - New: :meth:`Model.search` returns a :class:`RecordList` which is lazily evaluated. API method is called only when needed: if attributes are read or methods are called. It will use search_read API method when it's adequate.
- New: extracting a part of a lazy :class:`RecordList` will not call
API method, for simple use cases like
env['account.move'].search([])[10:90]. It will setoffsetandlimiton the prepared search instead. - Remove undocumented :meth:`Env._web`.
- Refactor code for
readfield formatter. - Refactor :class:`Record` and :class:`RecordList` constructors:
get rid of
__new__and simplify. - Add private method :meth:`Record._invalidate_cache` to implement :meth:`Record.refresh`.
- Property :attr:`Client.verbose` to enable/disable logging.
- Support
odooly https://demo.odoo.comfor simplicity.
- Interactive: add possibility to change verbosity. E.g.:
client._printer.cols = 180. Set to0to disable. - Retrieve models when user does not have access to
ir.model. Only for Odoo 15 there's no workaround. For Odoo >= 16 a methodget_available_modelsis available to all users. - Do not list
transientmodels with :meth:`Env.models`. - Enhance error management for JSON-2 API with Odoo >= 19.
- Improve type-checking for
writemethods. - Handle
fields.Serializedfields without error.
- For WebAPI and JSON-RPC, do not print traceback for common
Odoo errors, like
UserErrorandValidationError. - Fix
sudo()KeyError in some cases. - Do not raise an error when a field is read on a ghost :class:`Record`.
- Fix HTTP session error when switching to a different database.
- Configure
server = ...instead ofscheme / host / port / protocol. - Better error message for
inoperator on :class:`RecordList`. - Use
display_nameinstead ofname_get()for Odoo >= 8, becausename_getis deprecated in Odoo 17 and removed in Odoo 18. - Remove workaround not needed anymore for interactive console. Issue was fixed in Python source code.
- Support
{...}string format for :meth:`RecordList.read` and :meth:`Model.read`. - Use
search_readmethod with Odoo >= 8. - Fix cache when switching between environments.
- Use a separate HTTP session when using JSON-2 API Key.
- Change :meth:`Model.sudo` and :meth:`RecordList.sudo` to become Superuser, on Odoo >= 12.
- Fix ResourceWarning with Python 3.14.
- Add operators
not =likeandnot =ilikefor Odoo 19. - Fix API Key authentication for RPC protocols.
- Able to connect with HTTP redirection. For example:
odooly --server http://demo.odoo.com - Add method :meth:`Client.save` to save current environment in memory, with a name. Change :meth:`Client.get_config` to a class method.
- Fix command line usage with a list of IDs.
- Keep
env.user.loginwhenenv.user.refresh()is called. - Obfuscate :attr:`Env.context` in cache key.
- Fix :meth:`Client.clone_database`.
- New method :meth:`Env.set_api_key`.
- Catch and format authentication error properly.
- Print errors when
verboseis enabled. - Fix 2FA authentication retry, when code is invalid.
- Fix incorrect data serialization when JSON is empty
{}. - Try to login even if
databaseis not set, with Odoo >= 10. - Fix Web authentication for Odoo 10 to 14.
- Ask for confirmation before (un)installing dependent modules.
- Propose database selector when needed, even for JSON-2 authentication.
- Support
--api-keyon the command line.
- Store :attr:`Env.session_info` when it is retrieved with Webclient API.
Insert
user_contextintosession_infowhen RPC API is used. - Add a database selector for Webclient API.
- Method
existsbecomes private with Odoo 19. - Fix method :meth:`Env.upgrade_cancel` for Odoo 19.
- Fix parsing version of Saas instances.
- New static method :meth:`Client.get_config`
- Support JSON-2 API with Odoo >= 19.
- Configure
api_keyseparately. Allow to use JSON-2 even ifpasswordis not configured. - New method :meth:`Env.generate_api_key` for Odoo >= 14.
- Support methods protected by
check_identity, for Odoo >= 14.
- Print HTTP error status when error occurs.
- Support
env._web.session('get_session_info')as alternative toclient.web_session.get_session_info(), for example. - When using Webclient,
database =configuration becomes optional. - Method :meth:`Model.sudo` defaults to
'admin'user, instead of UID 1. - Simplify authentication, passwords are encrypted since Odoo 12 and
values cannot be retrieved by
'admin'. - Add API overview table to the documentation: availability and authentication mode per Odoo version.
- Fix
context_getarguments. - Do not authenticate with
/web/session/authenticatewhen protocol isjsonrpcorxmlrpc. It cannot authenticate API keys. - Experimental support for 2FA with Webclient session, with Odoo >= 15.
- Fix PyPI classifiers.
- Update documentation.
- Support webclient :class:`WebAPI` protocol as an alternative:
/web/dataset/*,/web/database/*, ... Webclient API is stable since Odoo 9. - Authenticate with
/web/session/authenticateby default and retrieve :attr:`Env.session_info`, with Odoo >= 9. - Use Webclient API by default when
protocolis not set. It is same as settingprotocol = web. - New function :meth:`Client.drop_database`.
- New functions to create/destroy a session: :meth:`Env.session_authenticate` and :meth:`Env.session_destroy`.
- Drop support for Python 3.5.
- Support method :meth:`Model.create` with a list of values. With Odoo >= 12.
- Support method :meth:`RecordList.copy`. With Odoo >= 18.
- Extend local mode to support Odoo >= 15.
- Fix :meth:`Env.uninstall`.
- Add helper :meth:`Env.upgrade_cancel` to reset module states.
- Support for Odoo 17, 18 and 19.
- Support Python 3.12 and 3.13.
- Drop support for Python 2.7 and Python 3.4.
- Enable Github Actions CI. Remove Travis CI.
- Support new search operators: any|not any|parent_of.
- No change. Re-upload to PyPI.
- Default location for the configuration file is the initial working directory.
- Enhanced syntax for method :meth:`RecordList.filtered`.
E.g. instead of
records.filtered(lambda r: r.type == 'active')it's faster to userecords.filtered(['type = active']). - Support unary operators even for Python 3.
- Basic sequence operations on :class:`Env` instance.
- No change. Re-upload to PyPI.
- Fix :meth:`RecordList.mapped` method with empty one2many or many2many fields.
- Hide arguments of
partialobjects.
- Fix new feature of 2.1.4.
- Support
env['res.partner'].browse()and return an emptyRecordList.
- Fix a bug where method
with_contextreturns an error if we update the values of the logged-in user before. - Allow to call RPC method
env['ir.default'].get(...)thanks to a passthrough in the :meth:`Model.get` method.
- Store the cursor :attr:`Env.cr` on the :class:`Env` instance in local mode.
- Drop support for Python 3.2 and 3.3.
- Do not call ORM method
existson an empty list because it fails with OpenERP. - Provide cursor :attr:`Env.cr` in local mode, even with OpenERP instances.
- Optimize and fix method :meth:`RecordList.filtered`.
- Allow to bypass SSL verification if the server is misconfigured.
Environment variable
ODOOLY_SSL_UNVERIFIED=1is detected. - Accept multiple command line arguments for local mode. Example:
odooly -- --config path/to/odoo.conf --data-dir ./var - Add
selfto theglobals()in interactive mode, to mimic Odoo shell. - On login, assign the context of the user:
env['res.users'].context_get(). Do not copy the context when switching database, or when connecting with a different user. - Drop attribute
Client.context. It is only available as :attr:`Env.context`. - Fix hashing error when :attr:`Env.context` contains a list.
- Assign the model name to
Record._name. - Fix installation/upgrade with an empty list.
- Catch error when database does not exist on login.
- Format other Odoo errors like
DatabaseExists.
- Fix cache of first
Envin interactive mode. - Correctly invalidate the cache after installing/upgrading add-ons.
- Add tests for :meth:`Model.with_context`, :meth:`Model.sudo` and :meth:`Env.sudo`.
- Copy the context when switching database.
- Change interactive prompt
sys.ps2to" ... ".
- Provide :meth:`Env.sudo` in addition to same method on
Model,RecordListandRecordinstances. - Workflows and method
object.exec_workfloware removed in Odoo 11. - Do not prevent login if access to
Client.db.list()is denied. - Use a cache of :class:`Env` instances.
- Add documentation for methods :meth:`RecordList.exists` and :meth:`RecordList.ensure_one`.
- Add documentation for methods :meth:`RecordList.mapped`, :meth:`RecordList.filtered` and :meth:`RecordList.sorted`.
- Add documentation for methods :meth:`Model.with_env`, :meth:`Model.sudo` and :meth:`Model.with_context`. These methods are also available on :class:`RecordList` and :class:`Record`.
- Changed method
existson :class:`RecordList` and :class:`Record` to return record(s) instead of ids. - Fix methods
mapped,filteredandsorted. Add tests. - Fix method
RecordList.ensure_one()when there's identical ids orFalsevalues. - Fix method
RecordList.union(...)and related boolean operations.
- First release of Odooly, which mimics the new Odoo 8.0 API.
- Other features are copied from ERPpeek 1.7.