odoo-upgrade について
odoo-upgradeは、Odooモジュールを14~19に移行する開発者向けのスキルです。分析、変換、検証、テストの段階的な手順と、バージョン別の移行情報をまとめています。
主な機能
- 01段階的なアップグレード手順
- 02XMLとビューの移行ガイド
- 03Python APIの移行情報
- 04JavaScriptとOWLの更新
- 05テーマとBootstrapの変更
- 06データ移行パターン
活用シーン
- 01モジュールの新しいOdooバージョンへの準備
- 02フロントエンドのRPC互換性エラーの解消
- 03XMLビューとポータルテンプレートの更新
- 04モデルとフィールドのデータ移行計画
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ahmed-lakosha/ odoo-plugins --skill odoo-upgradeインストール後、Claude Code で/odoo-upgradeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
reference/error_catalog.mdodoo18_to_19.mdscripts/__init__.pycli.pyprecheck.pyupgrade.pyutils.pyvalidate.pyscripts/transforms/__init__.pyjs_transforms.pymanifest.pypy_transforms.pyxml_transforms.py詳細
Odoo Upgrade Assistant v5.0
使用する場面
次の場合に有効化します:
- Odoo モジュールをバージョン間(14~19)でアップグレードする場合
- バージョン互換性エラーを修正する場合
- テーマまたはカスタムモジュールを移行する場合
- フロントエンドの RPC サービスエラーを解決する場合
- XML ビューを変換する場合(tree->list、検索グループ)
- Odoo 18/19 のテーマ用に SCSS 変数を更新する場合
- ポータルビューの XPath 継承エラーを修正する場合
- JavaScript を OWL v1 から v2 に移行する場合
アップグレードのワークフロー
- 分析 -
__manifest__.pyを読み込み、ソースバージョンを特定し、すべてのファイルをスキャンします - バックアップ - 変更前にタイムスタンプ付きのバックアップを作成します
- 事前チェック -
scripts/cli.py precheck <path> --target <version>を実行し、すべての問題を特定します - 変換 - マニフェスト、XML、Python、JS、SCSS の順に変換を適用します
- 検証 -
scripts/cli.py validate <path>を実行し、構文を確認します - テスト - モジュールをインストールします:
python -m odoo -d DB -i MODULE --stop-after-init
XML/ビューの変換
Tree から List への変換(Odoo 19)
<tree> -> <list>, </tree> -> </list>
tree,form -> list,form
//tree -> //list
edit="1" attribute
検索ビュー(Odoo 19)
<group> タグを削除し、フィルターをルートレベルに配置します。group_by フィルターの前に <separator/> を追加します。
カンバンテンプレート(Odoo 19)
t-name="kanban-box" -> t-name="card"。js_class="crm_kanban" を削除します。
Cron ジョブ(Odoo 19)
<field name="numbercall"> を削除します。このフィールドは存在しなくなりました。
フォームビューのコンテキスト(Odoo 19)
コンテキスト式の active_id を id に置き換えます。
スニペットオプション(Odoo 19)
website.snippet_options を継承するテンプレートを削除します。システムが再設計されました。
Attrs からインライン属性への変換(Odoo 18/19)
attrs="{'invisible': [('state','=','draft')]}" -> invisible="state == 'draft'"
Python API の移行
Slug/Unslug(Odoo 18+)
# Old: from odoo.addons.http_routing.models.ir_http import slug
# New: use request.env['ir.http']._slug(value)
URL For(Odoo 19)
# Old: from odoo.addons.http_routing.models.ir_http import url_for
# New: self.env['ir.http']._url_for('/path')
コントローラーのタイプ(Odoo 19)
@http.route デコレーター内の type='json' を type='jsonrpc' に置き換えます。
ビューモード(Odoo 19)
Python の辞書内の 'view_mode': 'tree' を 'view_mode': 'list' に置き換えます。
JavaScript/OWL の移行
RPC サービス(Odoo 19)
RPC サービスはフロントエンド/パブリックコンポーネントでは利用できません。useService("rpc") を、CSRF トークンを処理する Fetch API を使った _jsonRpc ヘルパーメソッドに置き換えます。
OWL ライフサイクルフック(Odoo 18+)
| OWL 1.x(Odoo 14-17) | OWL 2.0(Odoo 18+) |
|---|---|
constructor(parent, props) | setup() |
willStart() | onWillStart(callback) |
mounted() | onMounted(callback) |
patched() | onPatched(callback) |
willUnmount() | onWillUnmount(callback) |
willUpdateProps() | onWillUpdateProps(callback) |
テーマの SCSS 変数(Odoo 19)
Bootstrap のプレフィックスなしの変数ではなく、$o-theme-* プレフィックス付きの変数を使用します:
$headings-font-weight->$o-theme-headings-font-weight$font-size-base->$o-theme-font-size-base
カラーパレットには 'menu'、'footer'、'copyright' の割り当てを含める必要があります:
$o-color-palettes: map-merge($o-color-palettes, (
'my_theme': (
'o-color-1': #124F81,
'menu': 1,
'footer': 4,
'copyright': 5,
),
));
ポータルビューの XPath 移行(Odoo 19)
販売ポータルのテンプレートは、名前付きセレクターを使う構造に変更されました:
ヘッダー:th[@id='product_qty_header']、th[@id='product_unit_price_header']、th[@id='product_discount_header']、th[@id='taxes_header']、th[@id='subtotal_header']
本文:tr[@name='tr_product']、td[@name='td_product_name']、td[@name='td_product_quantity']、td[@name='td_product_priceunit']、td[@name='td_product_discount']、td[@name='td_product_taxes']、td[@name='td_product_subtotal']
メールテンプレートの移行(Odoo 19)
フォーマットヘルパーから env パラメーターを削除します:
format_datetime(env, object.date_start)
format_datetime(object.date_start)
XML のエンティティエンコーディングには数値参照を使用します:
© -> ©、 ->  、— -> —
Bootstrap 4 から 5 へのクラス移行
| Bootstrap 4 | Bootstrap 5 |
|---|---|
ml-*/mr-* | ms-*/me-* |
pl-*/pr-* | ps-*/pe-* |
text-left/text-right | text-start/text-end |
float-left/float-right | float-start/float-end |
sr-only | visually-hidden |
badge-primary | bg-primary |
font-weight-bold | fw-bold |
no-gutters | g-0 |
データ移行スクリプト
移行スクリプトは module/migrations/VERSION/ に配置します。
pre-migrate.py— ORM の更新前(生の SQL のみ使用)post-migrate.py— ORM の更新後(env/ORM を使用可能)end-migrate.py— すべてのモジュールの更新後(クリーンアップ)
各スクリプトには def migrate(cr, version): を定義し、if not version: return でガードしてください。
一般的なパターン:
| パターン | 移行前 | 移行後 |
|---|---|---|
| フィールド名の変更 | 値をバックアップ | レコードにマッピング |
| 選択肢から M2O への変更 | 値をバックアップ | レコードにマッピング |
| 必須フィールドの追加 | 何もしない | デフォルト値を設定 |
| モデル名の変更 | テーブルと ir_model_data の名前を変更 | 外部キーを更新 |
openupgradelib には、rename_fields()、rename_models()、rename_xmlids()、rename_columns()、logged_query() があります。
よくあるエラーの早見表
| エラー | 原因 | 対処方法 |
|---|---|---|
| Service rpc not available | フロントエンドでの useService("rpc") | _jsonRpc ヘルパーに置き換える |
| Invalid field numbercall | フィールドが削除された | cron XML から削除する |
| Invalid view definition (search) | 検索ビュー内の <group> | group タグを削除する |
| Missing card template | kanban-box の名前が変更された | t-name="card" を使用する |
| Cannot import slug | インポート先が移動した | 互換性ラッパーを使用する |
| website.snippet_options not found | システムが再設計された | テンプレートを削除する |
| active_id not found | コンテキストが変更された | id に置き換える |
バージョン固有の注意事項
Odoo 14 から 15
Bootstrap 4.x から 5.x へ、t-use-call を削除、決済プロバイダー API を変更、left/right から start/end へ
Odoo 15 から 16
Bootstrap 5.1.3 を標準化、Web フレームワークを再編、OWL v1 の採用を開始
Odoo 16 から 17
OWL v1 を全面採用、ウィジェットシステムを変更、publicWidget API を安定化
Odoo 17 から 18
OWL v1 から v2 への移行を開始、XML を一部変更、スニペットグループシステムを導入
Odoo 18 から 19
フロントエンドを大幅に刷新:RPC サービスを削除、スニペットシステムを刷新、kanban-box から card へ、検索の を禁止、tree から list へ、ポータルテンプレートを再構成、メールテンプレートヘルパーを変更、cron の numbercall を削除