操作

动作定义了系统对用户操作(如登录、按钮点击、发票选择等)的响应行为:

操作可以存储在数据库中,或在例如按钮方法中直接作为字典返回。所有操作都包含两个必填属性:

类型

当前动作的类别,决定可以使用哪些字段以及动作如何被解释

名称

动作的简短用户可读描述,可能在客户端界面中显示

客户端可以通过 4 种形式获取操作:

  • False

    如果当前有动作对话框打开,请关闭它

  • 一个字符串

    如果一个 客户端动作 匹配,则将其解释为客户端动作的标签,否则将其视为一个数字。

  • 一个数字

    从数据库中读取相应的动作记录,可以是数据库标识符或 外部 ID

  • 一个字典

    将其视为客户端动作描述符并执行

绑定

除了这两个必填属性外,所有动作还共享一些*可选*属性,用于在任意模型的上下文菜单中显示该动作:

绑定模型ID

指定该动作绑定到哪个模型

注解

对于服务器操作,请使用 model_id

绑定类型

指定绑定的类型,这通常决定了该动作将在哪个上下文菜单下显示。

``动作``(默认)

指定该动作将出现在绑定模型的 操作 上下文菜单中。

报表

指定该动作将出现在绑定模型的 打印 上下文菜单中。

绑定视图类型

一个以逗号分隔的视图类型列表,用于指定该动作在上下文菜单中显示的视图类型,通常为 “list” 和/或 “form”。默认值为 ``list,form``(同时显示列表和表单)。

窗口操作(ir.actions.act_window

最常见的动作类型,用于通过 视图 展示模型的可视化内容:窗口动作定义了模型的一组视图类型(以及可能特定的视图),对于模型(以及可能特定的记录)而言。

它的字段包括:

模型

用于呈现视图的模型

视图

一个由 (view_id, view_type) 对组成列表。每个对中的第二个元素是视图的类别(列表、表单、图表等),第一个元素是可选的数据库 ID(或 False)。如果没有提供 ID,客户端应为请求的模型获取指定类型的默认视图(这会通过 fields_view_get() 自动完成)。列表中的第一个类型是默认视图类型,当执行该动作时将默认打开。列表中每个视图类型最多出现一次。

``res_id``(可选)

如果默认视图是 表单,则指定要加载的记录(否则应创建一条新记录)

``search_view_id``(可选)

(id, name) 对,id 是要为该动作加载的特定搜索视图的数据库标识符。默认情况下,将获取该模型的默认搜索视图。

目标 (可选)

是否应在主内容区域(current)、全屏模式(fullscreen)或对话框/弹出窗口(new)中打开视图。使用 main 代替 current 可以清除导航路径。默认为 current

context (可选)

传递给视图的附加上下文数据

``domain``(可选)

用于隐式添加到所有视图搜索查询中的筛选域

``limit``(可选)

默认在列表中显示的记录数量。默认值为 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,表单

由视图类型组成的逗号分隔字符串(/!\ 不能包含空格 /!\)。所有这些类型都将出现在生成的 views 列表中(至少包含一个 False 的 view_id)。

视图ID

M2M 1 用于查看对象,定义了 views 的初始内容

注解

通过 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>
视图ID

特定视图将被添加到 views 列表中,当其类型属于 view_mode 列表,并且尚未被 view_ids 中的任何视图填充时。

这些通常在从 数据文件 定义操作时使用:

<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 中获取每个 (id, type)``(按 ``sequence 排序)

  • 如果 view_id 已定义且其类型尚未填写,则追加其 (id, type)

  • 对于每个未填充的类型 in view_mode,追加 (False, type)

1

从技术上讲并不是一个 M2M(多对多):添加一个序列字段,可能仅由视图类型组成,而不需要视图 ID。

URL 操作(ir.actions.act_url

允许通过 Odoo 动作打开网址(网站/网页)。可以通过两个字段进行自定义:

网址

激活动作时打开的地址

目标``(默认值为 ``new

可用值为:

  • new:在新窗口/页面中打开网址

  • self:在当前窗口/页面中打开网址(替换实际内容)

  • 下载: 重定向到下载网址

示例:

{
    "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

允许从任何有效的动作位置触发复杂的服务器代码。对客户端而言,只有两个字段是相关的:

编号

服务器动作的数据库标识符,用于执行该动作

context (可选)

运行服务器动作时使用的上下文数据

数据库中的记录更加丰富,并可以根据其 state 执行一系列特定或通用的操作。某些字段(以及相应的行为)在不同状态之间是共享的:

模型ID

与动作关联的 Odoo 模型。

状态

  • code:通过 code 参数执行给定的 Python 代码。

  • object_create: 按照 fields_lines 的规范,创建 crud_model_id 模型的新记录。

  • object_write: 根据 fields_lines 的规范更新当前记录(s)

  • multi:通过 child_ids 参数执行多个动作。

状态字段

根据其状态,行为通过不同的字段进行定义。每个字段后会标明相关状态。

代码 (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 (创建)(必填)

要在其中创建新记录的模型

link_field_id (创建)

一对多指向 ir.model.fields,指定当前记录的 m2o 字段,新创建的记录应设置在此字段上(模型应匹配)

fields_lines (创建/写入)

创建或复制记录时要覆盖的字段。One2many 字段,包含以下字段:

列1

ir.model.fields 用于在相关模型中设置(创建时使用 crud_model_id,更新时使用 model_id

字段的值,通过 type 进行解释

类型 (值|引用|公式)

如果 value,则 value 字段被解释为字面值(可能被转换),如果为 equation,则 value 字段被解释为 Python 表达式并进行求值。

child_ids (多对多)

指定在状态 multi 中执行的多个子动作(ir.actions.server)。如果子动作本身返回动作,则最后一个动作将被返回给客户端,作为 multi 的下一个动作。

评估上下文

在服务器操作的评估上下文或相关环境中,有多个键可用:

  • model 通过 model_id 与动作关联的模型对象

  • 记录/记录集 在其上触发动作的记录/记录集,可以为空。

  • env Odoo 环境

  • datetimedateutiltimetimezone 对应的 Python 模块

  • log: log(message, level='info') 用于在 ir.logging 表中记录调试信息的日志函数

  • 警告 异常的 Warning 构造函数

报表操作(ir.actions.report

触发报表的打印。

如果您通过 <record> 而不是 <report> 标签来定义报告,并希望该动作在模型视图的 “打印” 菜单中显示,还需要从 绑定 指定 binding_model_id。不需要将 binding_type 设置为 report,因为 ir.actions.report 会隐式地默认为此值。

名称 (必填)

作为文件名使用,如果未指定 print_report_name。否则,仅在某种列表中查找报表时作为记忆/描述有用。

``模型``(必填)

您要生成报表的模型

report_type (默认值=qweb-pdf)

要么使用 qweb-pdf 用于 PDF 报表,要么使用 qweb-html 用于 HTML 报表

报告名称 (必填)

用于渲染报表的 qweb 模板的名称(外部 ID

打印报告名称

Python 表达式,用于定义报表的名称。

groups_id

Many2many 字段,用于指定允许查看/使用当前报表的用户组

如果设置为 True,该动作将不会在表单视图中显示。

纸张格式ID

Many2one 字段,用于选择此报表要使用的纸张格式(如果未指定,则使用公司格式)

附件使用

如果设置为 True,则报表仅在第一次请求时生成,之后将从存储的报表中重新打印,而不是每次请求时都重新生成。

可用于仅需生成一次的报告(例如出于法律原因)

附件

生成报表名称的 Python 表达式;记录可通过变量 object 访问

客户端操作(ir.actions.client

在客户端中完全实现的动作。

标签

动作的客户端标识符,一个任意字符串,客户端应知道如何对此作出反应

params (可选)

一个包含额外数据的 Python 字典,将与客户端动作标签一起发送到客户端

目标 (可选)

是否应在主内容区域(current)、全屏模式(fullscreen)或对话框/弹窗(new)中打开客户端动作。使用 main 代替 current 可以清除导航路径。默认为 current

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

告诉客户端启动销售点界面,服务器并不知道销售点界面是如何工作的。

计划操作(ir.cron

按预定义频率自动触发的操作。

名称

计划动作的名称(主要用于日志显示)

间隔数

动作两次执行之间的 interval_type 单位数量

间隔类型

频率间隔的单位(分钟小时

模型ID

此动作将被调用的模型

代码

动作的代码内容。可以是对模型方法的简单调用:

model.<method_name>()
下次调用

此动作的下次计划执行日期(日期/时间格式)

优先级

动作在同时执行多个动作时的优先级

高级用法:批量处理

执行计划动作时,建议分批处理进度,以避免长时间占用工作进程,从而可能引发超时异常。

Odoo 提供了一个简单的接口用于计划动作的批处理;

self.env['ir.cron']._notify_progress(done=XX:int, remaining=XX:int)

此方法使调度器能够知道是否已取得进度,并且是否仍有需要完成的剩余工作。

默认情况下,如果使用接口,调度器会一次性处理 10 批任务。如果这 10 批任务之后还有剩余任务,将会尽快执行新的定时调用。

高级用法:触发器

对于更复杂的使用场景,Odoo 提供了一种更高级的方式,可以直接从业务代码中触发计划任务。

action_record._trigger(at=XX:date)

安全

为了避免在计划操作中公平使用资源,一些安全措施确保您的计划操作正确运行。

  • 如果一个计划动作连续三次遇到错误或超时,它将跳过当前执行,并被视为失败。

  • 如果一个计划动作在至少七天的时间内连续五次执行失败,它将被停用并通知数据库管理员。