第十章:準備好行動了嗎??

到目前為止,我們主要通過聲明字段和視圖來構建我們的模塊。在 上一章節 中,我們通過計算字段和onchange引入了業務邏輯。在任何真實的業務場景中,我們都希望將一些業務邏輯鏈接到操作按鈕上。在我們的房地產示例中,我們希望能夠:

  • 取消或將屬性標記為已售

  • 接受或拒絕一個報價

有人可能會認為我們已經可以通過手動更改狀態來完成這些事情,但這并不是很方便。此外,我們還想添加一些額外的處理:當接受報價時,我們想要設置房產的銷售價格和買家。

操作類型?

參考 : 有關此主題的文檔可以在 操作錯誤管理 中找到。

注解

目標 :本節結束時:

  • 您應該能夠取消或將屬性標記為已售:

取消并設置為已售出

一個已取消的物業無法出售,一個已售出的物業無法取消。為了清晰起見,在視圖中添加了“狀態”字段。

  • 您應該能夠接受或拒絕一個報價:

接受或拒絕一個報價
  • 一旦接受了報價,應設置銷售價格和買家:

接受一個報價

在我們的房地產模塊中,我們想要將業務邏輯與一些按鈕鏈接起來。最常見的方法是:

  • 在視圖中添加一個按鈕,例如在視圖的 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 調用。如果不確定,只需返回 True。

Odoo源代碼中有數百個示例。其中一個示例是這個“視圖中的按鈕<https://github.com/odoo/odoo/blob/cd9af815ba591935cda367d33a1d090f248dd18d/addons/crm/views/crm_lead_views.xml#L9-L11> __和它的 相應的Python方法<https://github.com/odoo/odoo/blob/cd9af815ba591935cda367d33a1d090f248dd18d/addons/crm/models/crm_lead.py#L746-L760>`__

Exercise

取消并將屬性標記為已售。

  • 將“取消”和“已售”按鈕添加到“estate.property”模型中。取消的房產不能被標記為已售,已售的房產不能被取消。

    請參考 **目標 ** 中的第一張圖片以獲取期望結果。

    提示:如果要引發錯誤,可以使用 UserError 函數。在Odoo源代碼中有很多示例 ;-)

  • 將“接受”和“拒絕”按鈕添加到“estate.property.offer”模型中。

    請參考 目標 的第二張圖片以獲取預期結果。

    提示:如果要將圖標用作按鈕,請查看 此示例。

  • 當一個報價被接受時,為相應的房產設置買家和銷售價格。

    請參考 **目標 ** 的第三張圖片以獲取預期結果。

    注意:在現實生活中,對于一處房產,只能接受一個報價!

對象類型?

第六章:終于有一些界面可以玩了 中,我們創建了一個與菜單相關聯的操作。您可能想知道是否可以將操作鏈接到按鈕上。好消息是,可以!一種方法是:

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

我們使用 type="action" ,并在 name 中引用 外部標識符 。

下一章節 中,我們將學習如何在Odoo中防止編碼不正確的數據。