From 55fb19b0f77f96a5156a99213e49b2cfdfd3a155 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 29 Jun 2011 12:01:09 +0200 Subject: [PATCH 1/2] [imp] Modifier rpc calls to handle correctly the promises. bzr revid: nicolas.vanhoren@openerp.com-20110629100109-m9z598dy2rqy8pn3 --- addons/base/static/src/js/chrome.js | 39 ++++++++++++++++++----------- addons/base/static/src/js/form.js | 3 ++- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 20baae85d76..98ee13dd62e 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -361,12 +361,21 @@ openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.b error_callback = typeof(error_callback) != "undefined" ? error_callback : this.on_rpc_error; // Call using the rpc_mode - return this.rpc_ajax(url, { + var deferred = $.Deferred(); + this.rpc_ajax(url, { jsonrpc: "2.0", method: "call", params: params, id:null - }, success_callback, error_callback); + }).then(function () {deferred.resolve.apply(deferred, arguments);}, + function(error) {deferred.reject(error, $.Event());}); + return deferred.then(success_callback, function(error, event) { + deferred.fail(function(error2, event2) { + if (!event.isDefaultPrevented()) { + error_callback(error2, event2); + } + }); + }).promise(); }, /** * Raw JSON-RPC call @@ -388,33 +397,35 @@ openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.b dataType: 'json', contentType: 'application/json', data: JSON.stringify(payload), - processData: false, - success: function(response, textStatus, jqXHR) { + processData: false + }, url); + var deferred = $.Deferred(); + $.ajax(ajax).done(function(response, textStatus, jqXHR) { self.on_rpc_response(); if (response.error) { if (response.error.data.type == "session_invalid") { self.uid = false; self.on_session_invalid(function() { - self.rpc(url, payload.params, success_callback, error_callback); + self.rpc(url, payload.params, + function() {deferred.resolve.apply(deferred, arguments);}, + function() {deferred.reject.apply(deferred, arguments);}); }); } else { - error_callback(response.error); + deferred.reject(response.error); } - } else if (success_callback) { - success_callback(response["result"], textStatus, jqXHR); + } else { + deferred.resolve(response["result"], textStatus, jqXHR); } - }, - error: function(jqXHR, textStatus, errorThrown) { + }).fail(function(jqXHR, textStatus, errorThrown) { self.on_rpc_response(); var error = { code: -32098, message: "XmlHttpRequestError " + errorThrown, data: {type: "xhr"+textStatus, debug: jqXHR.responseText, objects: [jqXHR, errorThrown] } }; - error_callback(error); - } - }, url); - return $.ajax(ajax); + deferred.reject(error); + }); + return deferred.promise().then(success_callback, error_callback); }, on_rpc_request: function() { }, diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index d279eb5d3aa..e519faf9f53 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1267,7 +1267,8 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, build_relation_context(self)); dataset.name_create(name, function(data) { self._change_int_ext_value(data.result); - }).fail(function() { + }).fail(function(error, event) { + event.preventDefault(); self._change_int_value(null); self._search_create_popup("form", undefined, {"default_name": name}); }); From 2810459e5e8501ad28383a6d9b890cd3d756dddf Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 29 Jun 2011 12:28:58 +0200 Subject: [PATCH 2/2] [imp] made some modifications in rpc() that could possibly break compatibility, made the error_callback consistant (never overwrites the default one) and removed the default context bzr revid: nicolas.vanhoren@openerp.com-20110629102858-8e6xyhgpeyo5kml2 --- addons/base/static/src/js/chrome.js | 20 ++++++++++---------- openerpweb/openerpweb.py | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 98ee13dd62e..5e1c7432cb8 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -350,15 +350,15 @@ openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.b * @param {Object} params call parameters * @param {Function} success_callback function to execute on RPC call success * @param {Function} error_callback function to execute on RPC call failure + * one * @returns {jQuery.Deferred} jquery-provided ajax deferred */ rpc: function(url, params, success_callback, error_callback) { + var self = this; // Construct a JSON-RPC2 request, method is currently unused params.session_id = this.session_id; - params.context = typeof(params.context) != "undefined" ? params.context : this.context; - - // Use a default error handler unless defined - error_callback = typeof(error_callback) != "undefined" ? error_callback : this.on_rpc_error; + // niv: wtf? + //params.context = typeof(params.context) != "undefined" ? params.context : this.context; // Call using the rpc_mode var deferred = $.Deferred(); @@ -369,20 +369,20 @@ openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.b id:null }).then(function () {deferred.resolve.apply(deferred, arguments);}, function(error) {deferred.reject(error, $.Event());}); - return deferred.then(success_callback, function(error, event) { - deferred.fail(function(error2, event2) { + return deferred.fail(function() { + deferred.fail(function(error, event) { if (!event.isDefaultPrevented()) { - error_callback(error2, event2); + self.on_rpc_error(error, event); } }); - }).promise(); + }).then(success_callback, error_callback).promise(); }, /** * Raw JSON-RPC call * * @returns {jQuery.Deferred} ajax-based deferred object */ - rpc_ajax: function(url, payload, success_callback, error_callback) { + rpc_ajax: function(url, payload) { var self = this; this.on_rpc_request(); // url can be an $.ajax option object @@ -425,7 +425,7 @@ openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.b }; deferred.reject(error); }); - return deferred.promise().then(success_callback, error_callback); + return deferred.promise(); }, on_rpc_request: function() { }, diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index dcdf981533a..33c5c14edb3 100644 --- a/openerpweb/openerpweb.py +++ b/openerpweb/openerpweb.py @@ -201,7 +201,7 @@ class OpenERPSession(object): ctx['context'] = ctx # adding the context of the session to send to the openerp server - ccontext = nonliterals.CompoundContext(self.context, context_to_eval) + ccontext = nonliterals.CompoundContext(self.context, context_to_eval or {}) ccontext.session = self return ccontext.evaluate(ctx)