[IMP] Removed http param 'db' handling from http.py and put it in the main controller in main.py

bzr revid: nicolas.vanhoren@openerp.com-20130724100030-yxbpntlz58kohy1n
This commit is contained in:
niv-openerp 2013-07-24 12:00:30 +02:00
parent 761ba75055
commit 3b384da858
3 changed files with 50 additions and 49 deletions

View File

@ -535,11 +535,15 @@ html_template = """<!DOCTYPE html>
class Home(http.Controller):
@http.route('/', type='http', auth="none")
def index(self, s_action=None, db=None, **kw):
db, redir = db_monodb_redirect()
if redir:
return redirect_with_hash(redir)
def index(self, s_action=None, **kw):
if 'db' in kw:
ndb = kw['db']
lst = http.db_list(True)
if ndb in lst and ndb != request.session.db:
request.session.logout()
request.session.db = ndb
db = request.session.db
debug = "debug" in kw
js = "\n ".join('<script type="text/javascript" src="%s"></script>' % i for i in manifest_list('js', db=db, debug=debug))
@ -821,7 +825,7 @@ class Session(http.Controller):
@http.route('/web/session/get_session_info', type='json', auth="none")
def get_session_info(self):
request.uid = request.session.uid
request.db = request.session.db
request.disable_db = False
return self.session_info()
@http.route('/web/session/authenticate', type='json', auth="none")

View File

@ -101,15 +101,13 @@ class WebRequest(object):
self.httpsession = httprequest.session
self.session = httprequest.session
self.session_id = httprequest.session.sid
self.db = None
self.disable_db = False
self.uid = None
self.func = None
self.auth_method = None
self._cr_cm = None
self._cr = None
self.func_request_type = None
with set_request(self):
self.db = self.session.db or db_monodb()
# set db/uid trackers - they're cleaned up at the WSGI
# dispatching phase in openerp.service.wsgi_server.application
if self.db:
@ -127,17 +125,16 @@ class WebRequest(object):
self.session.logout()
raise SessionExpiredException("Session expired for request %s" % self.httprequest)
if self.auth_method == "none":
self.db = None
self.disable_db = True
self.uid = None
elif self.auth_method == "admin":
self.db = self.session.db or db_monodb()
self.disable_db = False
if not self.db:
raise SessionExpiredException("No valid database for request %s" % self.httprequest)
self.uid = openerp.SUPERUSER_ID
else: # auth
self.db = self.session.db
self.disable_db = False
self.uid = self.session.uid
@property
def registry(self):
"""
@ -146,6 +143,14 @@ class WebRequest(object):
"""
return openerp.modules.registry.RegistryManager.get(self.db) if self.db else None
@property
def db(self):
"""
The registry to the database linked to this request. Can be ``None`` if the current request uses the
``none'' authentication.
"""
return self.session.db if not self.disable_db else None
@property
def cr(self):
"""
@ -179,7 +184,7 @@ class WebRequest(object):
return self.func(*args, **kwargs)
finally:
# just to be sure no one tries to re-use the request
self.db = None
self.disable_db = True
self.uid = None
def route(route, type="http", auth="user"):
@ -611,8 +616,8 @@ class OpenERPSession(werkzeug.contrib.sessions.Session):
self.uid = uid
self.login = login
self.password = password
request.db = db
request.uid = uid
request.disable_db = False
if uid: self.get_context()
return uid
@ -885,6 +890,8 @@ class Root(object):
else:
httprequest.session = self.session_store.get(sid)
self._find_db(httprequest)
if not "lang" in httprequest.session.context:
lang = httprequest.accept_languages.best or "en_US"
lang = babel.core.LOCALE_ALIASES.get(lang, lang).replace('-', '_')
@ -921,6 +928,12 @@ class Root(object):
except werkzeug.exceptions.HTTPException, e:
return e(environ, start_response)
def _find_db(self, httprequest):
db = db_monodb(httprequest)
if db != httprequest.session.db:
httprequest.session.logout()
httprequest.session.db = db
def _build_request(self, httprequest):
if httprequest.args.get('jsonp'):
return JsonRequest(httprequest)
@ -1035,43 +1048,39 @@ class Root(object):
root = None
def db_list(force=False):
proxy = request.session.proxy("db")
dbs = proxy.list(force)
h = request.httprequest.environ['HTTP_HOST'].split(':')[0]
def db_list(force=False, httprequest=None):
httprequest = httprequest or request.httprequest
dbs = openerp.netsvc.dispatch_rpc("db", "list", [force])
h = httprequest.environ['HTTP_HOST'].split(':')[0]
d = h.split('.')[0]
r = openerp.tools.config['dbfilter'].replace('%h', h).replace('%d', d)
dbs = [i for i in dbs if re.match(r, i)]
return dbs
def db_redirect(match_first_only_if_unique):
def db_redirect(match_first_only_if_unique, httprequest=None):
httprequest = httprequest or request.httprequest
db = None
redirect = None
dbs = db_list(True)
dbs = db_list(True, httprequest)
# 1 try the db in the url
db_url = request.httprequest.args.get('db')
if db_url in dbs:
return (db_url, None)
# 1 try the db in the session
db_session = httprequest.session.db
if db_session in dbs:
return (db_session, None)
# 2 use the database from the cookie if it's listable and still listed
cookie_db = request.httprequest.cookies.get('last_used_database')
if cookie_db in dbs:
db = cookie_db
# 3 use the first db if user can list databases
if dbs and not db and (not match_first_only_if_unique or len(dbs) == 1):
# 2 use the first db if user can list databases
if dbs and (not match_first_only_if_unique or len(dbs) == 1):
db = dbs[0]
# redirect to the chosen db if multiple are available
if db and len(dbs) > 1:
query = dict(urlparse.parse_qsl(request.httprequest.query_string, keep_blank_values=True))
query = dict(urlparse.parse_qsl(httprequest.query_string, keep_blank_values=True))
query.update({'db': db})
redirect = request.httprequest.path + '?' + urllib.urlencode(query)
redirect = httprequest.path + '?' + urllib.urlencode(query)
return (db, redirect)
def db_monodb():
def db_monodb(httprequest=None):
"""
Magic function to find the current database.
@ -1080,9 +1089,9 @@ def db_monodb():
* Magic
* More magic
Return ``None`` if the magic is not magic enough.
Returns ``None`` if the magic is not magic enough.
"""
return db_redirect(True)[0]
return db_redirect(True, httprequest=httprequest)[0]
class CommonController(Controller):

View File

@ -705,20 +705,9 @@ instance.web.Login = instance.web.Widget.extend({
}
return d;
},
remember_last_used_database: function(db) {
// This cookie will be used server side in order to avoid db reloading on first visit
var ttl = 24 * 60 * 60 * 365;
document.cookie = [
'last_used_database=' + db,
'path=/',
'max-age=' + ttl,
'expires=' + new Date(new Date().getTime() + ttl * 1000).toGMTString()
].join(';');
},
database_selected: function(db) {
var params = $.deparam.querystring();
params.db = db;
this.remember_last_used_database(db);
this.$('.oe_login_dbpane').empty().text(_t('Loading...'));
this.$('[name=login], [name=password]').prop('readonly', true);
instance.web.redirect('/?' + $.param(params));
@ -769,7 +758,6 @@ instance.web.Login = instance.web.Widget.extend({
self.hide_error();
self.$(".oe_login_pane").fadeOut("slow");
return this.session.session_authenticate(db, login, password).then(function() {
self.remember_last_used_database(db);
if (self.has_local_storage && self.remember_credentials) {
localStorage.setItem(db + '|last_login', login);
if (self.session.debug) {