在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
答案 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()
可能有一个小错误,但我找不到它。