第9章: アクションの準備はできましたか?

これまでのところ、主にフィールドとビューを宣言してモジュールを構築してきました。 計算されたフィールドとonchangeのおかげで、 :doc:`前の章<08_compute_onchange>でビジネスロジックを導入しました。 実際のビジネスシナリオでは、いくつかのビジネスロジックをアクションボタンにリンクしたいと思います。 私たちの不動産の例では、以下を行うことができます:

  • 物件をキャンセルする、または売却済みにする

  • オファーを受ける、または断る

状態を手動で変更することで、すでにこれらのことができると言う人もいるかもしれませんが、これはあまり便利ではありません。さらに、追加の処理を加えたいと考えています。オファーが受け入れられたときに、その物件の販売価格と買い手を設定したいと思います。

オブジェクトタイプ

参照: このトピックに関連するドキュメントは、 アクションエラー管理 にあります。

注釈

目標: このセクションの最後には、

  • 物件をキャンセルしたり、売却済みに設定することができるようになります。

キャンセルして販売するように設定

キャンセルされたプロパティは売却できず、売却されたプロパティはキャンセルできません。 明確にするために、ビューに state フィールドが追加されました。

  • オファーを受け入れる、または拒否することができるようになります。

オファーを承諾または拒否
  • オファーを受け入れると、販売価格と買い手を設定する必要があります。

オファーを承認する

不動産モジュールでは、ビジネスロジックといくつかのボタンをリンクさせたいと考えています。最も一般的な方法は次の通りです。

  • ビューにボタンを追加します。例えばビューの header に追加します。

<form>
    <header>
        <button name="action_do_something" type="object" string="Do Something"/>
    </header>
    <sheet>
        <field name="name"/>
    </sheet>
</form>
  • そして、このボタンをビジネスロジックにリンクさせます。

from odoo import fields, models

class TestAction(models.Model):
    _name = "test.action"

    name = fields.Char()

    def action_do_something(self):
        for record in self:
            record.name = "Something"
        return True

ボタンに type="object" を割り当てることで、Odooフレームワークは与えられたモデル上で name="action_do_something" のPythonメソッドを実行します。

最初に注意すべき重要な点は、メソッド名の前にアンダースコア(_) が付いていないことです。これにより、このメソッドはOdooのインターフェースから直接(RPCコールを通じて) 呼び出すことができる パブリック メソッドとなります。これまでは、作成したすべてのメソッド(compute, onchange) が内部で呼び出されていたため、アンダースコアを先頭につけた プライベート メソッドを使用していました。ユーザーインターフェースから呼び出される必要がない限り、メソッドは常にプライベートに定義するべきです。

また、 self でループしていることにも注意してください。再利用性を高めるためにも、メソッドは常に複数のレコードで呼び出されることを想定してください。

最後に、パブリックメソッドは、XML-RPCで呼び出せるように、常に何かを返すべきです。疑わしい場合は、単に return True で返してください。

Odooのソースコードには何百もの例があります。 一つの例として、 ビュー内のbuttonそれに対応するメソッド です。

Exercise

物件のキャンセルと売却済みの処理を追加してみましょう。

  • ボタン「キャンセル」と「売却」を``estate.property`` モデルに追加します。キャンセルされたプロパティは販売として設定できず、販売されたプロパティはキャンセルできません。

    期待される結果については、 目標 の最初の画像を参照してください。

    ヒント: エラーを発生させるには、 UserError 関数を使用します。 Odooソースコードにはたくさんの例があります;-)

  • 'Accept' ボタンと 'Refuse' ボタンを estate.property.offer モデルに追加します。

    期待される結果については、 目標 の2つ目の画像を参照してください。

    ヒント: アイコンをボタンとして使用するには、この例 を見てください。

  • オファーが承認されたら、対応する物件の買い手と販売価格を設定します。

    期待される結果については、 目標 の3つ目の画像を参照してください。

    注意: 実際には、1つの物件に対して受け入れられるオファーは1つだけです。

アクションタイプ

:doc:`05_firstui`では、メニューにリンクされたアクションを作成しました。 ボタンにアクションをリンクすることが可能かどうか疑問に思うかもしれません。良いニュースです!それを行う1つの方法は次のとおりです。

<button type="action" name="%(test.test_model_action)d" string="My Action"/>

type="action" を使い、nameexternal identifier を参照します。

next chapter で、Odoo で不正なデータをエンコードしないようにする方法を見ていきます。