diff --git a/addons/web/common/http.py b/addons/web/common/http.py index 6e4cbaacaaa..681a38384a2 100644 --- a/addons/web/common/http.py +++ b/addons/web/common/http.py @@ -334,7 +334,7 @@ def session_context(request, storage_path, session_cookie='sessionid'): and not value.jsonp_requests and value._creation_time + (60*5) < time.time() # FIXME do not use a fixed value ): - _logger.info('remove session %s', key) + _logger.debug('remove session %s', key) del request.session[key] with session_lock: diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 7081ce3ce32..191f184da5b 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -37,6 +37,9 @@ def concat_xml(file_list): concat: concatenation of file content timestamp: max(os.path.getmtime of file_list) """ + if not file_list: + return '', None + root = None files_timestamp = 0 for fname in file_list: @@ -56,12 +59,15 @@ def concat_xml(file_list): return ElementTree.tostring(root, 'utf-8'), files_timestamp -def concat_files(file_list, reader=None): +def concat_files(file_list, reader=None, intersperse=""): """ Concatenate file content return (concat,timestamp) concat: concatenation of file content, read by `reader` timestamp: max(os.path.getmtime of file_list) """ + if not file_list: + return '', None + if reader is None: def reader(f): with open(f) as fp: @@ -75,7 +81,7 @@ def concat_files(file_list, reader=None): files_timestamp = ftime files_content.append(reader(fname)) - files_concat = "".join(files_content) + files_concat = intersperse.join(files_content) return files_concat,files_timestamp html_template = """ @@ -180,7 +186,7 @@ class WebClient(openerpweb.Controller): @openerpweb.httprequest def js(self, req, mods=None): files = [f[0] for f in self.manifest_glob(req, mods, 'js')] - content,timestamp = concat_files(files) + content, timestamp = concat_files(files, intersperse=';') # TODO use timestamp to set Last mofified date and E-tag return req.make_response(content, [('Content-Type', 'application/javascript')]) @@ -431,7 +437,7 @@ class Session(openerpweb.Controller): @openerpweb.jsonrequest def modules(self, req): # Compute available candidates module - loadable = openerpweb.addons_manifest.iterkeys() + loadable = openerpweb.addons_manifest loaded = req.config.server_wide_modules candidates = [mod for mod in loadable if mod not in loaded] diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 7af729205be..32a70d587a7 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -1124,8 +1124,11 @@ openerp.web.WebClient = openerp.web.Widget.extend(/** @lends openerp.web.WebClie this.$element.children().remove(); }, do_reload: function() { - return this.session.session_reload().pipe( - $.proxy(this.menu, 'do_reload')); + var self = this; + return this.session.session_reload().pipe(function () { + openerp.connection.load_modules(true).pipe( + self.menu.proxy('do_reload')); }); + }, do_notify: function() { var n = this.notification; diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 0584c49f6b2..b36e576ae47 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -676,27 +676,31 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }, /** * Load additional web addons of that instance and init them + * + * @param {Boolean} [no_session_valid_signal=false] prevents load_module from triggering ``on_session_valid``. */ - load_modules: function() { + load_modules: function(no_session_valid_signal) { var self = this; return this.rpc('/web/session/modules', {}).pipe(function(result) { - self.module_list = result; var lang = self.user_context.lang; var params = { mods: ["web"].concat(result), lang: lang}; - var modules = self.module_list.join(','); + var to_load = _.difference(result, self.module_list).join(','); + self.module_list = result; return $.when( - self.rpc('/web/webclient/csslist', {mods: modules}, self.do_load_css), - self.rpc('/web/webclient/qweblist', {mods: modules}).pipe(self.do_load_qweb), + self.rpc('/web/webclient/csslist', {mods: to_load}, self.do_load_css), + self.rpc('/web/webclient/qweblist', {mods: to_load}).pipe(self.do_load_qweb), self.rpc('/web/webclient/translations', params).pipe(function(trans) { openerp.web._t.database.set_bundle(trans); var file_list = ["/web/static/lib/datejs/globalization/" + lang.replace("_", "-") + ".js"]; - return self.rpc('/web/webclient/jslist', {mods: modules}).pipe(function(files) { + return self.rpc('/web/webclient/jslist', {mods: to_load}).pipe(function(files) { return self.do_load_js(file_list.concat(files)); }); }) ).then(function() { self.on_modules_loaded(); - self.on_session_valid(); + if (!no_session_valid_signal) { + self.on_session_valid(); + } }); }); }, @@ -738,6 +742,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. _.each(files, function(file) { self.qweb_mutex.exec(function() { return self.rpc('/web/proxy/load', {path: file}).pipe(function(xml) { + if (!xml) { return; } openerp.web.qweb.add_template(_.str.trim(xml)); }); });