From d7a9a596a7759475b840efd2ed884a5506aa83a8 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 31 Jul 2013 16:56:23 +0200 Subject: [PATCH] Put JSONRpc class in openerpframework bzr revid: nicolas.vanhoren@openerp.com-20130731145623-lxac6w12ocoh2e8e --- addons/web/static/src/js/corelib.js | 200 ------------------- addons/web/static/src/js/openerpframework.js | 199 ++++++++++++++++++ 2 files changed, 199 insertions(+), 200 deletions(-) diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index c419685c222..e33b4d73044 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -199,206 +199,6 @@ instance.web.Registry = instance.web.Class.extend({ } }); -instance.web.JsonRPC = instance.web.Class.extend(instance.web.PropertiesMixin, { - triggers: { - 'request': 'Request sent', - 'response': 'Response received', - 'response_failed': 'HTTP Error response or timeout received', - 'error': 'The received response is an JSON-RPC error', - }, - /** - * @constructs instance.web.JsonRPC - * - * @param {String} [server] JSON-RPC endpoint hostname - * @param {String} [port] JSON-RPC endpoint port - */ - init: function() { - instance.web.PropertiesMixin.init.call(this); - this.server = null; - this.debug = ($.deparam($.param.querystring()).debug !== undefined); - this.override_session = false; - this.session_id = undefined; - }, - setup: function(origin) { - var window_origin = location.protocol+"//"+location.host, self=this; - this.origin = origin ? _.str.rtrim(origin,'/') : window_origin; - this.prefix = this.origin; - this.server = this.origin; // keep chs happy - this.rpc_function = (this.origin == window_origin) ? this.rpc_json : this.rpc_jsonp; - }, - /** - * Executes an RPC call, registering the provided callbacks. - * - * Registers a default error callback if none is provided, and handles - * setting the correct session id and session context in the parameter - * objects - * - * @param {String} url RPC endpoint - * @param {Object} params call parameters - * @param {Object} options additional options for rpc call - * @param {Function} success_callback function to execute on RPC call success - * @param {Function} error_callback function to execute on RPC call failure - * @returns {jQuery.Deferred} jquery-provided ajax deferred - */ - rpc: function(url, params, options) { - var self = this; - options = options || {}; - // url can be an $.ajax option object - if (_.isString(url)) { - url = { url: url }; - } - _.defaults(params, { - context: this.user_context || {} - }); - // Construct a JSON-RPC2 request, method is currently unused - var payload = { - jsonrpc: '2.0', - method: 'call', - params: params, - id: _.uniqueId('r') - }; - var deferred = $.Deferred(); - if (! options.shadow) - this.trigger('request', url, payload); - - if (options.timeout) - url.timeout = options.timeout; - - this.rpc_function(url, payload).then( - function (response, textStatus, jqXHR) { - if (! options.shadow) - self.trigger('response', response); - if (!response.error) { - deferred.resolve(response["result"], textStatus, jqXHR); - } else if (response.error.code === 100) { - self.uid = false; - } else { - deferred.reject(response.error, $.Event()); - } - }, - function(jqXHR, textStatus, errorThrown) { - if (! options.shadow) - self.trigger('response_failed', jqXHR); - var error = { - code: -32098, - message: "XmlHttpRequestError " + errorThrown, - data: {type: "xhr"+textStatus, debug: jqXHR.responseText, objects: [jqXHR, errorThrown] } - }; - deferred.reject(error, $.Event()); - }); - // Allow deferred user to disable rpc_error call in fail - deferred.fail(function() { - deferred.fail(function(error, event) { - if (!event.isDefaultPrevented()) { - self.trigger('error', error, event); - } - }); - }); - return deferred; - }, - /** - * Raw JSON-RPC call - * - * @returns {jQuery.Deferred} ajax-webd deferred object - */ - rpc_json: function(url, payload) { - var self = this; - var ajax = _.extend({ - type: "POST", - dataType: 'json', - contentType: 'application/json', - data: JSON.stringify(payload), - processData: false, - headers: { - "X-Openerp-Session-Id": this.override_session ? this.session_id : undefined, - }, - }, url); - if (this.synch) - ajax.async = false; - return $.ajax(ajax); - }, - rpc_jsonp: function(url, payload) { - var self = this; - // extracted from payload to set on the url - var data = { - session_id: this.session_id, - id: payload.id, - }; - - var set_sid = function (response, textStatus, jqXHR) { - // If response give us the http session id, we store it for next requests... - if (response.session_id) { - self.session_id = response.session_id; - } - }; - - url.url = this.url(url.url, null); - var ajax = _.extend({ - type: "GET", - dataType: 'jsonp', - jsonp: 'jsonp', - cache: false, - data: data - }, url); - if (this.synch) - ajax.async = false; - var payload_str = JSON.stringify(payload); - var payload_url = $.param({r:payload_str}); - if (payload_url.length < 2000) { - // Direct jsonp request - ajax.data.r = payload_str; - return $.ajax(ajax).done(set_sid); - } else { - // Indirect jsonp request - var ifid = _.uniqueId('oe_rpc_iframe'); - var display = self.debug ? 'block' : 'none'; - var $iframe = $(_.str.sprintf("", ifid, ifid, display)); - var $form = $('
') - .attr('method', 'POST') - .attr('target', ifid) - .attr('enctype', "multipart/form-data") - .attr('action', ajax.url + '?jsonp=1&' + $.param(data)) - .append($('').attr('value', payload_str)) - .hide() - .appendTo($('body')); - var cleanUp = function() { - if ($iframe) { - $iframe.unbind("load").remove(); - } - $form.remove(); - }; - var deferred = $.Deferred(); - // the first bind is fired up when the iframe is added to the DOM - $iframe.bind('load', function() { - // the second bind is fired up when the result of the form submission is received - $iframe.unbind('load').bind('load', function() { - $.ajax(ajax).always(function() { - cleanUp(); - }).done(function() { - deferred.resolve.apply(deferred, arguments); - }).fail(function() { - deferred.reject.apply(deferred, arguments); - }); - }); - // now that the iframe can receive data, we fill and submit the form - $form.submit(); - }); - // append the iframe to the DOM (will trigger the first load) - $form.after($iframe); - return deferred.done(set_sid); - } - }, - - url: function(path, params) { - params = _.extend(params || {}); - if (this.override_session) - params.session_id = this.session_id; - var qs = '?' + $.param(params); - var prefix = _.any(['http://', 'https://', '//'], _.bind(_.str.startsWith, null, path)) ? '' : this.prefix; - return prefix + path + qs; - }, -}); - instance.web.py_eval = function(expr, context) { return py.eval(expr, _.extend({}, context || {}, {"true": true, "false": false, "null": null})); }; diff --git a/addons/web/static/src/js/openerpframework.js b/addons/web/static/src/js/openerpframework.js index e3e972c684e..39c3165967d 100644 --- a/addons/web/static/src/js/openerpframework.js +++ b/addons/web/static/src/js/openerpframework.js @@ -768,6 +768,205 @@ openerp.web.qweb.default_dict = { 'JSON': JSON }; +openerp.web.JsonRPC = openerp.web.Class.extend(openerp.web.PropertiesMixin, { + triggers: { + 'request': 'Request sent', + 'response': 'Response received', + 'response_failed': 'HTTP Error response or timeout received', + 'error': 'The received response is an JSON-RPC error', + }, + /** + * @constructs openerp.web.JsonRPC + * + * @param {String} [server] JSON-RPC endpoint hostname + * @param {String} [port] JSON-RPC endpoint port + */ + init: function() { + openerp.web.PropertiesMixin.init.call(this); + this.server = null; + this.override_session = false; + this.session_id = undefined; + }, + setup: function(origin) { + var window_origin = location.protocol+"//"+location.host, self=this; + this.origin = origin ? _.str.rtrim(origin,'/') : window_origin; + this.prefix = this.origin; + this.server = this.origin; // keep chs happy + this.rpc_function = (this.origin == window_origin) ? this.rpc_json : this.rpc_jsonp; + }, + /** + * Executes an RPC call, registering the provided callbacks. + * + * Registers a default error callback if none is provided, and handles + * setting the correct session id and session context in the parameter + * objects + * + * @param {String} url RPC endpoint + * @param {Object} params call parameters + * @param {Object} options additional options for rpc call + * @param {Function} success_callback function to execute on RPC call success + * @param {Function} error_callback function to execute on RPC call failure + * @returns {jQuery.Deferred} jquery-provided ajax deferred + */ + rpc: function(url, params, options) { + var self = this; + options = options || {}; + // url can be an $.ajax option object + if (_.isString(url)) { + url = { url: url }; + } + _.defaults(params, { + context: this.user_context || {} + }); + // Construct a JSON-RPC2 request, method is currently unused + var payload = { + jsonrpc: '2.0', + method: 'call', + params: params, + id: _.uniqueId('r') + }; + var deferred = $.Deferred(); + if (! options.shadow) + this.trigger('request', url, payload); + + if (options.timeout) + url.timeout = options.timeout; + + this.rpc_function(url, payload).then( + function (response, textStatus, jqXHR) { + if (! options.shadow) + self.trigger('response', response); + if (!response.error) { + deferred.resolve(response["result"], textStatus, jqXHR); + } else if (response.error.code === 100) { + self.uid = false; + } else { + deferred.reject(response.error, $.Event()); + } + }, + function(jqXHR, textStatus, errorThrown) { + if (! options.shadow) + self.trigger('response_failed', jqXHR); + var error = { + code: -32098, + message: "XmlHttpRequestError " + errorThrown, + data: {type: "xhr"+textStatus, debug: jqXHR.responseText, objects: [jqXHR, errorThrown] } + }; + deferred.reject(error, $.Event()); + }); + // Allow deferred user to disable rpc_error call in fail + deferred.fail(function() { + deferred.fail(function(error, event) { + if (!event.isDefaultPrevented()) { + self.trigger('error', error, event); + } + }); + }); + return deferred; + }, + /** + * Raw JSON-RPC call + * + * @returns {jQuery.Deferred} ajax-webd deferred object + */ + rpc_json: function(url, payload) { + var self = this; + var ajax = _.extend({ + type: "POST", + dataType: 'json', + contentType: 'application/json', + data: JSON.stringify(payload), + processData: false, + headers: { + "X-Openerp-Session-Id": this.override_session ? this.session_id : undefined, + }, + }, url); + if (this.synch) + ajax.async = false; + return $.ajax(ajax); + }, + rpc_jsonp: function(url, payload) { + var self = this; + // extracted from payload to set on the url + var data = { + session_id: this.session_id, + id: payload.id, + }; + + var set_sid = function (response, textStatus, jqXHR) { + // If response give us the http session id, we store it for next requests... + if (response.session_id) { + self.session_id = response.session_id; + } + }; + + url.url = this.url(url.url, null); + var ajax = _.extend({ + type: "GET", + dataType: 'jsonp', + jsonp: 'jsonp', + cache: false, + data: data + }, url); + if (this.synch) + ajax.async = false; + var payload_str = JSON.stringify(payload); + var payload_url = $.param({r:payload_str}); + if (payload_url.length < 2000) { + // Direct jsonp request + ajax.data.r = payload_str; + return $.ajax(ajax).done(set_sid); + } else { + // Indirect jsonp request + var ifid = _.uniqueId('oe_rpc_iframe'); + var display = 'none'; + var $iframe = $(_.str.sprintf("", ifid, ifid, display)); + var $form = $('') + .attr('method', 'POST') + .attr('target', ifid) + .attr('enctype', "multipart/form-data") + .attr('action', ajax.url + '?jsonp=1&' + $.param(data)) + .append($('').attr('value', payload_str)) + .hide() + .appendTo($('body')); + var cleanUp = function() { + if ($iframe) { + $iframe.unbind("load").remove(); + } + $form.remove(); + }; + var deferred = $.Deferred(); + // the first bind is fired up when the iframe is added to the DOM + $iframe.bind('load', function() { + // the second bind is fired up when the result of the form submission is received + $iframe.unbind('load').bind('load', function() { + $.ajax(ajax).always(function() { + cleanUp(); + }).done(function() { + deferred.resolve.apply(deferred, arguments); + }).fail(function() { + deferred.reject.apply(deferred, arguments); + }); + }); + // now that the iframe can receive data, we fill and submit the form + $form.submit(); + }); + // append the iframe to the DOM (will trigger the first load) + $form.after($iframe); + return deferred.done(set_sid); + } + }, + + url: function(path, params) { + params = _.extend(params || {}); + if (this.override_session) + params.session_id = this.session_id; + var qs = '?' + $.param(params); + var prefix = _.any(['http://', 'https://', '//'], _.bind(_.str.startsWith, null, path)) ? '' : this.prefix; + return prefix + path + qs; + }, +}); + openerp.declare = declare; return openerp;