odoo16-python框架-动作
总结
1 模型和视图的 设计之美
view_ids, view_id,view_mode 最终目的都是为了生成views, 也就是视图.
模型是死的,像男人,一成不变
视图像女人,千变万化, 姿态万千
一阴一阳之谓道,设计之美又在这里得到了体现
2 所有的动作都可以通过web界面来配置
可以通过在"设置-技术-动作" 定义. 定义好之后会出现在对应模型的动作列表中
动作
动作定义了系统响应用户操作的行为比如,登录、操作按钮、选择发票、…
动作可以存储在数据库中,也可以直接作为字典返回,例如按钮方法。所有动作都有两个强制属性:
type
当前操作的类别决定了可以使用哪些字段以及如何解释操作
name
简短的用户可读的操作描述,可以显示在客户端界面中
客户端可以通过4种形式获得动作:
- False 如果当前打开了任何操作对话框,关闭它
- 字符换: 如果客户端action匹配,将其解释为客户端action的标记,否则将其视为数字
- 数字: 从数据库中读取相应的动作记录,可以是数据库标识符或外部id
- 字典: 将其视为客户端操作描述符并执行
1 绑定 Bindings
除了它们的两个强制属性,所有动作还共享可选属性,用于在任意模型的上下文菜单中显示动作:
1.1 binding_model_id
指定操作绑定到哪个模型
注意: 对于 Server Actions,使用model_id
1.2 binding_type
指定绑定的类型,主要是操作将出现在哪个上下文菜单下
action(default)
指定该动作将出现在绑定模型的action上下文菜单中。
report
指定该操作将出现在绑定模型的“打印”上下文菜单中。
这两个都是在form视图中才有的.
1.3 binding_view_types
一个逗号分隔的视图类型列表,操作将出现在上下文菜单中,主要是“list”和/或“form”。默认为列表,表单(列表和表单)
2 窗口动作(ir.actions.act_window)
最常见的动作类型,用于通过视图呈现模型的可视化:
- 特定的视图类型,如tree.form
- 特定的记录(通过domain来过滤)
有如下字段:
2.1 res_model
视图对应的模型名称
2.2 views(*)
(view_id, view_type)对的列表。每对中的第二个元素是视图(tree、from、graph等)的类别,第一个元素是可选的数据库id(或False)。如果没有提供id,客户端应该为所请求的模型获取指定类型的默认视图(这是由fields_view_get()自动完成的)。列表的第一种类型是默认视图类型,在执行动作时默认打开。每种视图类型在列表中最多只能出现一次
2.3 res_id(可选的)
如果默认视图是form,则指定要加载的记录(否则应该创建一个新记录)
2.4 search_view_id (optional)
(id, name)对,id是要为操作加载的特定搜索视图的数据库标识符。默认为获取模型的默认搜索视图
2.5 target (optional)
视图是否应该在主内容区(current)、全屏模式(fullscreen)或对话框/弹出(new)中打开。使用main代替current来清除面包屑。默认为current。
经过测试: 对于URL ACTIONS来说,只有new可以用,其他都报错
2.6context (optional)
传递给视图的其他上下文数据
2.7 domain (optional)
过滤域以隐式添加到所有视图搜索查询
2.8 limit (optional)
默认情况下在列表中显示的记录数。在web客户端中默认为80
2.9 案例
打开合作伙伴中的消费者的视图:
{"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 (default= tree,form )
以逗号分隔的视图类型列表(/!)\没有空格/!)。所有这些类型都将出现在生成的视图列表中(至少有一个False view_id)。
view_ids
M2M用于视图对象,定义了视图的初始内容
<record id="hr_leave_allocation_overtime_action" model="ir.actions.act_window"><field name="name">New Allocation Request</field><field name="res_model">hr.leave.allocation</field><field name="view_mode">form</field><field name="view_ids" eval="[(5, 0, 0), (0, 0, {'view_mode': 'form', 'view_id': ref('hr_leave_allocation_overtime_view_form')})]"/><field name="target">new</field>
</record>
又他们碰到eval了,这是啥意思呢?
注意 :
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">tree</field><field name="view_id" ref="view_test_tree"/><field name="act_window_id" ref="test_action"/>
</record>
这里有个实际的例子
<record id="hr_expense_actions_all" model="ir.actions.act_window">
<field name="name">Expenses Analysis</field>
<field name="res_model">hr.expense</field>
<field name="view_mode">graph,pivot,tree,form</field>
<field name="search_view_id" ref="hr_expense_view_search"/>
<field name="help" type="html">
<p class="o_view_nocontent_empty_folder">
No data yet!
</p><p>
Create new expenses to get statistics.
</p>
</field>
</record><record id="hr_expense_actions_all_graph" model="ir.actions.act_window.view">
<field name="view_mode">graph</field>
<field name="view_id" ref="hr_expense.hr_expense_view_graph"/>
<field name="act_window_id" ref="hr_expense_actions_all"/>
</record><record id="hr_expense_actions_all_pivot" model="ir.actions.act_window.view">
<field name="view_mode">pivot</field>
<field name="view_id" ref="hr_expense.hr_expense_view_pivot"/>
<field name="act_window_id" ref="hr_expense_actions_all"/>
</record><record id="hr_expense_actions_all_tree" model="ir.actions.act_window.view">
<field name="view_mode">tree</field>
<field name="view_id" ref="hr_expense_view_expenses_analysis_tree"/>
<field name="act_window_id" ref="hr_expense_actions_all"/>
</record>
view_id
指定一个特定的视图id, 它的类型在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 "视图,即使那不是模型的默认视图。
视图序列的服务器端组成如下:
- 从view_ids中获取each (id, type)(按顺序排序)
- 如果view_id已经定义,并且它的类型还没有被填充,那么就添加它的(id, type)
- 对于view_mode中每个未填充的类型,append (False, type)
view_ids, view_id,view_mode 最终目的都是为了生成views, 也就是视图.
模型是死的,像男人,一成不变
视图像女人,千变万化, 姿态万千
一阴一阳之谓道,设计之美又在这里得到了体现
3 URL动作(ir.actions.act_url)
允许通过Odoo操作打开URL(网站/网页)。可以通过两个字段进行定制:
3.1 url
动作时要打开的地址
3.2 target:
- new 在新窗口/页面中打开该地址(默认值)
- self 将当前内容替换为该页
{"type": "ir.actions.act_url","url": "https://odoo.com","target": "self",
}
4 服务器动作(ir.actions.server)
class odoo.addons.base.models.ir_actions.IrActionsServer(env, ids, prefetch_ids)[source]
服务器端的动作。服务器动作在基本模型上工作,并提供可以自动执行的各种类型的操作,例如使用基本操作规则,或者通过在“More”上下文菜单中手动添加操作。
从Odoo 8.0开始,在操作表单视图上增加了一个“创建菜单操作”按钮。它在基本模型的More菜单中创建了一个条目。这允许创建服务器操作并通过界面轻松地在批量模式下运行它们。
fatux: 没见过
可用的操作有:
- ’ Execute Python Code ':将被执行的Python代码块
- ’ Create a new Record ':用新值创建一个新记录
- ’ Write on a Record ':更新记录的值
- ’ Execute几个动作’:定义一个触发其他几个服务器动作的动作
允许从任何有效的操作位置触发复杂的服务器代码。只有两个字段与客户端相关:
id: 要执行的服务器端动作的在数据库中的ID
context (optional)
运行服务器操作时要使用的上下文数据
数据库内的记录非常丰富,可以根据它们的状态执行许多特定或通用的操作。一些字段(和相应的行为)在状态之间是共享的:
model_id 链接到动作的Odoo模型。
state:
- code:执行通过code参数给出的python代码。
- object_create:根据fields_lines规范创建一个新的模型crud_model_id记录。
- object_write:根据fields_lines规范更新当前记录
- multi:执行通过child_ids参数给出的几个动作。
4.2 State fields
根据其状态,行为通过不同的字段定义。每个字段后面都给出了相关的状态。
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 到ir.model.fields,指定当前记录的m2o字段,新创建的记录应该设置在该字段上(模型应该匹配)。
fields_lines (create/write)
创建或复制记录时重写的字段。One2many 有如下字段:
col1
在相关模型中设置的Ir.model.fields (crud_model_id用于创建,model_id用于更新)
value
字段的值,通过类型解释
type (value|reference|equation)
value :value字段被解释为文字值(可能被转换)
equation: value字段被解释为Python表达式并求值
reference: ?
child_ids (multi)
指定要在multi状态中执行的多个子操作(ir.actions.server)。如果子操作本身返回操作,则最后一个操作将作为multi自己的下一个操作返回给客户端
Evaluation context
在服务器动作的表达式上下文中有许多可用的key:
- model: 通过model_id链接到操作的模型对象
- Record /records :触发动作的Record /records,t可以为空。
- env Odoo环境
- datetime, dateutil, time, timezone对应的Python模块
- Log: Log (message, level=‘info’)日志功能,记录调试信息。日志表
- Warning异常的警告构造函数
fatux: 终于整理完了,感觉挺乱的,没怎么理明白,以后碰到实际案例再说吧
5 报表动作(ir.actions.report)
触发报表的打印。 在form视图的打印菜单里
如果您通过而不是标记定义报表,并且希望操作显示在模型视图的Print菜单中,那么您还需要从Bindings中指定binding_model_id。没有必要将binding_type设置为report,因为ir.actions.report将隐式默认为该值。
5.1 name (mandatory)
未指定print_report_name时用作文件名。否则,当在某种类型的列表中查找报表时,仅作为助记符/描述有用
5.2 model (mandatory)
你的报告将涉及的模型
5.3 report_type (default=qweb-pdf)
PDF报告使用qweb-pdf, HTML报告使用qweb-html
5.4 report_name (mandatory)
用于呈现报告的qweb模板的名称(外部id)
5.5 print_report_name
定义报表名称的Python表达式。
5.6 groups_id
Many2many字段到允许查看/使用当前报表的组
5.7 multi
如果设置为True,则该操作将不会显示在表单视图上。
5.8 paperformat_id
Many2one字段转换为您希望用于此报告的纸张格式(如果未指定,将使用公司格式)。
5.9 attachment_use
如果设置为True,则报告只在第一次请求时生成一次,然后从存储的报告中重新打印,而不是每次都重新生成。
5.10 attachment
定义报表名称的Python表达式;record 可以作为变量对象访问
6 客户端动作(ir.actions.client)
触发一个完全在客户端实现的操作。
6.1 tag
操作的客户端标识符,一个客户端应该知道如何做出反应的任意字符串
6.2 params (optional)
与客户端动作标记一起发送给客户端的附加数据的Python字典
6.3 target (optional)
- current: 当前主内容区域
- fullscreen: 全屏
- new: 对话框/弹窗
- main: 代替current, 清除面包屑导航
默认值是current
{"type": "ir.actions.client","tag": "pos.ui"
}
告诉客户端启动销售点接口,服务器不知道POS接口是如何工作的。
7 定时任务(ir.cron)
动作在预定义的频率上自动触发。
- name : 自动动作的名称(主要用于日志显示)
- interval_number: 两次执行操作之间的interval_type uom数
- interval_type:频率间隔的测量单位(minutes
,hours,days,weeks,months) - numbercall:此操作运行的次数。如果期望该操作无限期地运行,则设置为-1。
- doall:布尔值, 表示在服务器重启的情况下是否必须执行错过的操作。
- model_id: 将调用此操作的模型
- code:操作的代码内容。可以是对模型方法的简单调用:
- nextcall: 此操作的下一个计划执行日期(日期/时间格式)
相关文章:
odoo16-python框架-动作
总结 1 模型和视图的 设计之美 view_ids, view_id,view_mode 最终目的都是为了生成views, 也就是视图. 模型是死的,像男人,一成不变 视图像女人,千变万化, 姿态万千 一阴一阳之谓道,设计之美又在这里得到了体现 2 所有的动作都可以通过web界面来配置 可以通过在"设…...
微信小程序——同一控件的点击与长按事件共存的解决方案
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
selenium自动化-获取元素属性信息
在写自动化过程中我们会想验证自己的代码是否正确,比如登录之后,通过用户名或其他信息来证明你登录成功,或者点击链接后,是否会跳转新的页面。通过获取元素属性信息,可以解决我们的疑惑。 一、获取内容对象的内容信息 …...
LabVIEW开发小型减阻试验平台
LabVIEW开发小型减阻试验平台 湍流摩擦在粘性流体的阻力中起着重要作用,减少湍流摩擦是流体力学领域的热门话题之一。在油气管道的长距离流体输送中,泵站提供的几乎所有动力都用于克服流体的胫骨摩擦。在流体输送领域,船舶的蒙皮摩擦阻力占总…...
解决分类任务中数据倾斜问题
大家好,在处理文本分类任务时,基准测试流行的自然语言处理架构的性能是建立对可用选项的理解的重要步骤。在这里,本文将深入探讨与分类相关的最常见的挑战之一——数据倾斜。如果你曾经将机器学习(ML)应用于真实世界的…...
Vue3 word如何转成pdf代码实现
🙂博主:锅盖哒 🙂文章核心:word如何转换pdf 目录 1.前端部分 2.后端部分 在Vue 3中,前端无法直接将Word文档转换为PDF,因为Word文档的解析和PDF的生成通常需要在后端进行。但是,你可以通过Vu…...
fpga--流水灯
fpga流水灯的设计 思路:外部时钟频率50mhz,若要实现每隔0.5s闪烁一次,则使用内部计数器计数到24999999拉高一个周期电平,当电平被拉高的时候,进行LED灯电平的设置,每次检测到高电平,就进行一位…...
51单片机:数码管和矩阵按键
目录 一:动态数码管模块 1:介绍 2:共阴极和共阳极 A:共阴极 B:共阳极 C:转化表 3:74HC138译码器 4:74HC138译码器控制动态数码管 5:数码管显示完整代码 二:矩阵按键模块 1:介绍 2:原理图 3:矩阵按键代码 一:动态数码管模块 1:介绍 LED数码管:数码管是一种…...
Django + Xadmin 数据列表复选框显示为空,怎么修复这个问题?
问题描述: 解决方法: 后续发现的报错: 解决方案: 先根据报错信息定位到源代码: 在该文件顶部写入: from django.core import exceptions然后把: except models.FieldDoesNotExist修改为&…...
《向量数据库指南》——Milvus Cloud2.2.12 易用性,可视化,自动化大幅提升
Milvus Cloud又迎版本升级,三大新特性全力加持,易用性再上新台阶! 近期,Milvus Cloud上线了 2.2.12 版本,此次更新不仅一次性增加了支持 Restful API、召回原始向量、json_contains 函数这三大特性,还优化了 standalone 模式下的 CPU 使用、查询链路等性能,用一句话总…...
Python web实战 | 用 Flask 框架快速构建 Web 应用【实战】
概要 Python web 开发已经有了相当长的历史,从最早的 CGI 脚本到现在的全栈 Web 框架,现在已经成为了一种非常流行的方式。 Python 最早被用于 Web 开发是在 1995 年(90年代早期),当时使用 CGI 脚本编写动态 Web 页面…...
十、数据结构——链式队列
数据结构中的链式队列 目录 一、链式队列的定义 二、链式队列的实现 三、链式队列的基本操作 ①初始化 ②判空 ③入队 ④出队 ⑤获取长度 ⑥打印 四、循环队列的应用 五、总结 六、全部代码 七、结果 在数据结构中,队列(Queue)是一种常见…...
Improving Cross-Modal Retrieval with Set of Diverse Embeddings
框架图: Using Triplet Loss: Smooth-Chamfer similarity Using Log-Sum-Exp,...
物联网阀控水表计量准确度如何?
物联网阀控水表是一种新型的智能水表,它采用了先进的物联网技术,可以通过远程控制和监测水表的运行情况,实现更加精准的水量计量和费用结算。那么,物联网阀控水表的计量准确度如何呢?下面我们将从以下几个方面进行详细…...
【C语言数据结构】模拟·顺序表·总项目实现
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
自然语言处理从入门到应用——LangChain:模型(Models)-[文本嵌入模型Ⅰ]
分类目录:《自然语言处理从入门到应用》总目录 本文将介绍如何在LangChain中使用Embedding类。Embedding类是一种与嵌入交互的类。有很多嵌入提供商,如:OpenAI、Cohere、Hugging Face等,这个类旨在为所有这些提供一个标准接口。 …...
使用Gradio构建生成式AI应用程序; Stability AI推出Stable Diffusion XL 1.0
🦉 AI新闻 🚀 Stability AI推出最先进的AI工具Stable Diffusion XL 1.0 摘要:Stability AI宣布推出Stable Diffusion XL 1.0,该版本是其迄今为止最先进的AI工具。Stable Diffusion XL 1.0提供更鲜艳、更准确的图片生成ÿ…...
Java 递归计算斐波那契数列指定位置上的数字
Java 递归计算斐波那契数列指定位置上的数字 一、原理二、代码实现三、运行结果 一、原理 斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多斐波那契(Leonardo Fibonacci)以兔子繁殖为…...
ai数字人透明屏的应用场景有哪些?
AI数字人透明屏的应用场景: 银行、保险、售楼处等接待场景:AI数字人透明屏可以作为接待员,提供详细的信息和导航,提高客户体验和服务效率。 商业街、购物中心等场所:AI数字人透明屏可以作为导购员,提供商品…...
一、1、Hadoop的安装与环境配置
安装JDK: 首先检查Java是否已经安装: java -version 如果没有安装,点击链接https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 并选择相应系统以及位数下载(本文选择jdk-8u381-linux-x64…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
