[16.0 to 17.0] analytic.project_plan missing error blocks module loading before pre-migration script runs
メンテナーはふだん 3 日以内に返信
まだ誰も着手していません。
評価
調査の方向性
Start with the traceback: analytic_data.xml line 14 creates an account.analytic.plan record, which reaches _get_all_plans and _strict_column_name in analytic/models/analytic_plan.py and raises because analytic.project_plan is not yet set. Read the analytic and project pre-migration scripts under openupgrade_scripts/scripts/ to see when that parameter gets created. Done means the 16.0 to 17.0 load gets past analytic_data.xml without the UserError, which likely needs a change in script ordering or a guard in the migration, not a one-line edit. The thread is quiet and unresolved, so confirm with maintainers before starting.
索引モデルが issue の本文から書いたものです。
説明
Module
analytic and project
Bug description
While attempting a migration from Odoo 14.0 to 18.0 using OpenUpgrade, the process fails during the phase 16.0 to 17.0, during the module loading phase due to a missing system parameter: analytic.project_plan.
The issue originates from the core analytic module in Odoo 17, where the data file analytic_data.xml defines a record for the account.analytic.plan model. This triggers model logic that expects the analytic.project_plan system parameter to already exist — which it does not at this point.
The migration is being performed using the official OpenUpgrade migration scripts. These scripts correctly create the analytic.project_plan configuration parameter:
However, the error occurs before these scripts are executed. The registry fails to initialize when the system attempts to load the analytic_data.xml file and create the analytic_plan_projects record. During the creation, it calls methods that depend on analytic.project_plan, which is not yet defined in the system parameters at this point in the migration process.
This causes the migration to fail before any of the pre-migration.py scripts are even reached, making it impossible to let OpenUpgrade handle the parameter creation as intended.
Error Logs
2025-09-26 12:03:37,143 1 ERROR ou17 odoo.modules.registry: Failed to load registry
Traceback (most recent call last):
File "/opt/odoo/custom/src/odoo/odoo/tools/cache.py", line 99, in lookup
r = d[key]
File "<decorator-gen-5>", line 2, in __getitem__
File "/opt/odoo/custom/src/odoo/odoo/tools/func.py", line 87, in locked
return func(inst, *args, **kwargs)
File "/opt/odoo/custom/src/odoo/odoo/tools/lru.py", line 34, in __getitem__
a = self.d[obj]
KeyError: ('account.analytic.plan', <function AccountAnalyticPlan.__get_all_plans at 0x7afa1d9cc9d0>)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 556, in _tag_root
f(rec)
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 456, in _tag_record
record = model._load_records([data], self.mode == 'update')
File "/opt/odoo/custom/src/odoo/odoo/models.py", line 5088, in _load_records
records = self._load_records_create([data['values'] for data in to_create])
File "/opt/odoo/custom/src/odoo/odoo/models.py", line 4999, in _load_records_create
return self.create(values)
File "<decorator-gen-12>", line 2, in create
File "/opt/odoo/custom/src/odoo/odoo/api.py", line 415, in _model_create_multi
return create(self, arg)
File "/opt/odoo/custom/src/odoo/odoo/models.py", line 4658, in create
next(iter(fields)).determine_inverse(batch_recs)
File "/opt/odoo/custom/src/odoo/odoo/fields.py", line 1398, in determine_inverse
determine(self.inverse, records)
File "/opt/odoo/custom/src/odoo/odoo/fields.py", line 102, in determine
return needle(*args)
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 125, in _inverse_name
self._sync_plan_column()
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 262, in _sync_plan_column
prev = plan._find_plan_column()
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 255, in _find_plan_column
('name', 'in', [plan._strict_column_name() for plan in self]),
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 255, in <listcomp>
('name', 'in', [plan._strict_column_name() for plan in self]),
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 118, in _strict_column_name
project_plan, _other_plans = self._get_all_plans()
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 114, in _get_all_plans
return map(self.browse, self.__get_all_plans())
File "<decorator-gen-159>", line 2, in __get_all_plans
File "/opt/odoo/custom/src/odoo/odoo/tools/cache.py", line 104, in lookup
value = d[key] = self.method(*args, **kwargs)
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 109, in __get_all_plans
raise UserError(_("A 'Project' plan needs to exist and its id needs to be set as `analytic.project_plan` in the system variables"))
odoo.exceptions.UserError: A 'Project' plan needs to exist and its id needs to be set as `analytic.project_plan` in the system variables
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/opt/odoo/custom/src/odoo/odoo/modules/registry.py", line 114, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 476, in load_modules
processed_modules += load_marked_modules(env, graph,
File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 364, in load_marked_modules
loaded, processed = load_module_graph(
File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 227, in load_module_graph
load_data(env, idref, mode, kind='data', package=package)
File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 71, in load_data
tools.convert_file(env, package.name, filename, idref, mode, noupdate, kind)
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 627, in convert_file
convert_xml_import(env, module, fp, idref, mode, noupdate)
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 693, in convert_xml_import
obj.parse(doc.getroot())
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 613, in parse
self._tag_root(de)
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 556, in _tag_root
f(rec)
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 569, in _tag_root
raise ParseError('while parsing %s:%s, somewhere inside\n%s' % (
odoo.tools.convert.ParseError: while parsing /opt/odoo/auto/addons/analytic/data/analytic_data.xml:14, somewhere inside
<record id="analytic_plan_projects" model="account.analytic.plan">
<field name="name">Projects</field>
<field name="default_applicability">optional</field>
</record>
2025-09-26 12:03:37,146 1 CRITICAL ou17 odoo.service.server: Failed to initialize database `ou17`.
Traceback (most recent call last):
File "/opt/odoo/custom/src/odoo/odoo/tools/cache.py", line 99, in lookup
r = d[key]
File "<decorator-gen-5>", line 2, in __getitem__
File "/opt/odoo/custom/src/odoo/odoo/tools/func.py", line 87, in locked
return func(inst, *args, **kwargs)
File "/opt/odoo/custom/src/odoo/odoo/tools/lru.py", line 34, in __getitem__
a = self.d[obj]
KeyError: ('account.analytic.plan', <function AccountAnalyticPlan.__get_all_plans at 0x7afa1d9cc9d0>)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 556, in _tag_root
f(rec)
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 456, in _tag_record
record = model._load_records([data], self.mode == 'update')
File "/opt/odoo/custom/src/odoo/odoo/models.py", line 5088, in _load_records
records = self._load_records_create([data['values'] for data in to_create])
File "/opt/odoo/custom/src/odoo/odoo/models.py", line 4999, in _load_records_create
return self.create(values)
File "<decorator-gen-12>", line 2, in create
File "/opt/odoo/custom/src/odoo/odoo/api.py", line 415, in _model_create_multi
return create(self, arg)
File "/opt/odoo/custom/src/odoo/odoo/models.py", line 4658, in create
next(iter(fields)).determine_inverse(batch_recs)
File "/opt/odoo/custom/src/odoo/odoo/fields.py", line 1398, in determine_inverse
determine(self.inverse, records)
File "/opt/odoo/custom/src/odoo/odoo/fields.py", line 102, in determine
return needle(*args)
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 125, in _inverse_name
self._sync_plan_column()
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 262, in _sync_plan_column
prev = plan._find_plan_column()
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 255, in _find_plan_column
('name', 'in', [plan._strict_column_name() for plan in self]),
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 255, in <listcomp>
('name', 'in', [plan._strict_column_name() for plan in self]),
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 118, in _strict_column_name
project_plan, _other_plans = self._get_all_plans()
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 114, in _get_all_plans
return map(self.browse, self.__get_all_plans())
File "<decorator-gen-159>", line 2, in __get_all_plans
File "/opt/odoo/custom/src/odoo/odoo/tools/cache.py", line 104, in lookup
value = d[key] = self.method(*args, **kwargs)
File "/opt/odoo/auto/addons/analytic/models/analytic_plan.py", line 109, in __get_all_plans
raise UserError(_("A 'Project' plan needs to exist and its id needs to be set as `analytic.project_plan` in the system variables"))
odoo.exceptions.UserError: A 'Project' plan needs to exist and its id needs to be set as `analytic.project_plan` in the system variables
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/opt/odoo/custom/src/odoo/odoo/service/server.py", line 1313, in preload_registries
registry = Registry.new(dbname, update_module=update_module)
File "<decorator-gen-16>", line 2, in new
File "/opt/odoo/custom/src/odoo/odoo/tools/func.py", line 87, in locked
return func(inst, *args, **kwargs)
File "/opt/odoo/custom/src/odoo/odoo/modules/registry.py", line 114, in new
odoo.modules.load_modules(registry, force_demo, status, update_module)
File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 476, in load_modules
processed_modules += load_marked_modules(env, graph,
File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 364, in load_marked_modules
loaded, processed = load_module_graph(
File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 227, in load_module_graph
load_data(env, idref, mode, kind='data', package=package)
File "/opt/odoo/custom/src/odoo/odoo/modules/loading.py", line 71, in load_data
tools.convert_file(env, package.name, filename, idref, mode, noupdate, kind)
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 627, in convert_file
convert_xml_import(env, module, fp, idref, mode, noupdate)
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 693, in convert_xml_import
obj.parse(doc.getroot())
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 613, in parse
self._tag_root(de)
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 556, in _tag_root
f(rec)
File "/opt/odoo/custom/src/odoo/odoo/tools/convert.py", line 569, in _tag_root
raise ParseError('while parsing %s:%s, somewhere inside\n%s' % (
odoo.tools.convert.ParseError: while parsing /opt/odoo/auto/addons/analytic/data/analytic_data.xml:14, somewhere inside
<record id="analytic_plan_projects" model="account.analytic.plan">
<field name="name">Projects</field>
<field name="default_applicability">optional</field>
</record>
To Reproduce
Affected versions: 16.0, 17.0
Steps to reproduce the behavior:
- launch OpenUpgrade to migrate from 16.0 to 17.0 (or from 14.0 to 18.0 to be in the exact context), on an Odoo with addons analytic and project installed.
Expected behavior
Migration goes smoothly.
- 主要言語
- Python
- スター
- 995
- フォーク
- 837
- 平均マージ
- 2日 8時間
- マージ済み PR(30日)
- 12
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
OCA/OpenUpgrade のほかの issue
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
OCA/OpenUpgrade#5380 · コメント 1 件 ·
メンテナーはふだん 3 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 25/100
OCA/OpenUpgrade#6044 · コメント 6 件 · リアクション 6 件 ·
メンテナーはふだん 3 日以内に返信
-
bug
難易度 5/5 1週間以上 初心者へのやさしさ 35/100
OCA/OpenUpgrade#6004 · コメント 5 件 ·
メンテナーはふだん 3 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
OCA/OpenUpgrade#5594 ·
メンテナーはふだん 3 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 20/100
OCA/OpenUpgrade#5592 · コメント 1 件 ·
メンテナーはふだん 3 日以内に返信
OCA/OpenUpgrade の issue をすべて見る
似ている issue
-
PluginProvider.storeInstance races and clobbers the dedup cache for concurrent loads対応中かも @Wilson0511 が今日担当しました。 オープンneeds-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
メンテナーはふだん 2 日以内に返信
-
community documentation good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
kagent-dev/kagent#3462 ·
メンテナーはふだん 1 日以内に返信