操作¶
操作定义了系统对用户操作的响应行为:登录、操作按钮、选择发票等。
操作可以存储在数据库中,也可以直接作为字典返回,例如在按钮方法中。所有操作都共享两个必需属性:
type
当前操作的类别,决定了可以使用哪些字段以及如何解释该操作。
name
操作的简短用户可读描述,可能会在客户端界面中显示
客户端可以以4种形式获取操作:
绑定¶
除了两个必填属性外,所有操作还共享用于在任意模型的上下文菜单中呈现操作的 可选 属性:
binding_model_id
指定操作绑定到哪个模型
注解
对于服务器操作,请使用
model_id
。binding_type
指定绑定类型,大多数情况下是指定操作将出现在哪个上下文菜单中
action
(默认)指定该操作将出现在绑定模型的
上下文菜单中。report
指定该操作将出现在绑定模型的
上下文菜单中。
binding_view_types
一个逗号分隔的视图类型列表,用于指定操作在上下文菜单中显示的视图类型,主要是 “list” 和 / 或 “form”。默认为
list,form
(既有列表又有表单)
窗口操作 (ir.actions.act_window
)¶
最常见的操作类型,用于通过 视图 展示模型的视觉化效果:窗口操作为模型(可能还包括模型的特定记录)定义了一组视图类型(可能还包括特定视图)。
它的字段为:
res_model
用于展示视图的模型
views
一个
(view_id, view_type)
对的列表。每对的第二个元素是视图的类别(列表、表单、图表等),第一个元素是可选的数据库ID(或False
)。如果未提供ID,客户端应获取请求模型的指定类型的默认视图(这由fields_view_get()
自动完成)。列表中的第一个类型是默认视图类型,执行操作时将默认打开。每种视图类型在列表中最多应出现一次res_id
(optional)如果默认视图是
form
,则指定要加载的记录(否则应创建新记录)search_view_id
(optional)(id, name)
对,id
是要为操作加载的特定搜索视图的数据库标识符。默认为获取模型的默认搜索视图。target
(optional)视图是否应在主内容区域(
current
)、全屏模式(fullscreen
)或对话框/弹出窗口(new
)中打开。使用main
代替current
以清除面包屑导航。默认为current
。context
(optional)传递给视图的附加上下文数据
domain
(optional)筛选域,隐式添加到所有视图搜索查询中
limit
(optional)默认情况下在列表中显示的记录数。在Web客户端中默认为80。
例如,要打开带有列表和表单视图的客户(设置了 customer
标志的合作伙伴):
{
"type": "ir.actions.act_window",
"res_model": "res.partner",
"views": [[False, "list"], [False, "form"]],
"domain": [["customer", "=", true]],
}
或者在新对话框中打开特定产品(单独获取)的表单视图:
{
"type": "ir.actions.act_window",
"res_model": "product.product",
"views": [[False, "form"]],
"res_id": a_product_id,
"target": "new",
}
在数据库中的窗口操作有一些不同的字段,客户端应该忽略这些字段,主要用于组合 views
列表:
view_mode
(默认值=list,form
)逗号分隔的视图类型列表,作为字符串(/!\ 不要有空格 /!\)。所有这些类型都将出现在生成的
views
列表中(至少有一个False
view_id)view_ids
M2M1 用于查看对象,定义了
views
的初始内容注解
Act_window 视图也可以通过
ir.actions.act_window.view
来定义清晰。如果您计划为您的模型允许多个视图,请优先使用 ir.actions.act_window.view 而不是
view_ids
动作<record model="ir.actions.act_window.view" id="test_action_tree"> <field name="sequence" eval="1"/> <field name="view_mode">list</field> <field name="view_id" ref="view_test_tree"/> <field name="act_window_id" ref="test_action"/> </record>
view_id
在
view_mode
列表中,如果特定视图的类型是列表中的一部分,并且尚未被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”视图。
The server-side composition of the views
sequence is the following:
从
view_ids
中获取每个(id, type)
(按sequence
排序)如果
view_id
已定义且其类型尚未填充,则附加其(id, type)
对于
view_mode
中的每个未填充的类型,追加(False, type)
- 1
技术上不是M2M:添加一个序列字段,可以由仅视图类型组成,而无需视图ID。
URL 动作 (ir.actions.act_url
)¶
允许通过Odoo操作打开URL(网站/网页)。可以通过两个字段进行自定义:
url
激活操作时要打开的地址
target
(default=new
)可用的值为 :
new
: 在新窗口/页面中打开 URLself
: 在当前窗口/页面中打开 URL(替换当前内容)download
: 重定向到下载 URL
example:
{
"type": "ir.actions.act_url",
"url": "https://odoo.com",
"target": "self",
}
这将用 Odoo 主页替换当前内容部分。
服务器操作 (ir.actions.server
)¶
- class odoo.addons.base.models.ir_actions.IrActionsServer(env: api.Environment, ids: tuple[IdType, ...], prefetch_ids: Reversible[IdType])[源代码]¶
Server actions model. Server action work on a base model and offer various type of actions that can be executed automatically, for example using base action rules, of manually, by adding the action in the ‘More’ contextual menu.
Since Odoo 8.0 a button ‘Create Menu Action’ button is available on the action form view. It creates an entry in the More menu of the base model. This allows to create server actions and run them in mass mode easily through the interface.
The available actions are :
‘Execute Python Code’: a block of python code that will be executed
‘Create a new Record’: create a new record with new values
‘Write on a Record’: update the values of a record
‘Execute several actions’: define an action that triggers several other server actions
允许从任何有效的操作位置触发复杂的服务器代码。对客户端而言,只有两个字段是相关的:
id
要运行的服务器操作的数据库内标识符
context
(optional)运行服务器操作时使用的上下文数据
在数据库中的记录更加丰富,可以根据其 state
执行许多特定或通用的操作。某些字段(以及相应的行为)在不同的状态之间是共享的:
model_id
与该操作相关联的Odoo模型。
state
code
: 执行通过code
参数传递的 Python 代码。object_create
:按照fields_lines
的规范创建一个新的crud_model_id
模型记录。object_write
:根据fields_lines
规范更新当前记录multi
: 通过child_ids
参数执行多个给定的操作。
状态字段¶
根据其状态,行为是通过不同的字段定义的。每个字段后面都给出了相关状态。
code
(code)指定在调用操作时执行的 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="state">code</field> <field name="code"> raise Warning(record.name) </field> </record>
注解
代码段可以定义一个名为
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="state">code</field> <field name="code"> if record.some_condition(): action = { "type": "ir.actions.act_window", "view_mode": "form", "res_model": record._name, "res_id": record.id, } </field> </record>
如果记录满足某些条件,将要求客户端打开该记录的表单
crud_model_id
(create)(required)创建新记录的模型
link_field_id
(create)many2one to
ir.model.fields
,指定当前记录的m2o字段,新创建的记录应该设置在该字段上(模型应该匹配)fields_lines
(create/write)在创建或复制记录时要覆盖的字段。使用字段为
One2many
:col1
ir.model.fields
to set in the concerned model (crud_model_id
for creates,model_id
for updates)value
字段的值,通过
type
解释type
(value|reference|equation)如果是
value
,则value
字段将被解释为字面值(可能会被转换),如果是equation
,则value
字段将被解释为 Python 表达式并进行求值
child_ids
(多选)指定多个子操作(
ir.actions.server
)以在多状态下执行。如果子操作本身返回操作,则最后一个操作将作为多操作的下一个操作返回给客户端
评估上下文¶
在服务器操作的评估上下文或周围环境中,有许多键可用:
model
通过model_id
与动作关联的模型对象record
/records
record/recorset on which the action is triggered, can be void.env
Odoo Environmentdatetime
,dateutil
,time
,timezone
对应的 Python 模块log: log(message, level='info')
logging function to record debug information in ir.logging tableWarning
异常的Warning
构造函数
报告操作 ( ir.actions.report
)¶
触发报告打印。
如果您通过 <record>
而不是 <report>
标签来定义报表,并且希望该操作显示在模型视图的打印菜单中,您还需要从 绑定 指定 binding_model_id
。不需要将 binding_type
设置为 report
,因为 ir.actions.report
会隐式地默认为该值。
name
(mandatory)如果未指定
print_report_name
,则用作文件名。否则,仅在查找报告时作为助记符/描述在某种列表中有用。model
(mandatory)报告所涉及的模型
report_type
(default=qweb-pdf)要么选择
qweb-pdf
生成 PDF 报告,要么选择qweb-html
生成 HTML 报告report_name
(mandatory)报表渲染所使用的 qweb 模板的名称 (外部 ID)
print_report_name
Python表达式,定义报表的名称。
groups_id
Many2many
字段,用于允许查看/使用当前报告的用户组multi
如果设置为
True
,该操作将不会显示在表单视图上。paperformat_id
Many2one
字段用于指定您希望为此报表使用的纸张格式(如果未指定,则使用公司格式)attachment_use
如果设置为
True
,则报告仅在第一次请求时生成,并从存储的报告中重新打印,而不是每次重新生成。可用于只需生成一次的报告(例如出于法律原因)
attachment
定义报表名称的Python表达式;记录可以通过变量
object
访问
客户端操作 (ir.actions.client
)¶
在客户端中完全实现的操作触发器。
tag
操作的客户端标识符,一个任意字符串,客户端应该知道如何做出反应
params
(optional)一个Python字典,用于在客户端操作标签旁边向客户端发送附加数据
target
(optional)是否应该在主内容区域中打开客户端操作(
current
),全屏模式(fullscreen
)或对话框/弹出窗口(new
)。使用main
而不是current
来清除面包屑。默认为current
。
{
"type": "ir.actions.client",
"tag": "pos.ui"
}
告诉客户端启动销售点界面,服务器不知道销售点界面的工作方式。
计划任务 (ir.cron
)¶
在预定义频率上自动触发的操作。
name
计划操作的名称(主要用于日志显示)
interval_number
在两次执行操作之间的 interval_type uom数量
interval_type
频率间隔的计量单位(
分钟
,小时
,天
,周
,月
)model_id
将调用此操作的模型
code
操作的代码内容。可以是对模型方法的简单调用:
model.<method_name>()
nextcall
此操作的下一次计划执行日期(日期/时间格式)
priority
在执行多个操作时,操作的优先级
高级用法:批处理¶
当执行计划任务时,建议尝试分批处理进度,以避免长时间占用一个工作进程,并可能遇到超时异常。
Odoo 提供了一个简单的 API 用于计划任务的批处理;
self.env['ir.cron']._notify_progress(done=XX:int, remaining=XX:int)
该方法使调度器能够了解是否取得了进展,以及是否仍有必须完成的剩余工作。
默认情况下,如果使用了 API,调度程序会尝试一次性处理 10 个批次。如果在处理完这 10 个批次后仍有剩余任务,将尽快执行一个新的 cron 调用。
高级用法:触发器¶
对于更复杂的用例,Odoo 提供了一种更高级的方式,可以直接从业务代码中触发计划操作。
action_record._trigger(at=XX:date)
安全性¶
为避免在计划操作之间公平使用资源,一些安全措施确保您的计划操作正常运行。
如果计划的操作连续三次遇到错误或超时,它将跳过当前执行并被视为失败。
如果一个计划动作在至少七天的时间内连续五次执行失败,它将被停用并通知数据库管理员。