odoo-js-doAction详解

doAction动作是常用的js动作之一,支持
ir.actions.act_url url跳转
原生代码:

function _executeActURLAction(action, options) {
    if (action.target === "self") {
        env.services.router.redirect(action.url);
    } else {
        const w = browser.open(action.url, "_blank");
        if (!w || w.closed || typeof w.closed === "undefined") {
            const msg = env._t(
                "A popup window has been blocked. You may need to change your " +
                    "browser settings to allow popup windows for this page."
            );
            env.services.notification.add(msg, {
                sticky: true,
                type: "warning",
            });
        }
        if (options.onClose) {
            options.onClose();
        }
    }
}

示例代码:

@api.model
def _redirect_to_iap_account(self):
    return {
        'type': 'ir.actions.act_url',
        'url': self.env['iap.account'].get_account_url(),
    }

ir.actions.act_window 后端窗口(后端form\tree视图等)调用
如代码:

await doAction(webClient, {
    name: "Action name",
    res_model: "foo",
    type: "ir.actions.act_window",
    views: [
        [false, "graph"],
        [false, "legacy_toy"],
    ],
    context: {
        search_default_forecast_filter: 1,
        forecast_field: "date_field",
    },
});

效果:
在这里插入图片描述

ir.actions.act_window_close 关闭窗口,通过用于主窗口的“next”步骤
ir.actions.client 触发完全在客户端中实现的动作
上面两行的使用范例:

return {
    'type': 'ir.actions.client',
    'tag': 'display_notification',
    'params': {
        'type': 'warning',
        'message': _("Two-factor authentication disabled for the following user(s): %s", ', '.join(self.mapped('name'))),
        'next': {'type': 'ir.actions.act_window_close'},
    }
}

ir.actions.report 生成qweb-html或qweb-pdf报表
见代码:
在这里插入图片描述

ir.actions.server 执行服务器端的动作
例如如下代码:
在这里插入图片描述
可以实现的效果:
在这里插入图片描述
上述代码解释说明:
和其他所有在数据文件(XML)中定义的数据一样,首先是一个包含属性 id 和 model 的 标签,我们要定义的是 Server Action, 所以需要将 model 设置为 ir.actions.server,然后是对应 Server Action 模型下的一些字段:

model_id:当前的动作是在哪个模型上运行的
binding_model_id:绑定的模型,当前动作将会出现在绑定的模型的视图中
state:服务器动作的类型,总共有 4 种可选的类型,分别是 code(执行 Python 代码),object_create(创建一条新记录),object_write(更新记录),multi(执行多个动作)
code:对应 state 的类型 code,为当前动作运行时所要执行的 Python 代码

大家应该都留意到了在上面的定义中出现了一个属性 ref,如果我没有理解错,它应该是 reference 的缩写,它的值是一个外部 ID(external id),我们上面定义的这个动作的外部 ID 就是定义时添加的 id 属性的值 action_mark_todo_task_done,它指向一条具体的记录(就像 Many2one 字段一样)。

我们定义的所有模型都会在 ir.model.data 对应的表中存在相应的记录,这些模型的外部 ID 形如 model_model_name,其中 model_name 是将模型名 model.name 的 . 替换成 _,例如我们的 todo.task 模型的外部 ID 就是前缀 model 加上 todo_task 组成的 model_todo_task 了。

接下来我们再看到字段 code 里面的内容,在这里面我们有一些变量是可以直接使用的:

env:Odoo 的运行环境
model:动作触发时对应的 Odoo 模型实例
record:动作触发时对应的单个记录(如在表单视图中运行对应当前表单所指向的记录),可能是空的
records:动作触发时对应的记录集(如在列表视图中勾选多条记录触发,记录集指向这些选中的记录),可能是空的
Python 库:time, datetime, dateutil, timezone 时间相关的 Python 库
log:用来记录日志信息
Warning:通过 raise Warning('xxxxx') 抛出警告信息

在这里插入图片描述

   async function doAction(actionRequest, options = {}) {
        const actionProm = _loadAction(actionRequest, options.additionalContext);
        let action = await keepLast.add(actionProm);
        action = _preprocessAction(action, options.additionalContext);
        switch (action.type) {
            case "ir.actions.act_url":
                return _executeActURLAction(action, options);
            case "ir.actions.act_window":
                if (action.target !== "new") {
                    await clearUncommittedChanges(env);
                }
                return _executeActWindowAction(action, options);
            case "ir.actions.act_window_close":
                return _executeCloseAction({ onClose: options.onClose, onCloseInfo: action.infos });
            case "ir.actions.client":
                return _executeClientAction(action, options);
            case "ir.actions.report":
                return _executeReportAction(action, options);
            case "ir.actions.server":
                return _executeServerAction(action, options);
            default: {
                let handler = actionHandlersRegistry.get(action.type, null);
                if (handler !== null) {
                    return handler({ env, action, options });
                }
                throw new Error(
                    `The ActionManager service can't handle actions of type ${action.type}`
                );
            }
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值