动作(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,或者以对话弹出框形式则为new。main与current的区别 是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_ids和view_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>
[!NOTE] 注意:代码部分可以定义一个叫做
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
其值为True或False。如果为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_model和active_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界面如何工作