changeset 4115d0cec099 in sao:5.0
details: https://hg.tryton.org/sao?cmd=changeset;node=4115d0cec099
description:
        Throw deferred on synchronous RPC with error

        The caller needs to know if the error management succeeded or not in 
order to
        redo the call.
        We can not redo the call inside the error management because this will 
break
        the synchronous property.

        issue9938
        review335361002
        (grafted from 00581376be4e15f42cb44c4571a1051bad6ed463)
diffstat:

 src/model.js |   8 +++++++-
 src/rpc.js   |  36 +++++++++++++++++++++---------------
 2 files changed, 28 insertions(+), 16 deletions(-)

diffs (108 lines):

diff -r 38c32dd63ff8 -r 4115d0cec099 src/model.js
--- a/src/model.js      Wed Dec 23 21:26:32 2020 +0100
+++ b/src/model.js      Wed Dec 23 21:28:35 2020 +0100
@@ -529,7 +529,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 -r 38c32dd63ff8 -r 4115d0cec099 src/rpc.js
--- a/src/rpc.js        Wed Dec 23 21:26:32 2020 +0100
+++ b/src/rpc.js        Wed Dec 23 21:28:35 2020 +0100
@@ -20,8 +20,8 @@
         var ajax_success = function(data) {
             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') {
@@ -42,19 +42,22 @@
                                     '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];
                     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'))) {
                         var model = args.method.split('.').slice(1, 
-1).join('.');
@@ -65,16 +68,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 {
                 dfd.resolve(data.result);
                 result = data.result;
@@ -85,12 +86,15 @@
             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 {
-                Sao.common.error.run(status_, error);
-                dfd.reject();
+                Sao.common.error.run(status_, error)
+                    .always(dfd.reject);
             }
         };
 
@@ -116,6 +120,8 @@
         });
         if (async) {
             return dfd.promise();
+        } else if (result === undefined) {
+            throw dfd;
         } else {
             return result;
         }

Reply via email to