Odoo8 - 需要一个ir.actions.server一个接一个地执行多个动作的例子

时间:2017-04-05 11:01:58

标签: odoo-8

在wizzard视图中,我有一个按钮,在'ir.action.act_url'中返回pdf报告。它工作正常。问题是,在pdf出现后,我希望wizzard窗口自动关闭。要做到这一点,我可以返回close_window dict。

另外这两个'返回'工作正常。

我想一个接一个地执行两个动作。我发现使用具有多属性的ir.action.server可以实现这一点。

不幸的是我找不到一个例子。

close_window = {'type': 'ir.actions.act_window_close'}

final_report = {
    'type': 'ir.actions.act_url',
    'url': '/web/binary/saveas?model=ir.attachment&field=datas&
    filename_field=name&id=' + str(file.id),
    'target': 'self',
}

return final_report

2 个答案:

答案 0 :(得分:0)

检查Odoo附带的ir_actions测试,他们可能会帮助您朝正确的方向发展。

碱/测试/ test_ir_actions.py

def test_60_multi(self):
    cr, uid = self.cr, self.uid

    # Data: 2 server actions that will be nested
    act1_id = self.ir_actions_server.create(cr, uid, {
        'name': 'Subaction1',
        'sequence': 1,
        'model_id': self.res_partner_model_id,
        'state': 'code',
        'code': 'action = {"type": "ir.actions.act_window"}',
    })
    act2_id = self.ir_actions_server.create(cr, uid, {
        'name': 'Subaction2',
        'sequence': 2,
        'model_id': self.res_partner_model_id,
        'state': 'object_create',
        'use_create': 'copy_current',
    })
    act3_id = self.ir_actions_server.create(cr, uid, {
        'name': 'Subaction3',
        'sequence': 3,
        'model_id': self.res_partner_model_id,
        'state': 'code',
        'code': 'action = {"type": "ir.actions.act_url"}',
    })
    self.ir_actions_server.write(cr, uid, [self.act_id], {
        'state': 'multi',
        'child_ids': [(6, 0, [act1_id, act2_id, act3_id])],
    })

    # Do: run the action
    res = self.ir_actions_server.run(cr, uid, [self.act_id], context=self.context)

    # Test: new partner created
    pids = self.res_partner.search(cr, uid, [('name', 'ilike', 'TestingPartner (copy)')])  # currently res_partner overrides default['name'] whatever its value
    self.assertEqual(len(pids), 1, 'ir_actions_server: TODO')
    # Test: action returned
    self.assertEqual(res.get('type'), 'ir.actions.act_url')

    # Test loops
    with self.assertRaises(except_orm):
        self.ir_actions_server.write(cr, uid, [self.act_id], {
            'child_ids': [(6, 0, [self.act_id])]
        })

我自己没有这样做,但看起来您必须指定它是multi操作,并指定要执行的child_ids操作。

另请注意,根据文档(https://www.odoo.com/documentation/8.0/reference/actions.html):

  

     

一个接一个地执行多个动作。要执行的操作是   通过child_ids m2m定义。如果子行动本身返回   动作,最后一个将作为多个返回给客户端   自己的下一步行动

答案 1 :(得分:0)

根据@dgeorgiev,我写了更多代码。我设法创建服务器操作,并且单独此操作可以返回pdf文件或关闭窗口。但我无法将这两个回归结合起来。见下文:

# first server action returning pdf 
ir_actions_server = self.env['ir.actions.server']
act1_id = ir_actions_server.create({
    'type': 'ir.actions.server',
    'name': 'divided_package_labels',
    'sequence': 1,
    'model_id': self.id,
    'state': 'code',
    'code': 'action = {"type": "ir.actions.act_url", "url": "/web/binary/saveas?model=ir.attachment&field=datas&filename_field=name&id= %s", "target": "new"}' % str(file.id),
})
# second server action closing window 
act2_id = ir_actions_server.create({
    'type': 'ir.actions.server',
    'name': 'Close_sale.package.wizard',
    'sequence': 2,
    'model_id': self.id,
    'state': 'code',
    'code': 'action = {"type": "ir.actions.act_window_close"}'
})
# server action for combining two previously described
act_id = ir_actions_server.create({
    'type': 'ir.actions.server',
    'name': 'TestAction',
    'condition': 'True',
    'model_id': self.id,
    'state': 'multi',
    # 'child_ids': [(6, 0, [act1_id.id])]  # return pdf
    # 'child_ids': [(6, 0, [act2_id.id])]  # close window
    'child_ids': [(6, 0, [act1_id.id, act2_id.id])]  # close window, no pdf file

})

print act_id, act1_id, act2_id   
print "act_id.child_ids", act_id.child_ids 
# shows that the relations are properly made 

# run
return act_id.run()

可能有一个小错误,但我找不到它。