Add patch to convert wizard to synchronous

This commit is contained in:
Bernat Brunet Torruella 2016-03-05 17:51:35 +01:00
parent 72efe42030
commit 7b853a9e60
3 changed files with 149 additions and 0 deletions

71
issue17881002_1.diff Normal file
View File

@ -0,0 +1,71 @@
# HG changeset patch
# User Cédric Krier <cedric.krier@b2ck.com>
Disable button during click processing
The click event must be blocked when the screen method is called to limit
double execution. A double execution is still possible if the execution of the
action, which is asynchronous, is not started fast enough.
issue5362
review17881002
Index: src/view/form.js
===================================================================
--- a/public_data/sao/src/view/form.js
+++ b/public_data/sao/src/view/form.js
@@ -361,7 +361,12 @@
},
button_clicked: function(event) {
var button = event.data;
- this.screen.button(button.attributes);
+ button.el.prop('disabled', true);
+ try {
+ this.screen.button(button.attributes);
+ } finally {
+ button.el.prop('disabled', false);
+ }
},
selected_records: function() {
if (this.screen.current_record) {
Index: src/view/tree.js
===================================================================
--- a/public_data/sao/src/view/tree.js
+++ b/public_data/sao/src/view/tree.js
@@ -1509,7 +1509,7 @@
},
render: function(record) {
var button = new Sao.common.Button(this.attributes);
- button.el.click(record, this.button_clicked.bind(this));
+ button.el.click([record, button], this.button_clicked.bind(this));
var fields = jQuery.map(this.screen.model.fields,
function(field, name) {
if ((field.description.loading || 'eager') ==
@@ -1526,7 +1526,8 @@
return button.el;
},
button_clicked: function(event) {
- var record = event.data;
+ var record = event.data[0];
+ var button = event.data[1];
if (record != this.screen.current_record) {
return;
}
@@ -1534,7 +1535,12 @@
if (states.invisible || states.readonly) {
return;
}
- this.screen.button(this.attributes);
+ button.el.prop('disabled', true);
+ try {
+ this.screen.button(this.attributes);
+ } finally {
+ button.el.prop('disabled', false);
+ }
}
});

75
issue23901002_1.diff Normal file
View File

@ -0,0 +1,75 @@
# 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
===================================================================
--- a/tryton/action/main.py
+++ b/tryton/action/main.py
@@ -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
===================================================================
--- a/tryton/gui/window/view_form/view/list_gtk/widget.py
+++ b/tryton/gui/window/view_form/view/list_gtk/widget.py
@@ -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)

3
series
View File

@ -33,6 +33,9 @@ issue19491002_1.diff
issue20451002_1.diff
issue5118.diff
issue18801002_1.diff
issue23901002_1.diff
issue17881002_1.diff
# Ignore next patches
#incremental_wait_in_retries.diff
# Uncomment in calfruitos and basidelta