mcpField
O
odoo-upgrade

odoo-upgrade

github.com/ahmed-lakosha開発76429 回インストール31 週間前に更新
リポジトリ

odoo-upgrade について

odoo-upgradeは、Odooモジュールを14~19に移行する開発者向けのスキルです。分析、変換、検証、テストの段階的な手順と、バージョン別の移行情報をまとめています。

主な機能

  1. 01段階的なアップグレード手順
  2. 02XMLとビューの移行ガイド
  3. 03Python APIの移行情報
  4. 04JavaScriptとOWLの更新
  5. 05テーマとBootstrapの変更
  6. 06データ移行パターン

活用シーン

  1. 01モジュールの新しいOdooバージョンへの準備
  2. 02フロントエンドのRPC互換性エラーの解消
  3. 03XMLビューとポータルテンプレートの更新
  4. 04モデルとフィールドのデータ移行計画

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/ahmed-lakosha/odoo-plugins --skill odoo-upgrade

インストール後、Claude Code で/odoo-upgradeを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

reference/
error_catalog.md
odoo18_to_19.md
scripts/
__init__.py
cli.py
precheck.py
upgrade.py
utils.py
validate.py
scripts/transforms/
__init__.py
js_transforms.py
manifest.py
py_transforms.py
xml_transforms.py

詳細

Odoo Upgrade Assistant v5.0

使用する場面

次の場合に有効化します:

  • Odoo モジュールをバージョン間(14~19)でアップグレードする場合
  • バージョン互換性エラーを修正する場合
  • テーマまたはカスタムモジュールを移行する場合
  • フロントエンドの RPC サービスエラーを解決する場合
  • XML ビューを変換する場合(tree->list、検索グループ)
  • Odoo 18/19 のテーマ用に SCSS 変数を更新する場合
  • ポータルビューの XPath 継承エラーを修正する場合
  • JavaScript を OWL v1 から v2 に移行する場合

アップグレードのワークフロー

  1. 分析 - __manifest__.py を読み込み、ソースバージョンを特定し、すべてのファイルをスキャンします
  2. バックアップ - 変更前にタイムスタンプ付きのバックアップを作成します
  3. 事前チェック - scripts/cli.py precheck <path> --target <version> を実行し、すべての問題を特定します
  4. 変換 - マニフェスト、XML、Python、JS、SCSS の順に変換を適用します
  5. 検証 - scripts/cli.py validate <path> を実行し、構文を確認します
  6. テスト - モジュールをインストールします: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 のエンティティエンコーディングには数値参照を使用します: &copy; -> &#169;、&nbsp; -> &#160;、&mdash; -> &#8212;

Bootstrap 4 から 5 へのクラス移行

Bootstrap 4Bootstrap 5
ml-*/mr-*ms-*/me-*
pl-*/pr-*ps-*/pe-*
text-left/text-righttext-start/text-end
float-left/float-rightfloat-start/float-end
sr-onlyvisually-hidden
badge-primarybg-primary
font-weight-boldfw-bold
no-guttersg-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 templatekanban-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 を削除

参考資料

コメント