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

2024-02-29 1636阅读

温馨提示:这篇文章已超过387天没有更新,请注意相关的内容是否还可用!

动作Actions

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

odoo17 | 核心组件 - 动作(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代码。
                              合作伙伴服务器动作
                              
                              code
                              
                                  raise Warning(record.name)
                              
                          
                          

                          注:代码段可以定义一个名为action的变量,该变量将作为客户端下一步要执行的动作返回:

                              合作伙伴服务器动作
                              
                              code
                              
                                  if record.some_condition():
                                      action = {
                                          "type": "ir.actions.act_window",
                                          "view_mode": "form",
                                          "res_model": record._name,
                                          "res_id": record.id,
                                      }
                              
                          
                          

                          这样,当记录满足某种条件时,会要求客户端打开该记录的表单视图。

                          • 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)

                                触发报告的打印。

                                如果你通过标签而非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

                                        petstore.homepage
                                    
                                    

                                    以及打开操作的菜单:

                                     
                                    

                                    视图的体系结构

                                    自动化动作(ir.cron)

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

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

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

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

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

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

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

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

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

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]