2016-03-05 17:51:35 +01:00
|
|
|
# HG changeset patch
|
|
|
|
# User Cédric Krier <cedric.krier@b2ck.com>
|
|
|
|
Execute action synchronously
|
|
|
|
|
|
|
|
|
|
|
|
The clicked event must be blocked when the action is started, so the retrieval
|
|
|
|
of the action definition should be synchronous to be done inside the
|
|
|
|
try/finally.
|
|
|
|
|
|
|
|
issue5362
|
|
|
|
review23901002
|
|
|
|
|
|
|
|
Index: tryton/action/main.py
|
|
|
|
===================================================================
|
|
|
|
|
2016-03-05 18:03:29 +01:00
|
|
|
--- a/tryton/tryton/action/main.py
|
|
|
|
+++ b/tryton/tryton/action/main.py
|
2016-03-05 17:51:35 +01:00
|
|
|
@@ -54,31 +54,16 @@
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def execute(act_id, data, action_type=None, context=None):
|
|
|
|
- def get_action_type(actions):
|
|
|
|
- try:
|
|
|
|
- action, = actions()
|
|
|
|
- except RPCException:
|
|
|
|
- return
|
|
|
|
+ # Must be executed synchronously to avoid double execution
|
|
|
|
+ # on double click.
|
|
|
|
+ if not action_type:
|
|
|
|
+ action, = RPCExecute('model', 'ir.action', 'read', [act_id],
|
|
|
|
+ ['type'], context=context)
|
|
|
|
action_type = action['type']
|
|
|
|
- exec_action(action_type)
|
|
|
|
-
|
|
|
|
- def exec_action(action_type):
|
|
|
|
- def callback(actions):
|
|
|
|
- try:
|
|
|
|
- action, = actions()
|
|
|
|
- except RPCException:
|
|
|
|
- return
|
|
|
|
- Action._exec_action(action, data, context=context)
|
|
|
|
-
|
|
|
|
- RPCExecute('model', action_type, 'search_read',
|
|
|
|
- [('action', '=', act_id)], 0, 1, None, None,
|
|
|
|
- context=context, callback=callback)
|
|
|
|
-
|
|
|
|
- if not action_type:
|
|
|
|
- RPCExecute('model', 'ir.action', 'read', [act_id],
|
|
|
|
- ['type'], context=context, callback=get_action_type)
|
|
|
|
- else:
|
|
|
|
- exec_action(action_type)
|
|
|
|
+ action, = RPCExecute('model', action_type, 'search_read',
|
|
|
|
+ [('action', '=', act_id)], 0, 1, None, None,
|
|
|
|
+ context=context)
|
|
|
|
+ Action._exec_action(action, data, context=context)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def _exec_action(action, data=None, context=None):
|
|
|
|
|
|
|
|
Index: tryton/gui/window/view_form/view/list_gtk/widget.py
|
|
|
|
===================================================================
|
|
|
|
|
2016-03-05 18:03:29 +01:00
|
|
|
--- a/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py
|
|
|
|
+++ b/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py
|
2016-03-05 17:51:35 +01:00
|
|
|
@@ -909,4 +909,8 @@
|
|
|
|
if state_changes.get('invisible') \
|
|
|
|
or state_changes.get('readonly'):
|
|
|
|
return True
|
|
|
|
- self.view.screen.button(self.attrs)
|
|
|
|
+ widget.handler_block_by_func(self.button_clicked)
|
|
|
|
+ try:
|
|
|
|
+ self.view.screen.button(self.attrs)
|
|
|
|
+ finally:
|
|
|
|
+ widget.handler_unblock_by_func(self.button_clicked)
|
|
|
|
|