Odoo 19 で XML ファイルから Python メソッドを実行する方法

Odoo のモジュール開発では、XML ファイルを用いた初期データのロードやインストール時の自動処理が頻繁に必要になります。特に、モジュールの有効化直後に特定のロジック(例:デフォルトレコードの生成、設定値の初期化、外部連携の準備など)を確実に実行したい場合、<function> 要素によるメソッド呼び出しが有効な手段です。

XML データファイルの構造と noupdate 属性

まず、data/ ディレクトリ内に XML ファイル(例:init_actions.xml)を作成します。基本構文は以下の通りです:

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
  <data noupdate="1">
    <!-- ここに function タグを記述 -->
  </data>
</odoo>

noupdate="1" は、モジュールのアップグレード時にその内容が再実行されないよう制御する属性です。これにより、インストール時のみ一度だけ実行される処理(例:初期設定の登録)を安全に定義できます。逆に noupdate="0" にすると、毎回のアップグレードで再実行されます(主にテストデータ用)。

モデル側の準備:Python メソッドの実装

呼び出すメソッドは、対象モデル内で @api.model デコレータ付きで定義します。以下は、product.template モデルを拡張して初期商品を登録する例です。

models/product_init.py

from odoo import models, api

class ProductTemplate(models.Model):
    _inherit = 'product.template'

    @api.model
    def create_default_products(self):
        """引数なしで実行される初期商品登録メソッド"""
        self.create([
            {'name': '標準サービス契約', 'type': 'service', 'list_price': 0.0},
            {'name': 'サポートパッケージA', 'type': 'service', 'list_price': 2500.0}
        ])

    @api.model
    def create_custom_product(self, product_name, price=0.0, product_type='service'):
        """引数付きメソッド:動的に商品を生成"""
        return self.create({
            'name': product_name,
            'type': product_type,
            'list_price': float(price)
        })

XML からの呼び出し:引数あり/なしの両パターン

<function> 要素は、model 属性でモデル名、name 属性でメソッド名を指定します。引数が必要な場合は、子要素として <value> を複数使用し、順序通りに渡します。

data/init_actions.xml

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
  <data noupdate="1">
    <!-- 引数なしメソッドの呼び出し -->
    <function model="product.template" name="create_default_products"/>

    <!-- 引数付きメソッドの呼び出し(3つの引数)-->
    <function model="product.template" name="create_custom_product">
      <value>クラウドバックアッププラン</value>
      <value>4990.0</value>
      <value>service</value>
    </function>
  </data>
</odoo>

マニフェストへの登録

作成した XML ファイルを __manifest__.pydata キーに追加します:

'data': [
    'data/init_actions.xml',
],

動作確認

モジュールを新規インストールまたはアップグレード後、Odoo のデータベースには以下のレコードが自動生成されます:

  • 「標準サービス契約」および「サポートパッケージA」(create_default_products による)
  • 「クラウドバックアッププラン」(create_custom_product で渡された引数に基づき生成)

このアプローチは、ユーザー操作を介さずに信頼性の高い初期化フローを実現するための、Odoo 標準の推奨手法です。

タグ: odoo19 xml-function product-template api-model noupdate

6月24日 17:46 投稿