odoo-17.0 について
Odoo 17.0 のモジュール開発者向けガイドです。ORM、ビュー、パフォーマンス、テストを、適切な例と不適切な例を交えて解説します。
主な機能
- 01モジュールマニフェストと構成規則
- 02ORM モデルとフィールド設計
- 03API デコレーターの指針
- 04レコードセットとクエリの性能対策
- 05テストとMixinのパターン
活用シーン
- 01Odoo 17.0 モジュールの新規作成や拡張
- 02モデル、フィールド、ビューの実装
- 03レコードセット処理やクエリの改善
- 04モジュールテストの作成とコードレビュー
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ alessandrorlm/ agent-skills --skill odoo-17.0インストール後、Claude Code で/odoo-17.0を入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdCLAUDE.mdskills/orm-recordsets.mdorm-models.mdactions.mdorm-decorators.mdperformance.mdmixins.mdorm-fields.mdmanifest.mdtesting.md詳細
Odoo 17.0 開発スキル
本番品質の Odoo 17.0 カスタムモジュールを構築するための包括的なスキルセットです。モジュール構造、ORM、ビュー、アクション、パフォーマンス、テストなど、公式の Odoo コーディングガイドラインに従った開発ライフサイクル全体をカバーします。
適用する場面
次の場合に、これらのルールを参照してください。
- カスタム Odoo 17.0 モジュールを作成または拡張するとき
- モデル、フィールド、または計算メソッドを定義するとき
@apiデコレーター、制約、または onchange ハンドラーを記述するとき- XML ビュー、メニュー、アクションを構築するとき
- クエリを最適化したり、大規模なレコードセットを処理したりするとき
- 単体テスト、統合テスト、または UI ツアーを記述するとき
- モデルに chatter、シーケンス、評価、またはポータルアクセスを追加するとき
優先度別のルールカテゴリ
| 優先度 | カテゴリ | 影響 | プレフィックス |
|---|---|---|---|
| 1 | モジュールマニフェスト | HIGH | manifest- |
| 2 | ORM モデル | HIGH | models- |
| 3 | ORM フィールド | HIGH | fields- |
| 4 | API デコレーター | HIGH | decorators- |
| 5 | レコードセットとドメイン | MEDIUM | recordsets- |
| 6 | アクション | MEDIUM | actions- |
| 7 | パフォーマンス | MEDIUM | performance- |
| 8 | テスト | MEDIUM | testing- |
| 9 | ミックスイン | LOW | mixins- |
クイックリファレンス
1. モジュールマニフェスト(HIGH)
manifest-required-keys— すべてのモジュールにname、version、depends、license、installableが必要ですmanifest-data-order—dataではセキュリティ CSV を必ず最初に配置し、メニューを必ず最後に配置しますmanifest-assets-bundle— JS/OWL/SCSS ファイルをassets.web.assets_backendに登録しますmanifest-version-format—{odoo}.{major}.{minor}.{patch}を使用します。例:17.0.1.0.0manifest-dependencies—dependsが欠落しているか、誤っていると、モジュールをインストールできません
2. ORM モデル(HIGH)
models-class-order— 属性 → フィールド → 制約 → 計算 → CRUD → アクション → ヘルパーという標準の順序に従いますmodels-type-selection— 永続化にはModel、ウィザードにはTransientModel、ミックスインにはAbstractModelを使用しますmodels-inherit-modes— 4 種類の_inheritモード(拡張、コピー、合成、委譲)を理解しますmodels-sql-constraints— 一意性チェックには Python より_sql_constraintsを優先しますmodels-required-attributes— 新しいすべてのモデルで_nameと_descriptionが必須です
3. ORM フィールド(HIGH)
fields-monetary-currency—Monetaryフィールドには、必ず対応するcurrency_fieldが必要ですfields-many2one-index— 検索に使用するMany2oneフィールドには、必ずindex=Trueを設定しますfields-store-decision— フィールドを検索または並べ替えに使用する必要がある場合にのみ、store=Trueを使用しますfields-m2m-commands— リレーショナルフィールドへの書き込みには ORM の書き込みコマンド(0,0,v)(4,id)(6,0,ids)を使用しますfields-selection-add—Selectionを拡張するときは、新しいキーに対して必ずondeleteを定義します
4. API デコレーター(HIGH)
decorators-depends-completeness— 計算結果に影響するフィールドをすべて列挙しますdecorators-depends-assign-all-branches— どのコードパスでも、計算フィールドに必ず値を代入しますdecorators-constrains-exception—@api.constrainsではValidationErrorを送出する必要があり、UserErrorは使用できませんdecorators-constrains-loop—@api.constrains内では必ずfor rec in selfでループしますdecorators-onchange-not-enforced—@api.onchangeは、プログラムからの create/write では実行されませんdecorators-onchange-newid—@api.onchange内のself.idは整数ではなくNewIdですdecorators-create-multi— 17.0 でcreate()をオーバーライドする際は、必ず@api.model_create_multiを使用しますdecorators-depends-context-no-store—@api.depends_contextを持つフィールドにはstore=Trueを設定できません
5. レコードセットとドメイン(MEDIUM)
recordsets-search-count— 件数を数える場合は、len(search())ではなくsearch_count()を使用しますrecordsets-batch-write— ループ内ではなく、レコードセット全体に対してwrite()を呼び出しますrecordsets-batch-create— ループ内でcreate()を呼び出すのではなく、create([...])にリストを渡しますrecordsets-domain-operators—|と&は、後続する2つの条件に適用される前置演算子ですrecordsets-sudo-comment—sudo()を使用する理由を説明するコメントを必ず追加しますrecordsets-raw-sql-params— SQL 文字列をフォーマットせず、必ず%sのパラメーター化クエリを使用しますrecordsets-no-commit— 業務コードでcr.commit()を呼び出してはいけません。トランザクションはフレームワークが管理しますrecordsets-savepoint— 分離してロールバックするにはcr.savepoint()を使用し、raw SQL で書き込んだ後はinvalidate_all()を呼び出します
6. アクション(MEDIUM)
actions-window-menu— リーフの<menuitem>は必ずir.actions.act_windowレコードに紐付けますactions-data-order— アクションはビューの XML で宣言し、メニューは別のmenus.xmlに記述して最後に読み込みますactions-python-return— ビューやウィザードを開くには、Python メソッドからアクション辞書を返しますactions-cron-method— Cron メソッドには@api.modelを付け、独自にエラーを処理させますactions-server-binding— サーバーアクションを「アクション」ドロップダウンに追加するにはbinding_model_idを使用します
7. パフォーマンス(MEDIUM)
performance-prefetch— ORM のプリフェッチを活用し、レコード間のフィールド値を取り出すにはmapped()を使用しますperformance-no-loop-write—forループ内でwrite()やcreate()を呼び出してはいけませんperformance-index-searched-fields—search()のドメインやORDER BYで使用するフィールドにはindex=Trueを追加しますperformance-read-group— レコードセット全体を読み込むのではなく、集計にはread_group()を使用しますperformance-invalidate-after-sql— raw SQL で書き込みを行った後は、invalidate_model()を呼び出します
8. テスト(MEDIUM)
testing-setup-class— 共通のフィクスチャにはsetUpClassを使用し、完全な分離が必要な場合に限ってsetUpを使用しますtesting-post-install-tag— テストには@tagged('post_install', '-at_install')を付けますtesting-constrains-coverage— すべての@api.constrainsメソッドに対して、そのメソッドを実行するテストを用意しますtesting-wizard-pattern— コンテキストを指定してウィザードを作成し、アクションメソッドを呼び出してテストしますtesting-tour-js— UI ツアーはweb_tour.toursレジストリに登録し、HttpCaseでテストしますtesting-bugfix-first— バグ修正には、その修正がなければ失敗するテストを含めますtesting-no-flaky— テスト内でデータを構築し、日付を固定し(freezegun)、外部サービスをモックし、最小権限のユーザーとしてテストしますtesting-no-stale-env— サブテスト間でクラス属性にレコードをキャッシュしてはいけません。with_env()で再バインドします
9. ミックスイン(LOW)
mixins-mail-thread— チャターとアクティビティを使用するには、_inherit = ['mail.thread', 'mail.activity.mixin']を追加しますmixins-tracking— チャターに変更を自動記録するには、フィールドにtracking=Trueを使用しますmixins-sequence— 自動採番には、フィールドのdefault=でir.sequenceとnext_by_code()を使用しますmixins-portal—portal.mixinを使用する場合は_compute_access_urlを実装しますmixins-message-post— チャターにプログラムからメッセージを投稿するにはmessage_post()を使用します
使い方
詳しい説明、正しいコード例と誤ったコード例、注意点については、各スキルファイルを参照してください。
odoo-manifest.md
odoo-orm-models.md
odoo-orm-fields.md
odoo-orm-decorators.md
odoo-orm-recordsets.md
odoo-actions.md
odoo-performance.md
odoo-testing.md
odoo-mixins.md
各ファイルには以下が含まれています。
- Odoo 17.0 で重要な理由
- 説明付きの誤ったコード例(
# ❌ WRONG) - 説明付きの正しいコード例(
# ✅ CORRECT) - 判断フローと例外的なケース
完全版ドキュメント
すべてのルール、パターン、例を詳しくまとめた完全なガイド(グローバルなコーディングガイドラインとスキルのルーティング表を含む)については、AGENTS.md を参照してください。
コメント
Markdown 対応