操作¶
操作定义了系统对用户操作的响应行为:登录、操作按钮、选择发票等。
操作可以存储在数据库中,也可以直接作为字典返回,例如在按钮方法中。所有操作都共享两个必需属性:
type
当前操作的类别,决定了可以使用哪些字段以及如何解释该操作。
name
操作的简短用户可读描述,可能会在客户端界面中显示
客户端可以以4种形式获取操作:
绑定¶
除了两个必填属性外,所有操作还共享用于在任意模型的上下文菜单中呈现操作的 可选 属性:
binding_model_id
指定操作绑定到哪个模型
注解
对于服务器操作,请使用
model_id
。binding_type
指定绑定类型,大多数情况下是指定操作将出现在哪个上下文菜单中
action
(default)指定该操作将出现在绑定模型的
上下文菜单中。report
指定该操作将出现在绑定模型的
上下文菜单中。
binding_view_types
一个逗号分隔的视图类型列表,用于指定操作在上下文菜单中显示的视图类型,主要是 “list” 和 / 或 “form”。默认为
list,form
(既有列表又有表单)
窗口操作 (ir.actions.act_window
)¶
The most common action type, used to present visualisations of a model through views: a window action defines a set of view types (and possibly specific views) for a model (and possibly specific record of the model).
它的字段为:
res_model
用于展示视图的模型
views
a list of
(view_id, view_type)
pairs. The second element of each pair is the category of the view (list, form, graph, …) and the first is an optional database id (orFalse
). If no id is provided, the client should fetch the default view of the specified type for the requested model (this is automatically done byfields_view_get()
). The first type of the list is the default view type and will be open by default when the action is executed. Each view type should be present at most once in the listres_id
(optional)如果默认视图是
form
,则指定要加载的记录(否则应创建新记录)search_view_id
(optional)(id, name)
pair,id
is the database identifier of a specific search view to load for the action. Defaults to fetching the default search view for the modeltarget
(optional)whether the views should be open in the main content area (
current
), in full screen mode (fullscreen
) or in a dialog/popup (new
). Usemain
instead ofcurrent
to clear the breadcrumbs. Defaults tocurrent
.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
(default=list,form
)逗号分隔的视图类型列表,作为字符串(/!\ 不要有空格 /!\)。所有这些类型都将出现在生成的
views
列表中(至少有一个False
view_id)view_ids
M2M1 to view objects, defines the initial content of
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 Actions (ir.actions.act_url
)¶
允许通过Odoo操作打开URL(网站/网页)。可以通过两个字段进行自定义:
url
激活操作时要打开的地址
target
(default=new
)the available values are :
new
: opens the URL in a new window/pageself
: opens the URL in the current window/page (replaces the actual content)download
: redirects to a download URL
example:
{
"type": "ir.actions.act_url",
"url": "https://odoo.com",
"target": "self",
}
This will replace the current content section by the Odoo home page.
服务器操作 (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
: Executes python code given through thecode
argument.object_create
: Creates a new record of modelcrud_model_id
followingfields_lines
specifications.object_write
: Updates the current record(s) followingfields_lines
specificationsmulti
: Executes several actions given through thechild_ids
argument.
状态字段¶
根据其状态,行为是通过不同的字段定义的。每个字段后面都给出了相关状态。
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
(multi)指定多个子操作(
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
constructor for theWarning
exception
报告操作 ( 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"
}
告诉客户端启动销售点界面,服务器不知道销售点界面的工作方式。
Scheduled Actions (ir.cron
)¶
在预定义频率上自动触发的操作。
name
Name of the scheduled action (Mainly used in log display)
interval_number
在两次执行操作之间的 interval_type uom数量
interval_type
Unit of measure of frequency interval (
minutes
,hours
,days
,weeks
,months
)model_id
将调用此操作的模型
code
操作的代码内容。可以是对模型方法的简单调用:
model.<method_name>()
nextcall
此操作的下一次计划执行日期(日期/时间格式)
priority
Priority of the action when executing multiple actions at the same time
Advanced use: Batching¶
When executing a scheduled action, it’s recommended to try batching progress in order to avoid hogging a worker for a long period of time and possibly running into timeout exceptions.
Odoo provides a simple API for scheduled action batching;
self.env['ir.cron']._notify_progress(done=XX:int, remaining=XX:int)
This method allows the scheduler to know if progress was made and whether there is still remaining work that must be done.
By default, if the API is used, the scheduler tries to process 10 batches in one sitting. If there are still remaining tasks after those 10 batches, a new cron call will be executed as soon as possible.
Advanced use: Triggers¶
For more complex use cases, Odoo provides a more advanced way to trigger scheduled actions directly from business code.
action_record._trigger(at=XX:date)
安全性¶
To avoid a fair usage of resources among scheduled actions, some security measures ensure the correct functioning of your scheduled actions.
If a scheduled action encounters an error or a timeout three consecutive times, it will skip its current execution and be considered as failed.
If a scheduled action fails its execution five consecutive times over a period of at least seven days, it will be deactivated and will notify the DB admin.