odoo17 | 核心组件 - 动作(Actions)

2024-02-29 05:52

本文主要是介绍odoo17 | 核心组件 - 动作(Actions),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

动作Actions

在Odoo中,动作(Actions)是系统的核心组件之一,负责定义系统响应用户交互的具体行为。动作定义了系统对用户操作的响应行为,例如登录、按钮点击、发票选择等。动作可以存储在数据库中或直接作为字典在按钮方法中返回。所有动作都具有两个必需的属性:

  1. type:当前动作的类别,决定了哪些字段可以使用以及如何解释该动作。
  2. name:动作的简短用户可读描述,可能显示在客户端界面中。

客户端可以通过以下四种形式获取动作:

  • False:如果任何动作对话框当前处于打开状态,则关闭它。
  • 字符串:如果客户端动作匹配,则将其解释为客户端动作的标签;否则,将其视为数字。
  • 数字:从数据库中读取相应动作记录,可能是数据库标识符或外部ID。
  • 字典:将其视为客户端动作描述符并执行。

绑定

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

  • binding_model_id:指定动作绑定到的模型。
  • binding_type(默认为action):指定绑定类型,主要决定动作将出现在哪个上下文菜单下。如:
    • action(默认):指定动作将在绑定模型的动作上下文菜单中出现。
    • report:指定动作将在绑定模型的打印上下文菜单中出现。
  • binding_view_types:一个逗号分隔的视图类型列表,指明动作将在哪种视图类型的上下文菜单中出现,通常是“list”和/或“form”。默认为两者(列表和表单)。

窗口动作(ir.actions.act_window)

最常见的动作类型,用于通过视图展示模型的可视化表示:窗口动作定义了一个模型(及该模型特定记录)的一系列视图类型(及可能的具体视图)。

其字段包括:

  • res_model:要展示视图的模型。
  • views:一个包含一对对的列表。每对的第二个元素是视图类别(如tree、form、graph等),第一个元素是可选的数据库ID(或False)。如果不提供ID,则客户端应获取请求模型的指定类型的默认视图(由fields_view_get()自动完成)。列表中的第一种视图类型将是默认视图类型,在执行动作时默认打开。列表中每种视图类型至多出现一次。
  • res_id(可选):如果默认视图是form,则指定要加载的记录(否则应创建新的记录)。
  • search_view_id(可选):(id, name)对,是该动作要加载的具体搜索视图的数据库标识符。默认情况下,获取模型的默认搜索视图。
  • target(可选):视图应在何处打开——主内容区域(current)、全屏模式(fullscreen)、新窗口/弹出窗口(new)。使用new代替current以清除面包屑。默认为current。
  • context(可选):传递给视图的附加上下文数据。
  • domain(可选):添加到所有视图搜索查询的隐式过滤条件域。
  • limit(可选):默认在列表中显示的记录数量。在web客户端中,默认为80。

例如,打开客户(带有customer标志设置的partner)的列表和表单视图:

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

数据库中的窗口动作具有一些不同的字段,客户端应当忽略这些字段,主要用于在列表中组合视图:

  • view_mode(默认为tree,form):字符串形式的视图类型逗号分隔列表(注意:不包含空格!)。列表中的所有类型都将出现在生成的视图列表中(至少有一个view_id)。
  • view_ids:到视图对象的M2M1,定义视图的初始内容。

若计划允许模型有多个视图,请优先使用.ir.actions.act_window.view而不是动作的view_ids。

URL动作(ir.actions.act_url)

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

  • url:激活动作时要打开的地址。
  • target(默认为new):可用值包括:
    • new:在新窗口/页面中打开URL。
    • self:在当前窗口/页面中打开URL(替换实际内容)。
    • download:重定向到下载URL。

示例:

{"type": "ir.actions.act_url","url": "https://odoo.com","target": "self"
}

这将会用Odoo主页替换当前内容区域。

服务器动作(ir.actions.server)

类 odoo.addons.base.models.ir_actions.IrActionsServer(env, ids, prefetch_ids)

服务器动作模型,针对基础模型工作,并提供了多种可以自动执行的动作,比如通过基础动作规则自动执行,或者手动执行,通过将动作添加到“更多”上下文菜单中。

自Odoo 8.0版本开始,在动作表单视图上提供了一个“创建菜单动作”按钮。它会在基础模型的“更多”菜单中创建一个条目。这使得能够通过界面轻松创建并批量运行服务器动作。

可使用的动作包括:

  • ‘执行Python代码’:将被执行的一段Python代码块
  • ‘创建新记录’:根据指定的新值创建一个新的记录
  • ‘写入记录’:更新记录的值
  • ‘执行多个动作’:定义触发其他多个服务器动作的动作

允许从任何有效操作位置触发复杂的服务器端代码。对客户端来说,只有两个字段至关重要:

  • id:在数据库中要运行的服务器动作的标识符

  • context(可选):在运行服务器动作时使用的上下文数据
    而在数据库中的记录则更为丰富,可以根据它们的状态执行多种特定或通用的操作。其中,部分字段(及其对应的行为)在不同状态间共享:

  • model_id:与动作关联的Odoo模型

根据不同状态,行为通过不同的字段定义。下面列出各状态对应的字段:

  • state

    • code:通过参数code执行提供的Python代码

    • object_create:根据crud_model_id和fields_lines字段中的规范创建模型的新记录

    • object_write:根据fields_lines字段中的规范更新当前记录(或记录集)

    • multi:通过参数child_ids给出并执行多个动作

状态字段

依据其状态,动作的行为是通过不同的字段来定义的。每个字段后都会注明对应的状态。

  • code(code状态) 在动作被调用时,指定要执行的一段Python代码。
<record model="ir.actions.server" id="print_instance"><field name="name">合作伙伴服务器动作</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">合作伙伴服务器动作</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状态,必填):要在其中创建新记录的模型

  • link_field_id(create状态):指向ir.model.fields的many2one关系,指定当前记录中的m2o字段,新创建的记录应与此字段关联

  • fields_lines(create/write状态):在创建或复制记录时需要覆盖的字段。One2many关系,包含以下字段:

    • col1:在相关模型中要设置的ir.model.fields(对于创建,对于更新)
    • value:字段值,根据type字段解释
    • type(value|reference|equation):如果为value,则字段被解释为字面值(可能经过转换);如果为equation,则字段被解释为Python表达式并求值
  • child_ids(multi状态):指定在multi状态下执行的多个子动作(ir.actions.server)。如果子动作自身返回动作,最后一个子动作将作为multi状态自身的下一个动作返回给客户端

评估上下文

在服务器动作或与其相关的评估上下文中,有一系列键可供使用:

  • model:通过model_id链接到动作的模型对象
  • record/records:触发动作的记录/记录集,可能为空
  • env:Odoo环境
  • datetime, dateutil, time, timezone:相应的Python模块
  • log:日志函数,用于在ir.logging表中记录调试信息
  • Warning:异常构造器,用于警告

报告动作(ir.actions.report)

触发报告的打印。

如果你通过<report>标签而非ir.actions.report定义你的报告,并且希望该动作在模型视图的“打印”菜单中显示,还需要指定binding_model_idbinding_type。不需要设置binding_typereport,因为默认情况下它会隐式设为此值。

报告动作的相关字段包括:

  • name(必需):如果没有指定print_report_name,则用作文件名。否则,仅在查找报告列表时作为报告的助记/描述
  • model(必需):报告所针对的模型
  • report_type(默认为qweb-pdf):可以是qweb-pdf(PDF报告)或qweb-html(HTML报告)
  • report_name(必需):用于呈现报告的qweb模板的名称(外部ID)
  • print_report_name:定义报告名称的Python表达式
  • groups_id:许多对多的关系,指向允许查看/使用当前报告的组
  • multi:如果设置为True,该动作不会在表单视图中显示
  • paperformat_id:指向您希望为本报告使用的纸张格式的many2one关系(如果不指定,则使用公司格式)
  • attachment_use:如果设置为True,报告只会首次请求时生成一次,之后重新打印存储的报告,而不再每次重新生成
    可用于那些必须只生成一次的报告(例如出于法律原因)
  • attachment:定义报告名称的Python表达式;记录作为对象变量可访问

客户端动作(ir.actions.client)

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

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

  • params(可选):附加数据的Python字典,随客户端动作标签一起发送给客户端。

  • target(可选):指示客户端动作是否应在主内容区域(current)、全屏模式(fullscreen)或对话框/弹出窗口(new)中打开。使用new代替current以清除面包屑。默认为current

例如:

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

这段代码告诉客户端启动销售点(POS)界面,服务器并不了解POS界面的工作原理。

参阅:

在服务器端,我们简单地定义了一个操作:ir.actions.client

<record id="action_home_page" model="ir.actions.client"><field name="tag">petstore.homepage</field>
</record>

以及打开操作的菜单:

<menuitem id="home_page_petstore_menu" parent="petstore_menu"name="Home Page" action="action_home_page"/>

视图的体系结构

自动化动作(ir.cron)

在预定义频率上自动触发的动作(定时任务)。

  • name:自动化动作的名称(主要用于日志显示)

  • interval_number:两次执行动作之间的间隔数,单位为interval_type指定的时间单位

  • interval_type:频率间隔单位(小时、分钟、天、周、月)

  • numbercall:此动作需要运行的次数。如果期望动作无限期运行,请设置为-1

  • doall:布尔值,指定在服务器重启时是否需要执行错过的动作。

  • model_id:此动作将被调用的模型

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

    model.<method_name>()
    
  • nextcall:此动作的下一次计划执行日期(日期/时间格式)

这篇关于odoo17 | 核心组件 - 动作(Actions)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757772

相关文章

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

vue解决子组件样式覆盖问题scoped deep

《vue解决子组件样式覆盖问题scopeddeep》文章主要介绍了在Vue项目中处理全局样式和局部样式的方法,包括使用scoped属性和深度选择器(/deep/)来覆盖子组件的样式,作者建议所有组件... 目录前言scoped分析deep分析使用总结所有组件必须加scoped父组件覆盖子组件使用deep前言

基于Qt Qml实现时间轴组件

《基于QtQml实现时间轴组件》时间轴组件是现代用户界面中常见的元素,用于按时间顺序展示事件,本文主要为大家详细介绍了如何使用Qml实现一个简单的时间轴组件,需要的可以参考下... 目录写在前面效果图组件概述实现细节1. 组件结构2. 属性定义3. 数据模型4. 事件项的添加和排序5. 事件项的渲染如何使用

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

vue2 组件通信

props + emits props:用于接收父组件传递给子组件的数据。可以定义期望从父组件接收的数据结构和类型。‘子组件不可更改该数据’emits:用于定义组件可以向父组件发出的事件。这允许父组件监听子组件的事件并作出响应。(比如数据更新) props检查属性 属性名类型描述默认值typeFunction指定 prop 应该是什么类型,如 String, Number, Boolean,

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除