操作

操作定义了系统对用户操作的响应行为:登录、操作按钮、选择发票等。

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

type

当前操作的类别,决定了可以使用哪些字段以及如何解释该操作。

name

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

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

  • False

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

  • 一个字符串

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

  • 一个数字

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

  • 一个字典

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

绑定

除了两个必填属性外,所有操作还共享用于在任意模型的上下文菜单中呈现操作的 可选 属性:

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 (or False). If no id is provided, the client should fetch the default view of the specified type for the requested model (this is automatically done by fields_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 list

res_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 model

target (optional)

whether the views should be open in the main content area (current), in full screen mode (fullscreen) or in a dialog/popup (new). Use main instead of current to clear the breadcrumbs. Defaults to 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 (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/page

  • self: 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 the code argument.

  • object_create: Creates a new record of model crud_model_id following fields_lines specifications.

  • object_write: Updates the current record(s) following fields_lines specifications

  • multi: Executes several actions given through the child_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 Environment

  • datetime, dateutil, time, timezone 对应的 Python 模块

  • log: log(message, level='info') logging function to record debug information in ir.logging table

  • Warning constructor for the Warning 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.