Odoo Actions

动作(Actions)定义了系统响应用户操作的具体行为:比如登陆,点击按钮,选择一个发票单 据,等等。

Actions 可以存储在数据库中或直接以字典(dictionaries)形式返回,比如按钮所运行的函 数。所有的actions有两个必须的属性:

type

当前action的类别。该属性决定了哪些字段会被用来解析这个action

name

一个可读的action的描述,可能会显示在客户端界面上

客户端会接收到4种形式的action

False

如果当前的action对话界面是打开状态,则关闭之

一条字符串

如果与某客户端动作tag匹配,则解析为该action,否则按 数字处理

一个数字

作为id从数据库中获取action记录,该id可能为数据记录id或外部id

一个字典

将其作为客户端action描述,解析并执行

Window Action (ir.actions.act_window)

这是最常见的action类型用来将模型数据通过视图(view)来呈现。一个window action可定义数据模型(或者某个数据记录)的多种视图类型(或者某个特定的视图类型)

使用到的字段包括:

res_model

视图所绑定的数据模型

views

其值由一个或多个(view_id, view_type)元组对组成的列表。元组中的第二项表示 视图的类型,比如:tree,form,graph …​ 。第一个项是一个可选数据库id( 或者False)。如果没有指定id,客户端将为对应的数据模型获取一个默认的视图。 (这是由fields_view_get()函数自动完成的)。action被执行时,这个views所对应的 列表中的第一个视图类型会作为视图的默认类型。每种视图类型在列表中最多只能出现 一次。

res_id(可选)

如果默认视图是form(表单视图), 如果指定了res_id则其对应的记录会被显示,否 则显示新的记录。

search_view_id(可选)

其值为(id, name)对。id是数据库指定的搜索视图的数据库id。非指定则加载默认 搜索视图。

target(可选)

如果视图在当前主内容区打开则选择current,如果以全屏模式打开则选 fullscreen,或者以对话弹出框形式则为newmaincurrent的区别 是main会清除当前的‘面包屑‘(breadcrumbs), 默认值为current

context(可选)

另外传送到视图的上下文(context)数据

domain(可选)

隐式的对视图中的记录添加过滤规则

limit(可选)

列表中每页默认显示的记录数。默认记录数为:80

auto_search(可选)

是否在加载视图后立即执行一个搜索的操作,默认是True

比如:打开客户(就是合作伙伴(Partner)的customer标签为True的记录)的列表和 表单视图:

{
    "type": "ir.actions.act_window",
    "res_model": "res.partner",
    "views": [[False, "tree"], [False, "form"]],
    "domain": [["customer", "=", true]],
}

或者,比如在对话框中打开某个指定产品的表单:

{
    "type": "ir.actions.act_window",
    "res_model": "product.product",
    "views": [[False, "form"]],
    "res_id": a_product_id,
    "target": "new",
}

数据库中的window action记录还有下列字段,现在已经不直接使用了,会被客户 端忽略掉。它们的作用被views字段所取代,它们的值会被组合成views的值:

view_mode

由逗号分割的视图类型列表,会被添加到views列表中,`view_id`为False

view_ids

关联的视图对象id,`views`的初始值

view_id

如果其视图类型在view_mode中有定义而id不在view_ids中,则添加到 views

这些字段在视图的数据文件中经常用到:

<record model="ir.actions.act_window" id="test_action">
    <field name="name">A Test Action</field>
    <field name="res_model">some.model</field>
    <field name="view_mode">graph</field>
    <field name="view_id" ref="my_specific_view"/>
</record>

该视图使用"my_specific_view"视图,但是其非默认视图。

在服务器端组合views数据的顺序如下:

  • view_ids中按sequence顺序取出(id, type)

  • 如果view_id有定义并且其视图类型尚未在view_ids中,则将其(id, type)附加 到views列表中

  • 对于view_mode中指定但view_idsview_id中都没有指定的视图,在 views列表中附加(False, type)

URL Action (ir.actions.act_url)

用于通过Odoo Action来打开一个URL(website/页面)。通过下面两个字段来控制:

url

action激活时打开的页面地址

target

如果其值为new则在新的窗口中打开页面,如果其值为self则在当前页面打开 。默认值为new

{
    "type": "ir.actions.act_url",
    "url": "http://odoo.com",
    "target": "self",
}

会用将当前的页面用Odoo的首页代替。

Server Action (ir.action.server)

用于在任意有效的action位置触发服务器端的复杂代码。下面两个字段的值对客户端有效:

id

server action在数据库中的id

context

在server action运行时所使用的上下文信息

数据库记录中有丰富的配置可以基于state来触发动作。某些字段的值及其关联行为用 于不同的状态:

model_id

与server action关联的数据模型,其在上下文解析中提供数据对象

condition(可选)

作为Python代码在上下文解析中被解析执行。如果解析结果为 False则该action不被执行,默认值为True

动作类型(即state字段的值)是可以扩展的,默认的类型有:

code

默认的最灵活的server action类型,通过上下文解析来执行任意的Python 代码。只用到一个跟该类型相关的字段:

code

当action被激活时调用的Python代码

<record model="ir.actions.server" id="print_instance">
    <field name="name">Res Partner Server Action</field>
    <field name="model_id" ref="model_res_partner"/>
    <field name="code">
        raise Warning(object.name)
    </field>
</record>

注意:代码部分可以定义一个叫做action的变量,其值会被返回给客户端作为下一个action来执 行。

<record model="ir.actions.server" id="print_instance">
    <field name="name">Res Partner Server Action</field>
    <field name="model_id" ref="model_res_partner"/>
    <field name="code">
        if object.some_condition():
            action = {
                "type": "ir.actions.act_window",
                "view_mode": "form",
                "res_model": object._name,
                "res_id": object.id,
            }
    </field>
</record>

在满足某些条件(some_condition)的情况下,请客户端打开指定记录的表单视图

这基本上是除了multi以外唯一倾向于在数据文件上创建的action类型,其他的action 类型比Python代码要简单的多更应该在界面上创建。

object_create

创建一个新的记录(通过调用create())或者拷贝一个已有的记录(通过调用 copy()

use_create

记录创建规则,其可选值为下列之一:

  • new: 新建一条model_id指定的数据模型下的记录

  • new_other: 新建一条crud_model_id指定的数据模型下的记录

  • copy_current: 复制当前action所对应的记录

  • copy_other: 复制ref_object所指定的记录

fields_lines

当创建或拷贝记录时的默认字段值。字段值以One2many的列表形式保存:

  • col1: use_create所选定的模型对象上的字段(ir.model.fields)

  • value: 字段对应的值,根据type不同解析

  • type: 如果type为value那么上述字段中的值不做处理;如果type为equation 那么上述字段中的值将作为Python表达式解析。

crud_model_id

use_create设为new_other时用于创建记录所对应的模型

ref_object

use_create中设为copy_other时,这里的值为拷贝的对象

link_new_record

其值为TrueFalse。如果为True,则通过link_field_id所指定的 many2one字段来将创建的记录与当前记录关联。

link_field_id

一个指向ir.model.fields对象的many2one字段,使用目的见 link_new_record

object_write

object_create类似但不创建新纪录而是修改已有记录

use_write

记录修改规则,可选项为:

  • current: 修改当前记录

  • other: 修改crud_model_id以及ref_object所指定的记录

  • expression: 修改crud_model_id所指定的模型和write_expression解析的结 果所指定的记录id

write_expression

use_write选择expression时,这里的值会作为Python表达式解析,解析结 果即为需要修改的记录值。

fields_lines

参见object_create

crud_model_id

参见object_create

ref_object

参见object_create

multi

按设定action一个接一个的执行。所有的action定义在一个多对多的字段:child_ids 上。如果其包含的action本身返回action, 最后一个action会返回给客户端作为 muti action的下一个action。

client_action

直接返回一个action_id给客户端执行

上下文解析

在与server actions相关的上下文解析中,有一系列的可用参数:

model

通过model_id关联到action的model对象

object, obj

只有在context中存在active_modelactive_id时可用,其记录由 active_id决定。否则,其值为None

pool

当前数据库注册表

datetime, dateutil, time

对应的Python模块

cr

当前的数据库游标

user

当前的用户

context

运行环境上下文

Warning

Warning构造器

报表Action (ir.actions.report)

用于激发报表打印

name(必须)

报表动作名称说明用于辨识

model(必须)

报表所绑定的数据模型

report_type(必须)

qweb-pdf即PDF报表,qweb-html即HTML报表

report_name

报表的名称

group_id

多对多字段用以记录可以访问,使用该报表的用户组

paperformat_id

Many2one字段用来记录该报表使用的纸张格式,如为定义则使用公司上定义的格式 。

attachement_use

如果设置为True则报表只生成一次,一般用以因法律原因只能生成一次的报表

attachement

报表生成的附件名称。

客户端Action (ir.actions.client)

触发一个完全客户端执行的action。

tag

客户端action的标示名

params(可选)

是一个Python的字典包含了一些发送到客户端的数据

target (可选)

参见 Window Action

{
    "type": "ir.actions.client",
    "tag": "pos.ui"
}

通知客户端启动POS界面,服务器端并不知道POS界面如何工作