diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 998aeae3e37..581a141addd 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -33,7 +33,7 @@ import openerp.modules.registry from openerp.tools.translate import _ from openerp import http -from openerp.http import request, serialize_exception as _serialize_exception, LazyResponse +from openerp.http import request, serialize_exception as _serialize_exception _logger = logging.getLogger(__name__) @@ -133,6 +133,20 @@ def ensure_db(redirect='/web/database/selector'): if db and db not in http.db_filter([db]): db = None + if db and not request.session.db: + # User asked a specific database on a new session. + # That mean the nodb router has been used to find the route + # Depending on installed module in the database, the rendering of the page + # may depend on data injected by the database route dispatcher. + # Thus, we redirect the user to the same page but with the session cookie set. + # This will force using the database route dispatcher... + r = request.httprequest + response = werkzeug.utils.redirect(r.url, 302) + request.session.db = db + response = r.app.get_response(r, response, explicit_session=False) + werkzeug.exceptions.abort(response) + return + # if db not provided, use the session one if not db: db = request.session.db @@ -577,12 +591,13 @@ html_template = """ """ -def render_bootstrap_template(db, template, values=None, debug=False, lazy=False, **kw): - if request and request.debug: +def render_bootstrap_template(template, values=None, debug=False, db=None, **kw): + if not db: + db = request.db + if request.debug: debug = True if values is None: values = {} - values.update(kw) values['debug'] = debug values['current_db'] = db try: @@ -598,15 +613,7 @@ def render_bootstrap_template(db, template, values=None, debug=False, lazy=False values['modules'] = module_boot(db=db) values['modules'] = simplejson.dumps(values['modules']) - def callback(template, values): - registry = openerp.modules.registry.RegistryManager.get(db) - with registry.cursor() as cr: - view_obj = registry["ir.ui.view"] - return view_obj.render(cr, openerp.SUPERUSER_ID, template, values) - if lazy: - return LazyResponse(callback, template=template, values=values) - else: - return callback(template, values) + return request.render(template, values, **kw) class Home(http.Controller): @@ -619,8 +626,11 @@ class Home(http.Controller): ensure_db() if request.session.uid: - html = render_bootstrap_template(request.session.db, "web.webclient_bootstrap") - return request.make_response(html, {'Cache-Control': 'no-cache', 'Content-Type': 'text/html; charset=utf-8'}) + headers = { + 'Cache-Control': 'no-cache', + 'Content-Type': 'text/html; charset=utf-8', + } + return render_bootstrap_template("web.webclient_bootstrap", headers=headers) else: return http.local_redirect('/web/login', query=request.params) @@ -640,10 +650,7 @@ class Home(http.Controller): if uid is not False: return http.redirect_with_hash(redirect) values['error'] = "Wrong login/password" - - def callback(template, values, context): - return request.registry['ir.ui.view'].render(request.cr, request.uid, template, values, context=context) - return LazyResponse(callback, template='web.login', values=values, context=request.context) + return render_bootstrap_template('web.login', values) @http.route('/login', type='http', auth="none") def login(self, db, login, key, redirect="/web", **kw): @@ -1004,18 +1011,7 @@ class Session(http.Controller): :return: A key identifying the saved action. :rtype: integer """ - saved_actions = request.httpsession.get('saved_actions') - if not saved_actions: - saved_actions = {"next":1, "actions":{}} - request.httpsession['saved_actions'] = saved_actions - # we don't allow more than 10 stored actions - if len(saved_actions["actions"]) >= 10: - del saved_actions["actions"][min(saved_actions["actions"])] - key = saved_actions["next"] - saved_actions["actions"][key] = the_action - saved_actions["next"] = key + 1 - request.httpsession['saved_actions'] = saved_actions - return key + return request.httpsession.save_action(the_action) @http.route('/web/session/get_session_action', type='json', auth="user") def get_session_action(self, key): @@ -1028,10 +1024,7 @@ class Session(http.Controller): :return: The saved action or None. :rtype: anything """ - saved_actions = request.httpsession.get('saved_actions') - if not saved_actions: - return None - return saved_actions["actions"].get(key) + return request.httpsession.get_action(key) @http.route('/web/session/check', type='json', auth="user") def check(self): diff --git a/addons/web/controllers/testing.py b/addons/web/controllers/testing.py index 598270cfe54..c99efed4294 100644 --- a/addons/web/controllers/testing.py +++ b/addons/web/controllers/testing.py @@ -52,7 +52,6 @@ TESTING = Template(u"""