Skip to content

Commit

Permalink
Merge pull request #4427 from royle-viindoo/v17_mig_openupgrade_frame…
Browse files Browse the repository at this point in the history
…work_base

[MIG] openupgrade_framework, base v17
  • Loading branch information
pedrobaeza authored May 23, 2024
2 parents d9f6169 + 52de874 commit ed43b0d
Show file tree
Hide file tree
Showing 27 changed files with 1,242 additions and 4 deletions.
11 changes: 7 additions & 4 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ name: Test OpenUpgrade migration

on:
push:
branches: ["18.0*"]
branches: ["17.0*"]
pull_request:

jobs:
test:
Expand Down Expand Up @@ -90,9 +91,11 @@ jobs:
pip install asn1crypto
- name: Test data
run: |
for snippet in openupgrade/openupgrade_scripts/scripts/*/*/tests/data*.py; do
odoo-old/odoo-bin shell -d $DB < $snippet
done
if test -n "$(ls openupgrade/openupgrade_scripts/scripts/*/*/tests/data*.py 2> /dev/null)"; then
for snippet in openupgrade/openupgrade_scripts/scripts/*/*/tests/data*.py; do
odoo-old/odoo-bin shell -d $DB < $snippet
done
fi
- name: OpenUpgrade test
run: |
# select modules and perform the upgrade
Expand Down
1 change: 1 addition & 0 deletions build_openupgrade_docs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ DOC_PARTS="7.0/openerp/openupgrade/doc/source/modules50-60.rst
14.0/docsource/modules130-140.rst
15.0/docsource/modules140-150.rst
16.0/docsource/modules150-160.rst
17.0/docsource/modules160-170.rst
"
OUTPUT_DIR=${OUTPUT_DIR:-$DOC_BUILD_DIR}

Expand Down
205 changes: 205 additions & 0 deletions openupgrade_framework/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
=====================
Openupgrade Framework
=====================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:06d77ecf97625ec075fa31dde7f8f41bcf849fa13af0598f8c1de397348f2dfd
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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/licence-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/17.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-17-0/OpenUpgrade-17-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=17.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-block:: 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-block:: python
# flake8: noqa
# pylint: skip-file
* When you want to change the code. add the following tags:

For an addition:

.. code-block:: python
# <OpenUpgrade:ADD>
some code...
# </OpenUpgrade>
For a change:

.. code-block:: python
# <OpenUpgrade:CHANGE>
some code...
# </OpenUpgrade>
For a removal:

.. code-block:: 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:%2017.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

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

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

|maintainer-legalsylvain| |maintainer-StefanRijnhart|

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

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
16 changes: 16 additions & 0 deletions openupgrade_framework/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
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:
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")
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 integrate 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": "17.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, api, models, modules
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,2 @@
from . import ir_model
from . import ir_ui_view
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# 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,
IrModelData,
IrModelFields,
IrModelRelation,
IrModelSelection,
)


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,
"Unknown",
False,
False,
"Not dropping the table or view of model %s",
model.model,
)


IrModel._drop_table = _drop_table


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


IrModelFields._drop_column = _drop_column


@api.model
def _module_data_uninstall(self, modules_to_remove):
"""To pass context, that the patch in __getitem__ of api.Environment uses"""
patched_self = self.with_context(**{"missing_model": True})
return IrModelData._module_data_uninstall._original_method(
patched_self, modules_to_remove
)


_module_data_uninstall._original_method = IrModelData._module_data_uninstall
IrModelData._module_data_uninstall = _module_data_uninstall


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


def _process_ondelete(self):
"""Don't break on missing models when deleting their selection fields"""
to_process = self.browse([])
for selection in self:
try:
self.env[selection.field_id.model] # pylint: disable=pointless-statement
to_process += selection
except KeyError:
continue
return IrModelSelection._process_ondelete._original_method(to_process)


_process_ondelete._original_method = IrModelSelection._process_ondelete
IrModelSelection._process_ondelete = _process_ondelete
Loading

0 comments on commit ed43b0d

Please sign in to comment.