Openerp Odoo自动执行服务器操作以触发另一个服务器操作

Openerp Odoo自动执行服务器操作以触发另一个服务器操作,openerp,Openerp,假设我在stock.inventory模型上设置了服务器操作A。此操作只需记录一个值,然后调用服务器操作B(数据库ID为366)。动作中的python代码只是: log('running server action a') value = { "type": "ir.actions.server", "id": 366, } 然后,在product.product模型上的服务器操作B中,python代码只是: log('running server aciton b') 现在,当我

假设我在
stock.inventory
模型上设置了服务器操作A。此操作只需记录一个值,然后调用服务器操作B(数据库ID为366)。动作中的python代码只是:

log('running server action a')
value = {
  "type": "ir.actions.server",
   "id": 366,
}
然后,在
product.product
模型上的服务器操作B中,python代码只是:

log('running server aciton b')
现在,当我将服务器操作A添加到“更多”菜单,并从
stock.inventory
对象上的浏览器手动触发它时,两个操作都成功运行。换句话说,我在日志中看到“运行服务器操作a”和“运行服务器操作b”

现在,我创建了一个自动操作,在更新或创建
stock.inventory
对象时触发服务器操作。完成此操作后,通过UI更新或创建
stock.inventory
对象,我在日志中只看到“运行服务器操作a”。换句话说,服务器操作B从未像我从“更多”菜单手动运行相同实验时那样被触发


因此,我的问题是,如果第一个服务器操作是由自动操作触发的,那么是否可以从第一个服务器操作触发第二个服务器操作。

如果您可以访问管理部分。您应该能够直接调用该函数。在odoo8中,它看起来是这样的

选择您的服务器操作

请注意python代码部分。您应该能够找到所需的模型并直接执行该函数

action = self.env['addon.model'].the_fun()
要执行另一个操作,请尝试以下操作

action = self.env['ir.actions.server'].ref('xml_id_of_action')
action.run_action_code_multi() 
这是描述

run\u action\u code\u multi(self、*args、**kwargs)
重写以允许以与操作相同的方式返回响应
由基本服务器操作行为返回。请注意,答案是否定的

优先于行动,避免同时使用两者。

我能够实现这一点,解决方案非常简单。对于Odoo Online用户来说,这似乎是一种非常酷的方式,可以将服务器操作视为可以向调用服务器操作返回值的函数

这里有一个例子

服务器操作A

a = env['ir.actions.server'].browse(409)
ctx = dict(env.context or {})
ctx.update({'active_id': 169, 'active_model': 'purchase.order'})
a.with_context(ctx).run()
a = env['ir.actions.server'].browse(409)
ctx = dict(env.context or {})
ctx.update({'active_id': 169, 'active_model': 'purchase.order'})
resp = a.with_context(ctx).run()
raise Warning(resp)
服务器操作B(ID=409)

当触发第一个操作时,您将获得字符串
purchase.order(169,)
作为输出

更酷的是,如果第二个服务器将值分配给
操作
,它将返回给第一个操作。例如:

服务器操作A

a = env['ir.actions.server'].browse(409)
ctx = dict(env.context or {})
ctx.update({'active_id': 169, 'active_model': 'purchase.order'})
a.with_context(ctx).run()
a = env['ir.actions.server'].browse(409)
ctx = dict(env.context or {})
ctx.update({'active_id': 169, 'active_model': 'purchase.order'})
resp = a.with_context(ctx).run()
raise Warning(resp)
服务器操作B(ID=409)


当您触发第一个服务器操作时,您将看到169作为响应。

您如何调用该操作?我认为,从自动操作的上下文来看,您需要调用该方法,而不是返回操作。这类问题的语义可能看起来很奇怪。我正在调用一个服务器操作,该操作返回一个窗口操作,在我将操作值分配给返回的窗口操作之前,任何操作都不起作用。但是,在正常情况下,我只会返回窗口操作,并希望它加载视图。我不确定,但我想知道从浏览器调用函数返回的操作是否与从代码调用的操作不同。您可能需要直接调用另一个方法,而不是返回实际上只是调用该方法的操作。@PhillipStack我认为您是对的。似乎当你“返回一个动作”时,浏览器就能理解这一点。它知道如何调用服务器并执行返回的操作。我很想像你建议的那样简单地调用这个方法,但不幸的是,我在Odoo Online的一个版本上做了所有这些,这意味着,我无法访问源代码。我正在通过UI添加这些操作,无法找到从另一个服务器端触发操作的方法。您使用的是什么版本?我认为,如果您有权访问管理-->设置-->操作部分,则可以定义代码。版本10。我还没看过那份菜单。我所见过的唯一一个是我定义服务器操作的地方,即设置/技术/操作/服务器操作。我知道python代码字段,这就是我首先创建操作的方式,并包括代码以记录值,如原始问题所示。问题是,我想从代码框中触发另一个操作,但我不知道怎么做。这有意义吗?我不完全确定在python代码框中调用odoo函数的上下文是什么。我会更新我的答案。尝试在其他操作上简单地调用该函数。我不知道该如何行动。但是你可能可以调用这个函数,我不能直接调用这个方法,因为这个方法不存在,因为我使用的是在线odoo。没有方法,这是另一个服务器操作。除非服务器操作以某种方式自动命名,允许它作为模型上的方法调用?那很好,但听起来好像不是真的。那么您的另一个服务器操作,为什么不执行它应该执行的代码呢?如果您有一个操作,其代码调用另一个操作,该操作可能执行某些代码。为什么不去掉中间人呢。只需执行第二个操作代码。第二个操作包含在product.product模型上设置要隔离的字段的逻辑。意思是,我希望能够从不同的地方触发代码。例如创建stock.move和创建sale.order时。诸如此类的事情。