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__.py の data キーに追加します:
'data': [
'data/init_actions.xml',
],
動作確認
モジュールを新規インストールまたはアップグレード後、Odoo のデータベースには以下のレコードが自動生成されます:
- 「標準サービス契約」および「サポートパッケージA」(
create_default_productsによる) - 「クラウドバックアッププラン」(
create_custom_productで渡された引数に基づき生成)
このアプローチは、ユーザー操作を介さずに信頼性の高い初期化フローを実現するための、Odoo 標準の推奨手法です。