Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
a3b4bab
[INIT] Full refactor of the OpenUpgrade project
legalsylvain Nov 1, 2020
979a031
[DEL] openupgrade_records -> server-tools/14.0
StefanRijnhart Nov 29, 2020
e6618ab
[RFR] OpenUpgrade framework patches
StefanRijnhart Dec 6, 2020
56e072f
[UPD] README.rst
OCA-git-bot Jan 20, 2021
3ff6271
[ADD] icon.png
OCA-git-bot Jan 20, 2021
7ea4374
[FIX] _logger.warn -> _logger.warning
MiquelRForgeFlow Mar 25, 2021
4a26d43
[FIX] doc: base must be included in --load parameter
MiquelRForgeFlow Mar 25, 2021
6c13a6a
[UPD] README.rst
OCA-git-bot Mar 25, 2021
7f9a67a
[FIX] base: Don't fail uninstalling when missing models
MiquelRForgeFlow Apr 8, 2021
029dcd1
[FIX] openupgrade_framework: _drop_column was in wrong class
MiquelRForgeFlow Apr 12, 2021
63c68fa
[DOC] add banner file, to make this module more visible on the app st…
legalsylvain Jun 10, 2021
d657fbc
[UPD] README.rst
OCA-git-bot Jun 10, 2021
dab9fb5
[FIX] Don't break on missing model in selection _process_ondelete
StefanRijnhart Jul 7, 2021
1e69c87
[REF] Add maintainers
legalsylvain Aug 4, 2021
b2a9590
[UPD] README.rst
OCA-git-bot Aug 5, 2021
73106ec
[IMP] openupgrade_framework: avoid AttributeError in view validation
MiquelRForgeFlow Oct 4, 2021
9c525c0
[MIG][15.0] openupgrade_framework
legalsylvain Nov 15, 2021
94a6f41
[REF] adapt framework, due to renaming handle_view_error into _raise_…
legalsylvain Nov 15, 2021
190e77e
fixup! [WIP][15.0] base module
legalsylvain Nov 15, 2021
1ff2997
fixup! fixup! [WIP][15.0] base module
legalsylvain Nov 15, 2021
20f33bf
Update method _postprocess_view of ir_ui_view by removing the input a…
jcdrubay May 10, 2022
7092c7b
[MIG] remove the odoo_patch on function _postprocess_view which becam…
jcdrubay May 11, 2022
202a30a
Adjustements for code style
jcdrubay May 12, 2022
51af030
[UPD] README.rst
OCA-git-bot May 18, 2022
0c15d32
[OU-FIX] Migration scripts were not run during install
StefanRijnhart Feb 27, 2022
ea663ff
[IMP] openupgrade_framework: to not crash, simply not deactivating the
royle-vietnam Jul 11, 2022
35aee25
[IMP] openupgrade_framework: add environ parameter to force demo
MiquelRForgeFlow Jun 20, 2022
fbf0aae
[UPD] README.rst
OCA-git-bot Jul 18, 2022
dae2d3d
[IMP] base: override to not raise an exception
royle-vietnam May 14, 2022
78bf1ef
[FIX] openupgrade_framework: Proper module dependency resolution
pedrobaeza Jul 24, 2022
d1a5b49
[FIX] framework: monkeypatch needs to patch original method
MiquelRForgeFlow Sep 13, 2022
12c2a35
[FIX] framework: monkeypatch needs to patch original method (fixup)
MiquelRForgeFlow Sep 14, 2022
ef7b593
[MIG] openupgrade_framework v16
hbrunn Jan 10, 2023
f961683
[ADD] implement tests of migrations
hbrunn Jan 17, 2023
d06814a
[FIX] Add openupgradelib dependencies in manifest files
legalsylvain Mar 27, 2023
791cfe6
[UPD] README.rst
OCA-git-bot Sep 3, 2023
74d98c8
[OU-FIX] don't fail when there's an unknown field in a view
hbrunn Dec 22, 2023
4fc77e6
[IMP] openupgrade_framework: pre-commit auto fixes and enable
royle-vietnam May 14, 2024
02a6ab7
[FIX] odoo_patch: don't raise or log exceptions in view validation
royle-vietnam May 14, 2024
e7ac198
[MIG] openupgrade_framework v17
daiduongnguyen-odoo May 22, 2024
1ff6d34
[UPD] README.rst
OCA-git-bot May 23, 2024
e057cf3
[IMP] openupgrade_framework: pre-commit stuff
chienandalu Jul 5, 2024
0e10f66
[UPD] README.rst
OCA-git-bot Jul 8, 2024
928a287
[OU-ADD] enable tests, add decorator to make them convenient to use
hbrunn Nov 18, 2024
ae5412f
[MIG] openupgrade_framework: Migration to 18.0
hbrunn Jan 13, 2025
4cf0174
[OU-ADD] exclude analytic 1.2 migration
hbrunn Mar 3, 2025
3c835b6
[BOT] post-merge updates
OCA-git-bot Mar 21, 2025
801ffde
[IMP] openupgrade_framework: install newly available auto_install addons
hbrunn Jun 30, 2025
53a0fcc
[FIX] openupgrade_framework: manipulate versions to actually run scripts
hbrunn Jun 30, 2025
984f9e5
[FIX] openupgrade_framework: force running pre scripts on installation
hbrunn Jun 30, 2025
cbd9cb3
[BOT] post-merge updates
OCA-git-bot Jun 30, 2025
fac8cb1
Revert "[FIX] openupgrade_framework: manipulate versions to actually …
pedrobaeza Jul 4, 2025
365744d
[FIX] openupgrade_framework: fix return value for update_list method …
kafai-lam Jul 11, 2025
9791ef8
[BOT] post-merge updates
OCA-git-bot Jul 12, 2025
0424110
[FIX] openupgrade_framework: _process_ondelete skip fields without at…
zurbaran Aug 2, 2025
e892a0c
[FIX] openupgrade_framework: Add decorator for method update_list()
quoc-pn Aug 23, 2025
193534f
[BOT] post-merge updates
OCA-git-bot Aug 23, 2025
dfe9b56
[MIG] openupgrade_framework to v19
hbrunn Sep 26, 2025
15b8106
[IMP] add tests for openupgrade_framework
hbrunn Oct 3, 2025
1117355
[FIX] don't set install_filename when loading views from openupgrade_…
hbrunn Nov 7, 2025
5fb3144
[FIX]openupgrade_framework: Fix Nonetype Error when install_filenmae …
javierjcf Nov 10, 2025
d713b1a
[FIX] openupgrade_framework: set upgrade_path only if it exists
hbrunn Dec 24, 2025
2d9195f
[UPD] README.rst
OCA-git-bot Dec 25, 2025
e662bd1
[IMP] openupgrade_framework: minor things
MiquelRForgeFlow Jan 21, 2026
10f253d
[MIG] openupgrade_framework to v20
hbrunn Sep 29, 2026
032dd7c
[IMP] openupgrade_framework: log module a column/table would be dropp…
hbrunn Oct 6, 2026
f233761
[IMP] openupgrade_framework: defuse ir.model#_unlink_related_attachments
hbrunn Nov 3, 2026
68c8d39
[FIX] openupgrade_framework: use cr.savepoint in BaseModel.unlink patch
hbrunn Nov 3, 2026
87dd57e
[IMP] openupgrade_framework: filter for country_ids
hbrunn Nov 3, 2026
dc4f15f
[IMP] openupgrade_framework: disable view validation entirely
hbrunn Nov 3, 2026
aef47fb
[UPD] initial analysis
hbrunn Sep 29, 2026
5c131d8
[MIG] base
hbrunn Oct 6, 2026
1faabaf
fixup! [MIG] base
hbrunn Nov 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1,342 changes: 1,342 additions & 0 deletions docsource/modules190-200.rst

Large diffs are not rendered by default.

214 changes: 214 additions & 0 deletions openupgrade_framework/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
.. image:: https://odoo-community.org/readme-banner-image
:target: https://odoo-community.org/get-involved?utm_source=readme
:alt: Odoo Community Association

=====================
Openupgrade Framework
=====================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:5798eba54677737dfb52eec94d10de67ba298ebfdda05d8173dc4a802c8be38e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2FOpenUpgrade-lightgray.png?logo=github
:target: https://github.com/OCA/OpenUpgrade/tree/20.0/openupgrade_framework
:alt: OCA/OpenUpgrade
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/OpenUpgrade-20-0/OpenUpgrade-20-0-openupgrade_framework
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/OpenUpgrade&target_branch=20.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This module is a technical module that contains a number of
monkeypatches to improve the behaviour of Odoo when migrating your
database using the OpenUpgrade migration scripts:

- Prevent dropping columns or tables in the database when fields or
models are obsoleted in the Odoo data model of the target release.
After the migration, you can review and delete unused database tables
and columns using database_cleanup. See
https://odoo-community.org/shop/product/database-cleanup-918
- When data records are deleted during the migration (such as views or
other system records), this is done in a secure mode. If the deletion
fails because of some unforeseen dependency, the deletion will be
cancelled and a message is logged, after which the migration
continues.
- Prevent a number of log messages that do not apply when using
OpenUpgrade.
- Suppress log messages about failed view validation, which are to be
expected during a migration.
- Run migration scripts for modules that are installed as new
dependencies of upgraded modules (when there are such scripts for
those particular modules)
- Production databases generated with demo data, will be transformed to
non-demo ones. If you want to avoid that, you have to pass through the
environment variable OPENUPGRADE_USE_DEMO, the value "yes".

For detailed documentation see:

- https://github.com/OCA/OpenUpgrade/
- https://oca.github.io/OpenUpgrade

**Table of contents**

.. contents::
:local:

Installation
============

This module does not need to be installed on a database. It simply needs
to be available via your ``addons-path``.

Configuration
=============

- call your odoo instance with the option
``--load=base,web,openupgrade_framework``

or

- add the key to your configuration file:

.. code:: shell

[options]
server_wide_modules = web,openupgrade_framework

When you load the module in either way of these ways, and you have the
openupgrade_scripts module in your addons path available, the
--upgrade-path option of Odoo will be set automatically to the location
of the OpenUpgrade migration scripts.

Development
===========

The odoo_patch folder contains python files in a tree that mimicks the
folder tree of the Odoo project. It contains a number of monkey patches
to improve the migration of an Odoo database between two major versions.

So far, we are able to make everything work without overwriting large
blocks of code, but if larger patches need to be added, please use the
method described below:

To see the patches added, you can use ``meld`` tools:

``meld PATH_TO_ODOO_FOLDER/odoo/ PATH_TO_OPENUPGRADE_FRAMEWORK_MODULE/odoo_patch``

To make more easy the diff analysis :

- Make sure the python files has the same path as the original one.
- Keep the same indentation as the original file. (using ``if True:`` if
required)
- Add the following two lines at the beginning of your file, to avoid
flake8 / pylint errors

.. code:: python

# flake8: noqa
# pylint: skip-file

- When you want to change the code. add the following tags:

For an addition:

.. code:: python

# <OpenUpgrade:ADD>
some code...
# </OpenUpgrade>

For a change:

.. code:: python

# <OpenUpgrade:CHANGE>
some code...
# </OpenUpgrade>

For a removal:

.. code:: python

# <OpenUpgrade:REMOVE>
# Comment the code, instead of removing it.
# </OpenUpgrade>

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/OpenUpgrade/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 <https://github.com/OCA/OpenUpgrade/issues/new?body=module:%20openupgrade_framework%0Aversion:%2020.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Therp BV
* Opener B.V.
* GRAP
* Hunki Enterprises BV

Contributors
------------

- Stefan Rijnhart <stefan@opener.amsterdam>
- Sylvain LE GAL <https://twitter.com/legalsylvain>

Other credits
-------------

Many developers have contributed to the OpenUpgrade framework in its
previous incarnation. Their original contributions may no longer needed,
or they are no longer recognizable in their current form but OpenUpgrade
would not have existed at this point without them.

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

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.

.. |maintainer-legalsylvain| image:: https://github.com/legalsylvain.png?size=40px
:target: https://github.com/legalsylvain
:alt: legalsylvain
.. |maintainer-StefanRijnhart| image:: https://github.com/StefanRijnhart.png?size=40px
:target: https://github.com/StefanRijnhart
:alt: StefanRijnhart
.. |maintainer-hbrunn| image:: https://github.com/hbrunn.png?size=40px
:target: https://github.com/hbrunn
:alt: hbrunn

Current `maintainers <https://odoo-community.org/page/maintainer-role>`__:

|maintainer-legalsylvain| |maintainer-StefanRijnhart| |maintainer-hbrunn|

This module is part of the `OCA/OpenUpgrade <https://github.com/OCA/OpenUpgrade/tree/20.0/openupgrade_framework>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
33 changes: 33 additions & 0 deletions openupgrade_framework/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import logging
import os

from odoo.modules import get_module_path
from odoo.tools import config

from . import odoo_patch

if not config.get("upgrade_path"):
path = get_module_path("openupgrade_scripts", display_warning=False)
if path and os.path.isdir(os.path.join(path, "scripts")):
logging.getLogger(__name__).info(
"Setting upgrade_path to the scripts directory inside the module "
"location of openupgrade_scripts"
)
config["upgrade_path"] = os.path.join(path, "scripts")


def openupgrade_test(cls):
"""
Set attributes on a test class necessary for the test framework
Use as decorator on test classes in openupgrade_scripts/scripts/*/tests/test_*.py
"""
tags = getattr(cls, "test_tags", None) or set()
if "openupgrade" not in tags:
tags.add("openupgrade")
if not any(t.endswith("_install") for t in tags):
tags.add("at_install")
cls.test_tags = tags
cls.test_module = cls.__module__.split(".")[2]
cls.test_class = cls.__name__
cls.test_sequence = 0
return cls
18 changes: 18 additions & 0 deletions openupgrade_framework/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Copyright Odoo Community Association (OCA)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
"name": "Openupgrade Framework",
"summary": "Module to add in the server_wide_modules "
"option to make upgrades between two major revisions.",
"author": "Odoo Community Association (OCA), Therp BV, Opener B.V., GRAP, "
"Hunki Enterprises BV",
"maintainers": ["legalsylvain", "StefanRijnhart", "hbrunn"],
"website": "https://github.com/OCA/OpenUpgrade",
"category": "Migration",
"version": "20.0.1.0.0",
"license": "AGPL-3",
"depends": ["base"],
"images": ["static/description/banner.jpg"],
"external_dependencies": {"python": ["openupgradelib"]},
"installable": True,
}
1 change: 1 addition & 0 deletions openupgrade_framework/odoo_patch/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import odoo
1 change: 1 addition & 0 deletions openupgrade_framework/odoo_patch/odoo/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import addons, modules, orm
1 change: 1 addition & 0 deletions openupgrade_framework/odoo_patch/odoo/addons/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import base
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from . import ir_model
from . import ir_module
from . import ir_ui_view
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# Copyright Odoo Community Association (OCA)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from openupgradelib import openupgrade

from odoo import api, models

from odoo.addons.base.models.ir_model import (
IrModel,
IrModelFields,
IrModelRelation,
)


def _drop_table(self):
"""Never drop tables"""
for model in self:
if self.env.get(model.model) is not None:
openupgrade.message(
self.env.cr,
self.env.context.get("module", "Unknown"),
False,
False,
"Not dropping the table or view of model %s",
model.model,
)


IrModel._drop_table = _drop_table


@api.ondelete(at_uninstall=False)
def _unlink_related_attachments(self):
"""Never delete attachments (incl. binary field data) of removed models"""
for model in self:
openupgrade.message(
self.env.cr,
self.env.context.get("module", "Unknown"),
False,
False,
"Not deleting the attachments of model %s",
model.model,
)


IrModel._unlink_related_attachments = _unlink_related_attachments


def _drop_column(self):
"""Never drop columns"""
for field in self:
if field.name in models.MAGIC_COLUMNS:
continue
openupgrade.message(
self.env.cr,
self.env.context.get("module", "Unknown"),
False,
False,
"Not dropping the column of field %s of model %s",
field.name,
field.model,
)
continue


IrModelFields._drop_column = _drop_column


def _module_data_uninstall(self):
"""Don't delete many2many relation tables. Only unlink the
ir.model.relation record itself.
"""
self.unlink()


IrModelRelation._module_data_uninstall = _module_data_uninstall
Loading
Loading