From b8c1ed5cbdfd293b18a0ff659d3538691a79468e Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 20 Jan 2025 06:45:42 +0100 Subject: [PATCH 1/3] [ADD] patch Odoo to allow migration signature (env, version) --- openupgradelib/openupgrade.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/openupgradelib/openupgrade.py b/openupgradelib/openupgrade.py index d1604ebc..5f3c1a16 100644 --- a/openupgradelib/openupgrade.py +++ b/openupgradelib/openupgrade.py @@ -64,6 +64,15 @@ def __exit__(self, exc_type, exc_value, traceback): else: import release +try: + from odoo.modules.migration import VALID_MIGRATE_PARAMS + + # allow (env, version) signatures in migration methods + if ("env", "version") not in VALID_MIGRATE_PARAMS: + VALID_MIGRATE_PARAMS.append(("env", "version")) +except ImportError: # pylint: disable=except-pass + pass + Many2many = False One2many = False one2many = False From cc68305b1caec415f610e5f90016817f38e012b7 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 20 Jan 2025 06:46:20 +0100 Subject: [PATCH 2/3] [ADD] openupgrade_180.convert_company_dependent --- openupgradelib/openupgrade_180.py | 72 +++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 openupgradelib/openupgrade_180.py diff --git a/openupgradelib/openupgrade_180.py b/openupgradelib/openupgrade_180.py new file mode 100644 index 00000000..9fcd5d94 --- /dev/null +++ b/openupgradelib/openupgrade_180.py @@ -0,0 +1,72 @@ +# Copyright 2025 Hunki Enterprises BV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from .openupgrade import logged_query + + +def convert_company_dependent( + env, model_name, field_name, value_expression=None, old_field_id=None +): + """ + Company dependent fields used to live in ir.property, in v18 they are jsonb + dictionaries with company id as key and the company specific value as value. + + Default values are set in ir.default + + :param model_name: the name of the model + :param field_name: the name of the field + :param value_expression: an SQL expression extracting the value to be used + from a row of ir_property + :param old_field_id: in case a field has been renamed during the migration, + pass the field id of the previous field here + """ + Model = env[model_name] + Field = ( + env["ir.model.fields"]._get(model_name, field_name) + if not old_field_id + else env["ir.model.fields"].browse(old_field_id) + ) + value_expression = value_expression or ( + "value_%s" + % { + "float": "float", + "boolean": "integer", + "integer": "integer", + "date": "datetime", + "datetime": "datetime", + }.get(Field.ttype, "text") + if Field.ttype != "many2one" + else "SPLIT_PART(value_reference, ',', 2)::integer" + ) + + logged_query( + env.cr, + f"ALTER TABLE {Model._table} ADD COLUMN IF NOT EXISTS {field_name} jsonb", + ) + + logged_query( + env.cr, + f""" + UPDATE {Model._table} SET {field_name}=ir_property_by_company.value + FROM ( + SELECT + SPLIT_PART(res_id, ',', 2)::integer res_id, + JSON_OBJECT_AGG(company_id, {value_expression}) value + FROM ir_property + WHERE + fields_id={old_field_id or Field.id} AND res_id IS NOT NULL + AND company_id IS NOT NULL + GROUP BY res_id + ) ir_property_by_company + WHERE {Model._table}.id=ir_property_by_company.res_id + """, + ) + + env.cr.execute( + f""" + SELECT company_id, {value_expression} FROM ir_property + WHERE + fields_id={old_field_id or Field.id} AND res_id IS NULL + """ + ) + for company_id, value in env.cr.fetchall(): + env["ir.default"].set(model_name, field_name, value, company_id=company_id) From a1f4202c2d4da24ec366e040e7ba33b635aacc28 Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Mon, 20 Jan 2025 08:51:33 +0100 Subject: [PATCH 3/3] fixup! [ADD] patch Odoo to allow migration signature (env, version) --- openupgradelib/openupgrade.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openupgradelib/openupgrade.py b/openupgradelib/openupgrade.py index 5f3c1a16..76e5b33c 100644 --- a/openupgradelib/openupgrade.py +++ b/openupgradelib/openupgrade.py @@ -65,6 +65,8 @@ def __exit__(self, exc_type, exc_value, traceback): import release try: + # since 18.0, Odoo checks for the signature of migration functions + # and raises if the parameter names are not contained here from odoo.modules.migration import VALID_MIGRATE_PARAMS # allow (env, version) signatures in migration methods