From 8a7d91d522e7d81cb91ffc3e6af80995489824ba Mon Sep 17 00:00:00 2001 From: Don Kendall Date: Thu, 14 May 2026 20:45:23 -0400 Subject: [PATCH 1/3] [ADD] partner_autocomplete: cleanup obsolete res.partner/res.company fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 18.0 partner_autocomplete module added three fields that no longer exist in 19.0: - res.company.partner_gid - res.partner.additional_info - res.partner.partner_gid Per upgrade_analysis.txt those are DEL. The script directory previously contained only upgrade_analysis.txt — no pre-migration.py and no upgrade_analysis_work.txt — so the migration relied on Odoo's standard upgrade flow to clean up the stale ir_model_fields rows and the matching inheritance views (view_partner_simple_form_inherit_partner_autocomplete, view_res_partner_form_inherit_partner_autocomplete, both also DEL in the analysis). That flow does not in fact prune them — the rows survive and trip cross-cutting view validation when later modules' data XML loads (reproduced on l10n_ae/data/account_tax_report_data.xml:3 with the error "Field 'partner_gid' does not exist in model 'res.partner'"). Add a pre-migration that deletes the stale field xml_ids + the orphan view xml_ids via openupgrade.delete_records_safely_by_xml_id, and a companion upgrade_analysis_work.txt that annotates the analysis blocks. Reproduced and verified on the same fresh 18.0 CE-all install used for the hr companion PR; with this patch and the hr/loyalty companions applied, the migration progresses past the previous crash point and continues into the next module's load. --- .../19.0.1.1/pre-migration.py | 45 +++++++++++++++++++ .../19.0.1.1/upgrade_analysis_work.txt | 38 ++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/pre-migration.py create mode 100644 openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/upgrade_analysis_work.txt diff --git a/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/pre-migration.py b/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/pre-migration.py new file mode 100644 index 000000000000..6a8b7be14c1b --- /dev/null +++ b/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/pre-migration.py @@ -0,0 +1,45 @@ +# Copyright 2026 ledoent +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from openupgradelib import openupgrade + +# Fields the 18.0 partner_autocomplete module added that no longer exist +# anywhere in 19.0 (verified: not defined on res.partner, res.company, or +# any partner_autocomplete model). Per upgrade_analysis.txt: +# res.company.partner_gid : DEL +# res.partner.additional_info: DEL +# res.partner.partner_gid : DEL +# Odoo's standard registry rebuild does not prune the stale ir_model_fields +# rows when the donor module is upgraded; the rows + matching ir_ui_view +# records (also DEL'd in 19.0 per analysis: +# view_partner_simple_form_inherit_partner_autocomplete +# view_res_partner_form_inherit_partner_autocomplete) survive and trip +# cross-cutting view validation later in the same migration run +# (reproduced on l10n_ae/data/account_tax_report_data.xml). +_obsolete_field_xmlids = [ + "partner_autocomplete.field_res_company__partner_gid", + "partner_autocomplete.field_res_partner__additional_info", + "partner_autocomplete.field_res_partner__partner_gid", +] + +_obsolete_view_xmlids = [ + "partner_autocomplete.view_partner_simple_form_inherit_partner_autocomplete", + "partner_autocomplete.view_res_partner_form_inherit_partner_autocomplete", +] + + +def cleanup_obsolete_partner_autocomplete_records(env): + """ + Drop stale ir_model_fields rows and orphan ir_ui_view records for + fields/views the 18.0 partner_autocomplete module added that don't + exist in 19.0. See upgrade_analysis_work.txt for the full block. + """ + openupgrade.delete_records_safely_by_xml_id( + env, + _obsolete_field_xmlids + _obsolete_view_xmlids, + ) + + +@openupgrade.migrate() +def migrate(env, version): + cleanup_obsolete_partner_autocomplete_records(env) diff --git a/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/upgrade_analysis_work.txt new file mode 100644 index 000000000000..5e270e55dafe --- /dev/null +++ b/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/upgrade_analysis_work.txt @@ -0,0 +1,38 @@ +---Models in module 'partner_autocomplete'--- +obsolete model res.partner.autocomplete.sync + +# NOTHING TO DO: standard module-removal flow handles the table drop + +---Fields in module 'partner_autocomplete'--- +partner_autocomplete / res.company / partner_gid (integer) : DEL +partner_autocomplete / res.partner / additional_info (char) : DEL +partner_autocomplete / res.partner / partner_gid (integer) : DEL + +# DONE: stale ir_model_fields rows and the orphan inheritance views +# (referenced under XML records below) are deleted in pre-migration +# via cleanup_obsolete_partner_autocomplete_records. Without this, the +# rows survive the standard module upgrade and trip cross-cutting view +# validation when later modules' data XML loads (reproduced on +# l10n_ae/data/account_tax_report_data.xml:3 with the error +# 'Field partner_gid does not exist in model res.partner'). + +partner_autocomplete / res.partner.autocomplete.sync / partner_id (many2one) : DEL relation: res.partner +partner_autocomplete / res.partner.autocomplete.sync / synched (boolean) : DEL + +# NOTHING TO DO: covered by the obsolete-model removal above + +---XML records in module 'partner_autocomplete'--- +DEL ir.cron: partner_autocomplete.ir_cron_partner_autocomplete +DEL ir.model.access: partner_autocomplete.access_partner_autocomplete_sync_portal +DEL ir.model.access: partner_autocomplete.access_partner_autocomplete_sync_system +DEL ir.model.access: partner_autocomplete.access_partner_autocomplete_sync_user + +# NOTHING TO DO: deleted by standard module upgrade + +DEL ir.ui.view: partner_autocomplete.view_partner_simple_form_inherit_partner_autocomplete +DEL ir.ui.view: partner_autocomplete.view_res_partner_form_inherit_partner_autocomplete + +# DONE: explicitly deleted in pre-migration. Without this, the views +# survive the standard upgrade (Odoo only deletes views whose xml_id +# is in the noupdate-cleanup queue, and these were noupdate=False) and +# their arch_db retains stale field references that block later loads. From d608bd777b5091d3315380274fef78e6d157b03a Mon Sep 17 00:00:00 2001 From: Don Kendall Date: Wed, 10 Jun 2026 19:46:17 -0400 Subject: [PATCH 2/3] =?UTF-8?q?[FIX]=20docsource:=20mark=20partner=5Fautoc?= =?UTF-8?q?omplete=20Done=20=E2=80=94=20scripts=20ship=20in=20this=20PR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docsource/modules180-190.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docsource/modules180-190.rst b/docsource/modules180-190.rst index fd4b86e2175e..94586ea2fe4f 100644 --- a/docsource/modules180-190.rst +++ b/docsource/modules180-190.rst @@ -772,7 +772,7 @@ Module coverage 18.0 -> 19.0 +---------------------------------------------------+----------------------+-------------------------------------------------+ | onboarding |Nothing to do | | +---------------------------------------------------+----------------------+-------------------------------------------------+ -| partner_autocomplete | | | +| partner_autocomplete |Done | | +---------------------------------------------------+----------------------+-------------------------------------------------+ | |new| partnership | | | +---------------------------------------------------+----------------------+-------------------------------------------------+ From e421ed35192eb0b690fb28cf2472a372998eef58 Mon Sep 17 00:00:00 2001 From: Don Kendall Date: Wed, 10 Jun 2026 20:19:37 -0400 Subject: [PATCH 3/3] [FIX] partner_autocomplete: cascade view deletes, drop ineffective field deletes Without delete_childs=True the helper silently flips inheriting views to noupdate=True and the validation trap survives; the field-xmlid deletes never worked (non-manual fields raise, caught by the helper) and the module's own update prunes those rows. --- .../19.0.1.1/pre-migration.py | 19 ++++++++----------- .../19.0.1.1/upgrade_analysis_work.txt | 9 +++++---- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/pre-migration.py b/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/pre-migration.py index 6a8b7be14c1b..36d3368f1107 100644 --- a/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/pre-migration.py +++ b/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/pre-migration.py @@ -16,12 +16,6 @@ # view_res_partner_form_inherit_partner_autocomplete) survive and trip # cross-cutting view validation later in the same migration run # (reproduced on l10n_ae/data/account_tax_report_data.xml). -_obsolete_field_xmlids = [ - "partner_autocomplete.field_res_company__partner_gid", - "partner_autocomplete.field_res_partner__additional_info", - "partner_autocomplete.field_res_partner__partner_gid", -] - _obsolete_view_xmlids = [ "partner_autocomplete.view_partner_simple_form_inherit_partner_autocomplete", "partner_autocomplete.view_res_partner_form_inherit_partner_autocomplete", @@ -30,13 +24,16 @@ def cleanup_obsolete_partner_autocomplete_records(env): """ - Drop stale ir_model_fields rows and orphan ir_ui_view records for - fields/views the 18.0 partner_autocomplete module added that don't - exist in 19.0. See upgrade_analysis_work.txt for the full block. + Drop the orphan ir_ui_view records for fields the 18.0 + partner_autocomplete module added that don't exist in 19.0; cascade + to inheriting children so the helper can't silently fall back to + noupdate=True and leave the validation trap in place. The stale + ir_model_fields rows need no explicit delete (the helper can't + unlink non-manual fields; the module's own update prunes them). + See upgrade_analysis_work.txt for the full block. """ openupgrade.delete_records_safely_by_xml_id( - env, - _obsolete_field_xmlids + _obsolete_view_xmlids, + env, _obsolete_view_xmlids, delete_childs=True ) diff --git a/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/upgrade_analysis_work.txt b/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/upgrade_analysis_work.txt index 5e270e55dafe..75c776cb74c4 100644 --- a/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/upgrade_analysis_work.txt +++ b/openupgrade_scripts/scripts/partner_autocomplete/19.0.1.1/upgrade_analysis_work.txt @@ -8,10 +8,11 @@ partner_autocomplete / res.company / partner_gid (integer) partner_autocomplete / res.partner / additional_info (char) : DEL partner_autocomplete / res.partner / partner_gid (integer) : DEL -# DONE: stale ir_model_fields rows and the orphan inheritance views -# (referenced under XML records below) are deleted in pre-migration -# via cleanup_obsolete_partner_autocomplete_records. Without this, the -# rows survive the standard module upgrade and trip cross-cutting view +# DONE: orphan inheritance views (referenced under XML records below) +# deleted in pre-migration via cleanup_obsolete_partner_autocomplete_records, +# cascading to inheriting children; the stale ir_model_fields rows are +# pruned by the module's own update. Without the view delete, the rows +# survive the standard module upgrade and trip cross-cutting view # validation when later modules' data XML loads (reproduced on # l10n_ae/data/account_tax_report_data.xml:3 with the error # 'Field partner_gid does not exist in model res.partner').