# @api.multi is deleted
# https://github.com/odoo/odoo/commit/a8767716cfd14abc7f87204d4d180811f663b648
find . -type f -name '*.py' | xargs sed -i '/@api.multi/d'

# remove deprecated decorators
# https://github.com/odoo/odoo/commit/c552fb7a618afe2feea2e0358ead9eb6ebff0c94
find . -type f -name '*.py' | xargs sed -i '/@api.model_cr$/d'
find . -type f -name '*.py' | xargs sed -i '/@api.v8/d'
find . -type f -name '*.py' | xargs sed -i '/@api.model_cr_context/d'
find . -type f -name '*.py' | xargs sed -i '/@api.noguess/d'

# view_type is deleted:
# https://github.com/odoo/odoo/commit/3cd7ed07a29c89ddf193796c20a812b9bf21e284
find . -type f -name '*.xml' | xargs perl -i -pe 's/\s*\<field name="view_type"\>form\<\/field\>\n//g'
find . -type f -name '*.xml' | xargs perl -i -pe 's/view_type="form"//g'
# TODO: script for python files

# key2 is deleted, src_model is renamed
# https://github.com/odoo/odoo/commit/10f1a1a0c45
find . -type f -name '*.xml' | xargs sed -i 's/src_model="\([^"]*\)"/binding_model="\1"/g'
find . -type f -name '*.xml' | xargs sed -i 's/key2="client_action_multi"//g'

# ControlPanelMixin is deleted
# https://github.com/odoo/odoo/commit/40dd1219385
# delete line with require('web.ControlPanelMixin');
find . -type f -name '*.js' | xargs sed -i '/web.ControlPanelMixin/d'
find . -type f -name '*.js' | xargs perl -i -p0e 's/ControlPanelMixin, \{\n\s*template/{\n    hasControlPanel: true,\n    contentTemplate/g'

# track_visibility is obsolete
find . -type f -name '*.py' | xargs sed -i 's/track_visibility="always"/tracking=True/g'

# serialize_exception was move from odoo/http.py
# https://github.com/odoo/odoo/commit/0d1407a715901ea06e9a7211c0e3dbe09fadb785
# Following command fixes only partly. You need to do manually:
# * delete imports
# * replace TODO with self.env or request.registry
find . -type f -name '*.py' | xargs sed -i "s/serialize_exception/TODO ['ir.http'].serialize_exception/g"

# pycompat: support for python2 is deleted:
# https://github.com/odoo/odoo/commit/758382b3a73da024d6e1dc04a474d2868223767a
# You may need:
# * delete pycompat importing manually
find . -type f -name '*.py' | xargs sed -i "s/odoo.tools.pycompat.text_type/str/g"
find . -type f -name '*.py' | xargs sed -i "s/tools.pycompat.text_type/str/g"
find . -type f -name '*.py' | xargs sed -i "s/pycompat.text_type/str/g"
find . -type f -name '*.py' | xargs sed -i "s/text_type/str/g"


web_settings_dashboard is merged to base_setup https://github.com/odoo/odoo/commit/78565b1dc933692abba46a73f2298b7ea8e03c88

  • [[ Settings ]] >> Dashboard is deleted!

Automatic update

# update dependencies
find . -type f -name __openerp__.py  -or -name __manifest__.py | xargs sed -i "s/web_settings_dashboard/base_setup/"

Processing old js file

# check for js files that like have to be deleted
find . -type f -name "*.js" | xargs grep "require.*web_settings_dashboard"

If the code above gives non-empty output, you may need to do following updates:

  • get rid of that js

  • Move missed configuration to Settings menu (res.config)


The library is deleted: https://github.com/odoo/odoo/commit/596206cdf6d

Here are examples how to update code:


This manifest’s attribute should use pypi name, instead of python package. Which is the name you use on installing via pip install ..., and not the name in python code like import ...

company_ids in res.users

The field company_ids is mandatory: https://github.com/odoo/odoo/commit/4205cb2728041487bd026bf5c6bac590e0ace1e9


console.log('ok') is replaced with console.log('test successful') in js tests.

Since odoo 13.0:

To signal success test do: console.log(‘test successful’)

To signal test failure raise an exception or call console.error

Odoo 12.0 and earlier versions:

To signal success test do:


To signal failure do:




DINAR helps to automate this process by using GIthub Actions and OCA/odoo-module-migrator:

  • install DINAR

  • Open an issue with name DINAR-PORT <BRANCH> <MODULE>

Check examples here: https://github.com/search?q=org%3Aitpp-labs+DINAR-PORT&type=issues