第 9 章:准备好采取行动了吗?

到目前为止,我们主要通过声明字段和视图来构建我们的模块。借助计算字段和 onchanges,我们刚刚在 previous chapter 中引入了业务逻辑。在任何实际的业务场景中,我们都希望将一些业务逻辑链接到操作按钮。在我们的房地产示例中,我们希望能够:

  • 取消或将房产设置为已售

  • 接受或拒绝要约

有人可能会说,我们已经可以通过手动更改状态来完成这些事情,但这并不是很方便。此外,我们想要添加一些额外的处理:当报价被接受时,我们想要设置房产的售价和买家。

对象类型

参考:与此主题相关的文档可以在 行动错误管理 中找到。

注解

目标:在本节末尾:

  • 您应该能够取消或将房产设置为已售:

取消并设置为出售

已取消的财产不能出售,已出售的财产也不能取消。为了清楚起见,已在视图上添加了“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"` to our button, the Odoo framework will execute a Python method with ``name=”action_do_something”`”。

要注意的第一个重要细节是我们的方法名称没有以下划线前缀(_)。这使得我们的方法成为**公共**方法,可以直接从 Odoo 接口调用(通过 RPC 调用)。到目前为止,我们创建的所有方法(compute、onchange)都是在内部调用的,因此我们使用带有下划线前缀的 private 方法。您应该始终将方法定义为私有方法,除非需要从用户界面调用它们。

另请注意,我们在“self”上循环。始终假设一个方法可以在多个记录上调用;它更有利于可重用性。

最后,公共方法应该始终返回一些内容,以便可以通过 XML-RPC 调用它。如有疑问,只需“return True”。

Odoo 源代码中有数百个示例。一个例子是 button in a view 及其 corresponding Python method

Exercise

取消并将房产设置为已出售。

  • 将“取消”和“已售出”按钮添加到“estate.property”模型中。已取消的房产不能设置为已出售,已出售的房产也不能取消。

    请参阅**目标**的第一张图片以了解预期结果。

    提示:为了引发错误,您可以使用 UserError 函数。 Odoo 源代码中有很多示例;-)

  • 将按钮“接受”和“拒绝”添加到“estate.property.offer”模型中。

    有关预期结果,请参阅**目标**的第二张图片。

    提示:要将图标用作按钮,请查看`at this example <https://github.com/odoo/odoo/blob/cd9af815ba591935cda367d33a1d090f248dd18d/addons/event/views/event_views.xml#L521>`__。

  • 当报价被接受后,设置买家和相应房产的售价。

    有关预期结果,请参阅**目标**的第三张图片。

    请注意:在现实生活中,某一特定房产只能接受一个报价!

动作类型

第 5 章:最后,一些可以使用的 UI 中,我们创建了一个链接到菜单的操作。您可能想知道是否可以将操作链接到按钮。好消息,确实如此!一种方法是:

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

我们使用``type=”action”`` and we refer to the external identifier in the name

next chapter 中,我们将了解如何防止在 Odoo 中编码不正确的数据。