diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 20baae85d76..5e1c7432cb8 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -350,30 +350,39 @@ 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 - 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.fail(function() { + deferred.fail(function(error, event) { + if (!event.isDefaultPrevented()) { + self.on_rpc_error(error, event); + } + }); + }).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 @@ -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(); }, on_rpc_request: function() { }, diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 82f235f3893..6a759dc13fd 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1266,7 +1266,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}); }); 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)