diff --git a/docsource/modules160-170.rst b/docsource/modules160-170.rst index 0ae89b703492..0d66ae5d504b 100644 --- a/docsource/modules160-170.rst +++ b/docsource/modules160-170.rst @@ -70,7 +70,7 @@ Module coverage 16.0 -> 17.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | barcodes_gs1_nomenclature | |No DB layout changes. | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| base | | | +| base | Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ | base_address_extended | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ diff --git a/openupgrade_scripts/scripts/base/17.0.1.3/end-migration.py b/openupgrade_scripts/scripts/base/17.0.1.3/end-migration.py new file mode 100644 index 000000000000..90a00655babd --- /dev/null +++ b/openupgrade_scripts/scripts/base/17.0.1.3/end-migration.py @@ -0,0 +1,20 @@ +# Copyright 2024 Viindoo Technology Joint Stock Company (Viindoo) +# Copyright 2022 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openupgradelib import openupgrade + +_deleted_xml_records = [ + "base.icp_mail_bounce_alias", + "base.icp_mail_catchall_alias", + "base.icp_mail_default_from", +] + + +@openupgrade.migrate() +def migrate(env, version): + """Call disable_invalid_filters in every edition of openupgrade""" + openupgrade.disable_invalid_filters(env) + openupgrade.delete_records_safely_by_xml_id( + env, + _deleted_xml_records, + ) diff --git a/openupgrade_scripts/scripts/base/17.0.1.3/post-migration.py b/openupgrade_scripts/scripts/base/17.0.1.3/post-migration.py new file mode 100644 index 000000000000..6ea8031f4d7d --- /dev/null +++ b/openupgrade_scripts/scripts/base/17.0.1.3/post-migration.py @@ -0,0 +1,25 @@ +# Copyright 2024 Viindoo Technology Joint Stock Company (Viindoo) +# Copyright 2023 Hunki Enterprises BV (https://hunki-enterprises.com) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openupgradelib import openupgrade + +_deleted_xml_records = [ + "base.res_partner_rule_private_employee", + "base.res_partner_rule_private_group", +] + + +def _partner_update_complete_name(env): + partners = env["res.partner"].with_context(active_test=False).search([]) + partners._compute_complete_name() + + +@openupgrade.migrate() +def migrate(env, version): + openupgrade.load_data(env, "base", "17.0.1.3/noupdate_changes.xml") + openupgrade.delete_records_safely_by_xml_id( + env, + _deleted_xml_records, + ) + _partner_update_complete_name(env) diff --git a/openupgrade_scripts/scripts/base/17.0.1.3/pre-migration.py b/openupgrade_scripts/scripts/base/17.0.1.3/pre-migration.py new file mode 100644 index 000000000000..d08f7f7aa676 --- /dev/null +++ b/openupgrade_scripts/scripts/base/17.0.1.3/pre-migration.py @@ -0,0 +1,151 @@ +# Copyright 2024 Viindoo Technology Joint Stock Company (Viindoo) +# Copyright 2020 Odoo Community Association (OCA) +# Copyright 2020 Opener B.V. +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import logging + +from openupgradelib import openupgrade + +from odoo import tools + +from odoo.addons.openupgrade_scripts.apriori import merged_modules, renamed_modules + +_logger = logging.getLogger(__name__) + +_xmlids_renames = [ + ( + "mail.access_res_users_settings_all", + "base.access_res_users_settings_all", + ), + ( + "mail.access_res_users_settings_user", + "base.access_res_users_settings_user", + ), + ( + "mail.res_users_settings_rule_admin", + "base.res_users_settings_rule_admin", + ), + ( + "mail.res_users_settings_rule_user", + "base.res_users_settings_rule_user", + ), + ( + "mail.constraint_res_users_settings_unique_user_id", + "base.constraint_res_users_settings_unique_user_id", + ), +] + + +def _fill_ir_server_object_lines_into_action_server(cr): + openupgrade.logged_query( + cr, + """ + ALTER TABLE ir_act_server + ADD COLUMN IF NOT EXISTS evaluation_type VARCHAR, + ADD COLUMN IF NOT EXISTS resource_ref VARCHAR, + ADD COLUMN IF NOT EXISTS selection_value INTEGER, + ADD COLUMN IF NOT EXISTS update_boolean_value VARCHAR, + ADD COLUMN IF NOT EXISTS update_field_id INTEGER, + ADD COLUMN IF NOT EXISTS update_m2m_operation VARCHAR, + ADD COLUMN IF NOT EXISTS update_path VARCHAR, + ADD COLUMN IF NOT EXISTS update_related_model_id INTEGER, + ADD COLUMN IF NOT EXISTS value TEXT; + """, + ) + openupgrade.logged_query( + cr, + """ + WITH tmp AS ( + SELECT t1.id, t1.state, t2.col1, t2.value, t2.evaluation_type, + t3.name AS update_field_name, t3.ttype, + t3.relation, t4.id AS selection_field_id + FROM ir_act_server t1 + JOIN ir_server_object_lines t2 on t1.id = t2.server_id + JOIN ir_model_fields t3 on t2.col1 = t3.id + LEFT JOIN ir_model_fields_selection t4 on t3.id = t4.field_id + ) + UPDATE ir_act_server ias + SET + update_field_id = CASE + WHEN tmp.state = 'object_create' THEN NULL + WHEN tmp.state = 'object_write' THEN tmp.col1 + ELSE NULL + END, + update_path = CASE + WHEN tmp.state = 'object_create' THEN NULL + WHEN tmp.state = 'object_write' THEN tmp.update_field_name + ELSE NULL + END, + update_related_model_id = CASE + WHEN tmp.state = 'object_write' AND tmp.evaluation_type = 'value' + AND tmp.relation IS NOT NULL THEN + (SELECT id FROM ir_model WHERE model=tmp.relation LIMIT 1) + ELSE NULL + END, + update_m2m_operation = 'add', + evaluation_type = CASE + WHEN tmp.evaluation_type = 'value' then 'value' + WHEN tmp.evaluation_type = 'reference' then 'value' + WHEN tmp.evaluation_type = 'equation' then 'equation' + ELSE 'VALUE' + END, + value = tmp.value, + resource_ref = CASE + WHEN tmp.ttype in ('many2one', 'many2many') + THEN tmp.relation || ',' || tmp.value + ELSE NULL + END, + selection_value = CASE + WHEN tmp.ttype = 'selection' THEN tmp.selection_field_id + ELSE NULL + END, + update_boolean_value = CASE + WHEN tmp.ttype = 'boolean' then 'true' + ELSE NULL + END + FROM tmp + WHERE ias.id = tmp.id + """, + ) + + +def _partner_create_column_complete_name(cr): + openupgrade.logged_query( + cr, + """ + ALTER TABLE res_partner + ADD COLUMN IF NOT EXISTS complete_name VARCHAR; + """, + ) + + +def _update_partner_private_type(cr): + openupgrade.logged_query( + cr, + """ + UPDATE res_partner + SET type = 'contact' + WHERE type = 'private' + """, + ) + + +@openupgrade.migrate(use_env=False) +def migrate(cr, version): + """ + Don't request an env for the base pre-migration as flushing the env in + odoo/modules/registry.py will break on the 'base' module not yet having + been instantiated. + """ + if "openupgrade_framework" not in tools.config["server_wide_modules"]: + _logger.error( + "openupgrade_framework is not preloaded. You are highly " + "recommended to run the Odoo with --load=openupgrade_framework " + "when migrating your database." + ) + openupgrade.update_module_names(cr, renamed_modules.items()) + openupgrade.update_module_names(cr, merged_modules.items(), merge_modules=True) + openupgrade.rename_xmlids(cr, _xmlids_renames) + _fill_ir_server_object_lines_into_action_server(cr) + _update_partner_private_type(cr) + _partner_create_column_complete_name(cr) diff --git a/openupgrade_scripts/scripts/base/17.0.1.3/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/base/17.0.1.3/upgrade_analysis_work.txt new file mode 100644 index 000000000000..22577e76d946 --- /dev/null +++ b/openupgrade_scripts/scripts/base/17.0.1.3/upgrade_analysis_work.txt @@ -0,0 +1,279 @@ +---Models in module 'base'--- +obsolete model ir.server.object.lines +# Done pre-migration: fill value into ir.actions.server + +new model ir.model.inherit +# NOTHING TO DO: new feature to store model inheritance tree handle by Odoo registry itself + +model res.users.settings (moved from mail) +# Done pre-migration: rename xml + +---Fields in module 'base'--- +base / ir.actions.act_url / target (selection) : selection_keys is now '['download', 'new', 'self']' ('['new', 'self']') +base / ir.actions.act_window / mobile_view_mode (char) : NEW hasdefault: default +# NOTHING TO DO: new feature + +base / ir.actions.server / evaluation_type (selection) : NEW selection_keys: ['equation', 'value'], hasdefault: default +base / ir.actions.server / fields_lines (one2many) : DEL relation: ir.server.object.lines +base / ir.actions.server / resource_ref (reference) : NEW +base / ir.actions.server / selection_value (many2one) : NEW relation: ir.model.fields.selection +# Done pre-migration: fill value into ir.actions.server + +base / ir.actions.server / state (selection) : selection_keys is now '['code', 'multi', 'object_create', 'object_write', 'webhook']' ('['code', 'multi', 'object_create', 'object_write']') +# NOTHING TO DO: new feature + +base / ir.actions.server / update_boolean_value (selection): NEW selection_keys: ['false', 'true'], hasdefault: default +base / ir.actions.server / update_field_id (many2one) : NEW relation: ir.model.fields, hasdefault: compute +base / ir.actions.server / update_m2m_operation (selection): NEW selection_keys: ['add', 'clear', 'remove', 'set'], hasdefault: default +base / ir.actions.server / update_path (char) : NEW hasdefault: default +base / ir.actions.server / update_related_model_id (many2one): NEW relation: ir.model, isfunction: function, stored +base / ir.actions.server / value (text) : NEW +base / ir.actions.server / webhook_field_ids (many2many) : NEW relation: ir.model.fields +base / ir.actions.server / webhook_url (char) : NEW +# Done pre-migration: fill value into ir.actions.server + +base / ir.cron / cron_name (char) : not related anymore +base / ir.cron / cron_name (char) : now a function +base / ir.mail_server / _order : _order is now 'sequence, id' ('sequence') +base / ir.mail_server / smtp_authentication (selection): selection_keys is now '['certificate', 'cli', 'login']' ('['certificate', 'login']') +# NOTHING TO DO + +base / ir.model.fields / currency_field (char) : NEW +base / ir.model.fields / sanitize (boolean) : NEW hasdefault: default +base / ir.model.fields / sanitize_attributes (boolean) : NEW hasdefault: default +base / ir.model.fields / sanitize_form (boolean) : NEW hasdefault: default +base / ir.model.fields / sanitize_overridable (boolean): NEW hasdefault: default +base / ir.model.fields / sanitize_style (boolean) : NEW hasdefault: default +base / ir.model.fields / sanitize_tags (boolean) : NEW hasdefault: default +base / ir.model.fields / strip_classes (boolean) : NEW hasdefault: default +base / ir.model.fields / strip_style (boolean) : NEW hasdefault: default +# NOTHING TO DO: handle by odoo registry itself + +base / ir.model.inherit / model_id (many2one) : NEW relation: ir.model, required +base / ir.model.inherit / parent_field_id (many2one) : NEW relation: ir.model.fields +base / ir.model.inherit / parent_id (many2one) : NEW relation: ir.model, required +# NOTHING TO DO: new feature to store model inheritance tree handle by Odoo registry itself + +base / ir.property / type (selection) : selection_keys is now '['binary', 'boolean', 'char', 'date', 'datetime', 'float', 'html', 'integer', 'many2one', 'selection', 'text']' ('['binary', 'boolean', 'char', 'date', 'datetime', 'float', 'integer', 'many2one', 'selection', 'text']') +# NOTHING TO DO: new feature + +base / ir.server.object.lines / col1 (many2one) : DEL relation: ir.model.fields, required +base / ir.server.object.lines / evaluation_type (selection) : DEL required, selection_keys: ['equation', 'reference', 'value'] +base / ir.server.object.lines / server_id (many2one) : DEL relation: ir.actions.server +base / ir.server.object.lines / value (text) : DEL required +# Done pre-migration: fill value into ir.actions.server + +base / ir.ui.view / field_parent (char) : DEL +# NOTHING TO DO: deprecated from very longtime ago since https://github.com/odoo/odoo/commit/905e01921f3c3ef43ace6fc537d1d8c0d280002c 2017 + +base / res.company / all_child_ids (one2many) : NEW relation: res.company +base / res.company / parent_path (char) : NEW +# NOTHING TO DO: new branch feature + +base / res.company / base_onboarding_company_state (selection): DEL selection_keys: ['done', 'just_done', 'not_done'] +# NOTHING TO DO: but need to do in account module and some module that will use onboarding at post_install perhaps , use _search_or_create_progress method + +base / res.company / favicon (binary) : DEL attachment: True +# NOTHING TO DO: remove feature without replacement + +base / res.company / uses_default_logo (boolean) : NEW isfunction: function, stored +# NOTHING TO DO: computed by ORM + +base / res.country / code (char) : now required +# NOTHING TO DO: if it blank we will know where to fill in, normally it doesn't blank + +base / res.partner / _order : _order is now 'complete_name ASC, id DESC' ('display_name ASC, id DESC') +# NOTHING TO DO + +base / res.partner / complete_name (char) : NEW isfunction: function, stored +base / res.partner / display_name (char) : not stored anymore +# Done pre/post-migration: create column in pre and fill value in post + +base / res.partner / type (selection) : selection_keys is now '['contact', 'delivery', 'invoice', 'other']' ('['contact', 'delivery', 'invoice', 'other', 'private']') +# Done pre-migration: update 'private' type with 'contact' type + +base / res.users / res_users_settings_id (many2one): previously in module mail +base / res.users / res_users_settings_ids (one2many): previously in module mail +base / res.users.settings / _order : previously in module mail +base / res.users.settings / display_name (char) : previously in module mail +base / res.users.settings / user_id (many2one) : previously in module mail +# NOTHING TO DO + +---XML records in module 'base'--- +NEW ir.actions.act_window: base.ir_client_actions_report +DEL ir.actions.act_window: base.action_open_base_onboarding_company +DEL ir.actions.client: base.modules_act_cl +DEL ir.actions.client: base.modules_updates_act_cl +DEL ir.actions.server: base.action_server_module_immediate_install +# NOTHING TO DO: noupdate records + +DEL ir.config_parameter: base.icp_mail_bounce_alias (noupdate) +DEL ir.config_parameter: base.icp_mail_catchall_alias (noupdate) +DEL ir.config_parameter: base.icp_mail_default_from (noupdate) +# DONE: removed in end-migration, to create new alias domain record in mail module + +NEW ir.cron: base.ir_cron_res_users_deletion +NEW ir.model.access: base.access_ir_model_inherit +NEW ir.model.access: base.access_res_company_employee +NEW ir.model.access: base.access_res_company_portal +NEW ir.model.access: base.access_res_company_public +NEW ir.model.access: base.access_res_country_employee +NEW ir.model.access: base.access_res_country_group_employee +NEW ir.model.access: base.access_res_country_group_portal +NEW ir.model.access: base.access_res_country_group_public +NEW ir.model.access: base.access_res_country_portal +NEW ir.model.access: base.access_res_country_public +NEW ir.model.access: base.access_res_country_state_employee +NEW ir.model.access: base.access_res_country_state_portal +NEW ir.model.access: base.access_res_country_state_public +NEW ir.model.access: base.access_res_currency_employee +NEW ir.model.access: base.access_res_currency_portal +NEW ir.model.access: base.access_res_currency_public +NEW ir.model.access: base.access_res_currency_rate_employee +NEW ir.model.access: base.access_res_currency_rate_portal +NEW ir.model.access: base.access_res_currency_rate_public +NEW ir.model.access: base.access_res_lang_employee +NEW ir.model.access: base.access_res_lang_group_system +NEW ir.model.access: base.access_res_lang_portal +NEW ir.model.access: base.access_res_lang_public +NEW ir.model.access: base.access_res_users_employee +NEW ir.model.access: base.access_res_users_log_system +NEW ir.model.access: base.access_res_users_portal +NEW ir.model.access: base.access_res_users_public +# NOTHING TO DO: noupdate records + +NEW ir.model.access: base.access_res_users_settings_all [renamed from mail module] +NEW ir.model.access: base.access_res_users_settings_user [renamed from mail module] +# DONE: renamed in pre-migration + +DEL ir.model.access: base.access_ir_server_object_lines_group_system +DEL ir.model.access: base.access_res_company_group_user +DEL ir.model.access: base.access_res_country_group_all +DEL ir.model.access: base.access_res_country_group_group_all +DEL ir.model.access: base.access_res_country_state_group_all +DEL ir.model.access: base.access_res_currency_group_all +DEL ir.model.access: base.access_res_currency_rate_group_all +DEL ir.model.access: base.access_res_lang_group_all +DEL ir.model.access: base.access_res_lang_group_user +DEL ir.model.access: base.access_res_users_all +DEL ir.model.access: base.access_res_users_log_all +NEW ir.model.constraint: base.constraint_ir_model_fields_name_manual_field +NEW ir.model.constraint: base.constraint_ir_model_inherit_uniq +# NOTHING TO DO: noupdate records + +NEW ir.model.constraint: base.constraint_res_users_settings_unique_user_id [renamed from mail module] +# DONE: renamed in pre-migration + +NEW ir.module.category: base.module_category_services_appointment +NEW ir.module.module: base.module_sale_amazon (noupdate) +# NOTHING TO DO: new records + +NEW ir.rule: base.res_users_settings_rule_admin [renamed from mail module] (noupdate) +NEW ir.rule: base.res_users_settings_rule_user [renamed from mail module] (noupdate) +# DONE: renamed in pre-migration + +DEL ir.rule: base.res_partner_rule_private_employee (noupdate) +DEL ir.rule: base.res_partner_rule_private_group (noupdate) +# DONE: removed in post-migration + +NEW ir.ui.menu: base.menu_ir_client_actions_report +DEL ir.ui.menu: base.menu_board_root +DEL ir.ui.menu: base.menu_module_updates +DEL ir.ui.menu: base.menu_reporting_config +DEL ir.ui.menu: base.menu_reporting_dashboard +DEL ir.ui.menu: base.module_mi +NEW ir.ui.view: base.no_contact +NEW ir.ui.view: base.res_users_identitycheck_view_form +NEW ir.ui.view: base.res_users_identitycheck_view_form_revokedevices +NEW ir.ui.view: base.view_client_action_form +NEW ir.ui.view: base.view_client_action_tree +NEW ir.ui.view: base.view_country_search +DEL ir.ui.view: base.base_onboarding_company_form +DEL ir.ui.view: base.identity_check_wizard +DEL ir.ui.view: base.onboarding_company_step +DEL ir.ui.view: base.onboarding_container +DEL ir.ui.view: base.onboarding_step +DEL ir.ui.view: base.view_module_category_tree +# NOTHING TO DO: noupdate records + +NEW res.country.group: base.eurasian_economic_union (noupdate) +# NOTHING TO DO: new record + +NEW res.country.state: base.state_hk_hk +NEW res.country.state: base.state_hk_kln +NEW res.country.state: base.state_hk_nt +NEW res.country.state: base.state_ke_01 +NEW res.country.state: base.state_ke_02 +NEW res.country.state: base.state_ke_03 +NEW res.country.state: base.state_ke_04 +NEW res.country.state: base.state_ke_05 +NEW res.country.state: base.state_ke_06 +NEW res.country.state: base.state_ke_07 +NEW res.country.state: base.state_ke_08 +NEW res.country.state: base.state_ke_09 +NEW res.country.state: base.state_ke_10 +NEW res.country.state: base.state_ke_11 +NEW res.country.state: base.state_ke_12 +NEW res.country.state: base.state_ke_13 +NEW res.country.state: base.state_ke_14 +NEW res.country.state: base.state_ke_15 +NEW res.country.state: base.state_ke_16 +NEW res.country.state: base.state_ke_17 +NEW res.country.state: base.state_ke_18 +NEW res.country.state: base.state_ke_19 +NEW res.country.state: base.state_ke_20 +NEW res.country.state: base.state_ke_21 +NEW res.country.state: base.state_ke_22 +NEW res.country.state: base.state_ke_23 +NEW res.country.state: base.state_ke_24 +NEW res.country.state: base.state_ke_25 +NEW res.country.state: base.state_ke_26 +NEW res.country.state: base.state_ke_27 +NEW res.country.state: base.state_ke_28 +NEW res.country.state: base.state_ke_29 +NEW res.country.state: base.state_ke_30 +NEW res.country.state: base.state_ke_31 +NEW res.country.state: base.state_ke_32 +NEW res.country.state: base.state_ke_33 +NEW res.country.state: base.state_ke_34 +NEW res.country.state: base.state_ke_35 +NEW res.country.state: base.state_ke_36 +NEW res.country.state: base.state_ke_37 +NEW res.country.state: base.state_ke_38 +NEW res.country.state: base.state_ke_39 +NEW res.country.state: base.state_ke_40 +NEW res.country.state: base.state_ke_41 +NEW res.country.state: base.state_ke_42 +NEW res.country.state: base.state_ke_43 +NEW res.country.state: base.state_ke_44 +NEW res.country.state: base.state_ke_45 +NEW res.country.state: base.state_ke_46 +NEW res.country.state: base.state_ke_47 +NEW res.country.state: base.state_uy_01 +NEW res.country.state: base.state_uy_02 +NEW res.country.state: base.state_uy_03 +NEW res.country.state: base.state_uy_04 +NEW res.country.state: base.state_uy_05 +NEW res.country.state: base.state_uy_06 +NEW res.country.state: base.state_uy_07 +NEW res.country.state: base.state_uy_08 +NEW res.country.state: base.state_uy_09 +NEW res.country.state: base.state_uy_10 +NEW res.country.state: base.state_uy_11 +NEW res.country.state: base.state_uy_12 +NEW res.country.state: base.state_uy_13 +NEW res.country.state: base.state_uy_14 +NEW res.country.state: base.state_uy_15 +NEW res.country.state: base.state_uy_16 +NEW res.country.state: base.state_uy_17 +NEW res.country.state: base.state_uy_18 +NEW res.country.state: base.state_uy_19 +# NOTHING TO DO: noupdate records + +NEW res.currency: base.SLE (noupdate) +# NOTHING TO DO: new record + +DEL res.groups: base.group_private_addresses +NEW res.lang: base.lang_en_NZ +NEW res.lang: base.lang_es_419 +# NOTHING TO DO: noupdate records