本文主要是介绍odoo17 | 核心组件 - 动作(Actions),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
动作Actions
在Odoo中,动作(Actions)是系统的核心组件之一,负责定义系统响应用户交互的具体行为。动作定义了系统对用户操作的响应行为,例如登录、按钮点击、发票选择等。动作可以存储在数据库中或直接作为字典在按钮方法中返回。所有动作都具有两个必需的属性:
type
:当前动作的类别,决定了哪些字段可以使用以及如何解释该动作。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_id
和binding_type
。不需要设置binding_type
为report
,因为默认情况下它会隐式设为此值。
报告动作的相关字段包括:
- 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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!