partial rework to merge trunk
bzr revid: al@openerp.com-20111215120732-is7pab5e5rsfqpj0
This commit is contained in:
parent
0b314b2596
commit
31e65bdddf
|
@ -52,7 +52,7 @@
|
|||
"static/src/js/view_list.js",
|
||||
"static/src/js/view_list_editable.js",
|
||||
"static/src/js/view_tree.js",
|
||||
"static/src/js/view_editor.js",
|
||||
"static/src/js/view_editor.js"
|
||||
],
|
||||
'css' : [
|
||||
"static/lib/jquery.superfish/css/superfish.css",
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
#----------------------------------------------------------
|
||||
# OpenERP Web HTTP layer
|
||||
#----------------------------------------------------------
|
||||
import StringIO
|
||||
import ast
|
||||
import contextlib
|
||||
import functools
|
||||
|
@ -88,12 +87,12 @@ class WebRequest(object):
|
|||
self.httpresponse = None
|
||||
self.httpsession = request.session
|
||||
self.config = config
|
||||
self.session = None
|
||||
|
||||
def init(self, params):
|
||||
self.params = dict(params)
|
||||
# OpenERP session setup
|
||||
self.session_id = self.params.pop("session_id", None) or uuid.uuid4().hex
|
||||
self.session = self.httpsession.setdefault(self.session_id, session.OpenERPSession(self.session_id))
|
||||
self.session = self.httpsession.setdefault(self.session_id, session.OpenERPSession())
|
||||
self.session.config = self.config
|
||||
self.context = self.params.pop('context', None)
|
||||
self.debug = self.params.pop('debug', False) != False
|
||||
|
@ -142,11 +141,10 @@ class JsonRequest(WebRequest):
|
|||
method = self.httprequest.method
|
||||
args = self.httprequest.args
|
||||
jsonp = args.get('jsonp', False)
|
||||
requestf = None
|
||||
request = None
|
||||
|
||||
if jsonp and args.get('r'):
|
||||
# jsonp method GET
|
||||
requestf = StringIO.StringIO(args.get('r'))
|
||||
elif jsonp and method == 'POST':
|
||||
if jsonp and method == 'POST':
|
||||
# jsonp 2 steps step1 POST: save call
|
||||
self.init(args)
|
||||
req.session.jsonp_requests[args.get('id')] = self.httprequest.form['r']
|
||||
|
@ -156,7 +154,10 @@ class JsonRequest(WebRequest):
|
|||
elif args['jsonp'] and args.get('id'):
|
||||
# jsonp 2 steps step2 GET: run and return result
|
||||
self.init(args)
|
||||
requestf = StringIO.StringIO(self.session.jsonp_requests.pop(args.get(id), ""))
|
||||
request = self.session.jsonp_requests.pop(args.get(id), "")
|
||||
elif jsonp and args.get('r'):
|
||||
# jsonp method GET
|
||||
request = args.get('r')
|
||||
else:
|
||||
# regular jsonrpc2
|
||||
requestf = self.httprequest.stream
|
||||
|
@ -164,10 +165,15 @@ class JsonRequest(WebRequest):
|
|||
response = {"jsonrpc": "2.0" }
|
||||
error = None
|
||||
try:
|
||||
self.jsonrequest = simplejson.loads(direct_json_request, object_hook=nonliterals.non_literal_decoder)
|
||||
# Read POST content or POST Form Data named "request"
|
||||
if requestf:
|
||||
self.jsonrequest = simplejson.load(requestf, object_hook=nonliterals.non_literal_decoder)
|
||||
else:
|
||||
self.jsonrequest = simplejson.loads(request, object_hook=nonliterals.non_literal_decoder)
|
||||
self.init(self.jsonrequest.get("params", {}))
|
||||
if _logger.isEnabledFor(logging.DEBUG):
|
||||
_logger.debug("[%s] --> %s.%s\n%s", rid, controller.__class__.__name__, method.__name__, pprint.pformat(self.jsonrequest))
|
||||
_logger.debug("--> %s.%s\n%s", controller.__class__.__name__, method.__name__, pprint.pformat(self.jsonrequest))
|
||||
response['id'] = self.jsonrequest.get('id')
|
||||
response["result"] = method(controller, self, **self.params)
|
||||
except openerplib.AuthenticationError:
|
||||
error = {
|
||||
|
@ -376,21 +382,6 @@ class ControllerType(type):
|
|||
class Controller(object):
|
||||
__metaclass__ = ControllerType
|
||||
|
||||
class Proxy(Controller):
|
||||
_cp_path = '/web/proxy'
|
||||
|
||||
@jsonrequest
|
||||
def load(self, req, path):
|
||||
#req.config.socket_port
|
||||
#if not re.match('^/[^/]+/static/.*', path):
|
||||
# return werkzeug.exceptions.BadRequest()
|
||||
|
||||
env = req.httprequest.environ
|
||||
port = env['SERVER_PORT']
|
||||
|
||||
o = urllib.urlopen('http://127.0.0.1:%s%s' % (port, path))
|
||||
return o.read()
|
||||
|
||||
class Root(object):
|
||||
"""Root WSGI application for the OpenERP Web Client.
|
||||
|
||||
|
|
|
@ -28,8 +28,7 @@ class OpenERPSession(object):
|
|||
Used to store references to non-literal domains which need to be
|
||||
round-tripped to the client browser.
|
||||
"""
|
||||
def __init__(self, sid):
|
||||
self.id = sid
|
||||
def __init__(self):
|
||||
self.config = None
|
||||
self._db = False
|
||||
self._uid = False
|
||||
|
|
|
@ -242,6 +242,21 @@ class WebClient(openerpweb.Controller):
|
|||
"version": web.common.release.version
|
||||
}
|
||||
|
||||
class Proxy(openerpweb.Controller):
|
||||
_cp_path = '/web/proxy'
|
||||
|
||||
@jsonrequest
|
||||
def load(self, req, path):
|
||||
#req.config.socket_port
|
||||
#if not re.match('^/[^/]+/static/.*', path):
|
||||
# return werkzeug.exceptions.BadRequest()
|
||||
|
||||
env = req.httprequest.environ
|
||||
port = env['SERVER_PORT']
|
||||
|
||||
o = urllib.urlopen('http://127.0.0.1:%s%s' % (port, path))
|
||||
return o.read()
|
||||
|
||||
class Database(openerpweb.Controller):
|
||||
_cp_path = "/web/database"
|
||||
|
||||
|
|
|
@ -362,7 +362,6 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
// be saved to (and revived from) cookies
|
||||
this.name = openerp._session_id;
|
||||
},
|
||||
|
||||
bind: function(server, continuation) {
|
||||
|
||||
if(_.isFunction(server)) {
|
||||
|
@ -390,37 +389,12 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
this.active_id = null;
|
||||
this.do_load_qweb(['/web/webclient/qweb'], continuation);
|
||||
},
|
||||
|
||||
connect: function(server, db, login, password, continuation) {
|
||||
var self = this;
|
||||
this.bind(server, function() {
|
||||
self.login(db, login, password, continuation);
|
||||
});
|
||||
},
|
||||
|
||||
get_absolute_url: function(path) {
|
||||
var absolute_url,
|
||||
r_has_protocol = /^https?:\/\//,
|
||||
r_absolute_internal = /^\/[^\/]/; // starts with / (but not //)
|
||||
|
||||
|
||||
if (r_has_protocol.test(path)) {
|
||||
if (!_.str.startsWith(path, this.server + '/')) {
|
||||
$.error('can only contact openerp.server');
|
||||
}
|
||||
absolute_url = path;
|
||||
} else if (r_absolute_internal.test(path)) {
|
||||
absolute_url = this.server + path;
|
||||
} else { // relative url
|
||||
// XXX is it correct to mix document.location and this.server ??
|
||||
var parts = document.location.pathname.split('/');
|
||||
parts.pop();
|
||||
parts.push(path);
|
||||
absolute_url = this.server + parts.join('/');
|
||||
}
|
||||
return absolute_url;
|
||||
},
|
||||
|
||||
/**
|
||||
* Executes an RPC call, registering the provided callbacks.
|
||||
*
|
||||
|
@ -454,7 +428,6 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
});
|
||||
}).then(success_callback, error_callback).promise();
|
||||
},
|
||||
|
||||
/**
|
||||
* Raw JSON-RPC call
|
||||
*
|
||||
|
@ -521,7 +494,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
* The session is validated either by login or by restoration of a previous session
|
||||
*/
|
||||
on_session_valid: function(continuation) {
|
||||
this.load_modules(continuation);
|
||||
this.load_modules().then(function() { continuation() } );
|
||||
},
|
||||
on_session_invalid: function(continuation) {
|
||||
},
|
||||
|
@ -547,7 +520,9 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
//}).done(success_callback);
|
||||
});
|
||||
},
|
||||
login: function() { this.session_authenticate.apply(this, arguments); },
|
||||
login: function() {
|
||||
this.session_authenticate.apply(this, arguments);
|
||||
},
|
||||
/**
|
||||
* Reloads uid and session_id from local storage, if they exist
|
||||
*/
|
||||
|
@ -628,17 +603,12 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
},
|
||||
/**
|
||||
* Load additional web addons of that instance and init them
|
||||
* FIXME do all actions in sync...
|
||||
*/
|
||||
load_modules: function(continuation) {
|
||||
load_modules: function() {
|
||||
var self = this;
|
||||
|
||||
this.module_loading.done(continuation);
|
||||
//if (this.module_loading.state() !== "pending") {
|
||||
if (this.module_loading.isResolved() || this.module_loading.isRejected()) {
|
||||
return;
|
||||
if(openerp._modules_loaded) {
|
||||
return $.when();
|
||||
}
|
||||
|
||||
this.rpc('/web/session/modules', {}, function(result) {
|
||||
self.module_list = result;
|
||||
var lang = self.user_context.lang;
|
||||
|
@ -649,37 +619,17 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
var file_list = ["/web/static/lib/datejs/globalization/" +
|
||||
self.user_context.lang.replace("_", "-") + ".js"
|
||||
];
|
||||
|
||||
/*
|
||||
self.rpc('/web/webclient/qweblist', {mods: modules}, self.do_load_qweb);
|
||||
self.rpc('/web/webclient/csslist', {mods: modules}, self.do_load_css);
|
||||
self.rpc('/web/webclient/jslist', {mods: modules}, function(files) {
|
||||
self.do_load_js(file_list.concat(files));
|
||||
});
|
||||
openerp._modules_loaded = true;
|
||||
// */
|
||||
|
||||
self.rpc('/web/webclient/qweblist', {mods: modules}, function(files) {
|
||||
self.do_load_qweb(files, function() {
|
||||
// once qweb files are loaded...
|
||||
self.rpc('/web/webclient/csslist', {mods: modules}, function(files) {
|
||||
self.do_load_css(files, function() {
|
||||
// once css files are loaded
|
||||
self.rpc('/web/webclient/jslist', {mods: modules}, function(files) {
|
||||
self.do_load_js(file_list.concat(files), function() {
|
||||
self.on_modules_loaded();
|
||||
self.module_loading.resolve();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
return $.when(
|
||||
self.rpc('/web/webclient/qweblist', {mods: modules}, self.do_load_qweb),
|
||||
self.rpc('/web/webclient/csslist', {mods: modules}, self.do_load_css),
|
||||
self.rpc('/web/webclient/jslist', {mods: modules}, function(files) {
|
||||
self.do_load_js(file_list.concat(files));
|
||||
})
|
||||
);
|
||||
});
|
||||
});
|
||||
},
|
||||
do_load_css: function (files, callback) {
|
||||
do_load_css: function (files) {
|
||||
var self = this;
|
||||
_.each(files, function (file) {
|
||||
$('head').append($('<link>', {
|
||||
|
@ -688,9 +638,8 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
'type': 'text/css'
|
||||
}));
|
||||
});
|
||||
if (callback) { callback(); }
|
||||
},
|
||||
do_load_js: function(files, callback) {
|
||||
do_load_js: function(files) {
|
||||
var self = this;
|
||||
if(files.length != 0) {
|
||||
var file = files.shift();
|
||||
|
@ -706,21 +655,18 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.
|
|||
var head = document.head || document.getElementsByTagName('head')[0];
|
||||
head.appendChild(tag);
|
||||
} else {
|
||||
if (callback) { callback(); }
|
||||
self.on_modules_loaded();
|
||||
}
|
||||
},
|
||||
do_load_qweb: function(files, callback) {
|
||||
do_load_qweb: function(files) {
|
||||
var self = this;
|
||||
|
||||
if (files.length != 0) {
|
||||
var file = files.shift();
|
||||
self.rpc('/web/jsonp/static_proxy', {path: file}, function(xml) {
|
||||
self.rpc('/web/proxy/load', {path: file}, function(xml) {
|
||||
openerp.web.qweb.add_template(_.str.trim(xml));
|
||||
self.do_load_qweb(files, callback);
|
||||
});
|
||||
} else {
|
||||
if (callback) { callback(); }
|
||||
}
|
||||
}
|
||||
},
|
||||
on_modules_loaded: function() {
|
||||
for(var j=0; j<this.module_list.length; j++) {
|
||||
|
@ -1150,6 +1096,7 @@ openerp.web.TranslationDataBase = openerp.web.Class.extend(/** @lends openerp.we
|
|||
}
|
||||
});
|
||||
|
||||
/** Configure blockui */
|
||||
if ($.blockUI) {
|
||||
$.blockUI.defaults.baseZ = 1100;
|
||||
$.blockUI.defaults.message = '<img src="/web/static/src/img/throbber2.gif">';
|
||||
|
@ -1181,6 +1128,7 @@ openerp.web.qweb.format_text_node = function(s) {
|
|||
openerp.connection = new openerp.web.Connection();
|
||||
openerp.web.qweb.default_dict['__debug__'] = openerp.connection.debug;
|
||||
|
||||
/** Jquery extentions */
|
||||
$.Mutex = (function() {
|
||||
function Mutex() {
|
||||
this.def = $.Deferred().resolve();
|
||||
|
|
Loading…
Reference in New Issue