diff --git a/src/model.js b/src/model.js index 50f68f38c0..c66cc15624 100644 --- a/src/model.js +++ b/src/model.js @@ -580,7 +580,13 @@ this.id = this.model.execute( 'create', [[values]], context, false)[0]; } catch (e) { - return jQuery.Deferred().reject(); + if (e.promise) { + return e.then(function() { + return this.save(force_reload); + }.bind(this)); + } else { + return jQuery.Deferred().reject(); + } } } else { if (!jQuery.isEmptyObject(values)) { diff --git a/src/rpc.js b/src/rpc.js index 962151fdbc..6c3338b3f0 100644 --- a/src/rpc.js +++ b/src/rpc.js @@ -33,8 +33,8 @@ var ajax_success = function(data, status_, query) { if (data === null) { Sao.common.warning.run('', - Sao.i18n.gettext('Unable to reach the server.')); - dfd.reject(); + Sao.i18n.gettext('Unable to reach the server.')) + .always(dfd.reject); } else if (data.error) { var name, msg, description; if (data.error[0] == 'UserWarning') { @@ -55,11 +55,14 @@ 'always': result == 'always' }], {}] }, session).done(function() { - Sao.rpc(args, session).then( - dfd.resolve, dfd.reject); + if (async) { + Sao.rpc(args, session).then( + dfd.resolve, dfd.reject); + } else { + dfd.resolve(); + } }); }, dfd.reject); - return; } else if (data.error[0] == 'UserError') { msg = data.error[1][0]; description = data.error[1][1]; @@ -74,9 +77,9 @@ } Sao.common.warning.run(description, msg) .always(dfd.reject); - return; } else if (data.error[0] == 'ConcurrencyException') { - if (args.method.startsWith('model.') && + if (async && + args.method.startsWith('model.') && (args.method.endsWith('.write') || args.method.endsWith('.delete')) && (args.params[0].length == 1)) { @@ -88,16 +91,14 @@ Sao.rpc(args, session).then( dfd.resolve, dfd.reject); }, dfd.reject); - return; } else { Sao.common.message.run('Concurrency Exception', 'tryton-warning').always(dfd.reject); - return; } } else { - Sao.common.error.run(data.error[0], data.error[1]); + Sao.common.error.run(data.error[0], data.error[1]) + .always(dfd.reject); } - dfd.reject(); } else { result = data.result; if (session.cache) { @@ -119,16 +120,20 @@ if (query.status == 401) { //Try to relog Sao.Session.renew(session).then(function() { - Sao.rpc(args, session).then(dfd.resolve, dfd.reject); + if (async) { + Sao.rpc(args, session).then(dfd.resolve, dfd.reject); + } else { + dfd.resolve(); + } }, dfd.reject); - return; } else if (query.status == 429) { Sao.common.message.run( Sao.i18n.gettext('Too many requests. Try again later.'), - 'tryton-error').always(dfd.reject); + 'tryton-error') + .always(dfd.reject); } else { - Sao.common.error.run(status_, error); - dfd.reject(); + Sao.common.error.run(status_, error) + .always(dfd.reject); } }; @@ -154,6 +159,8 @@ }); if (async) { return dfd.promise(); + } else if (result === undefined) { + throw dfd; } else { return result; }