Add '_request' attribute to Transaction context

issue7110
review41031002
This commit is contained in:
Cédric Krier
2018-02-14 19:22:03 +01:00
parent f911f48ed4
commit 7388e7b233
4 changed files with 32 additions and 12 deletions
+1
View File
@@ -1,3 +1,4 @@
* Add '_request' attribute to Transaction context
* Delete translations on deletion only when model has translatable field
* Remove MySQL backend
* Add keyword attribute to button tag
+15 -5
View File
@@ -49,9 +49,13 @@ def login(request, database_name, user, parameters, language=None):
except DatabaseOperationalError:
logger.error('fail to connect to %s', database_name, exc_info=True)
abort(404)
context = {
'language': language,
'_request': request.context,
}
try:
session = security.login(
database_name, user, parameters, language=language)
database_name, user, parameters, context=context)
code = 403
except RateLimitException:
session = None
@@ -68,7 +72,8 @@ def login(request, database_name, user, parameters, language=None):
def logout(request, database_name):
auth = request.authorization
name = security.logout(
database_name, auth.get('userid'), auth.get('session'))
database_name, auth.get('userid'), auth.get('session'),
context={'_request': request.context})
logger.info('logout \'%s\' from %s using %s on database \'%s\'',
name, request.remote_addr, request.scheme, database_name)
return True
@@ -97,11 +102,13 @@ def db_exist(request, database_name):
return False
def db_list(*args):
def db_list(request, *args):
if not config.getboolean('database', 'list'):
raise Exception('AccessDenied')
context = {'_request': request.context}
with Transaction().start(
None, 0, close=True, _nocache=True) as transaction:
None, 0, context=context, close=True, _nocache=True
) as transaction:
return transaction.database.list()
@@ -159,6 +166,7 @@ def _dispatch(request, pool, *args, **kwargs):
try:
c_args, c_kwargs, transaction.context, transaction.timestamp \
= rpc.convert(obj, *args, **kwargs)
transaction.context['_request'] = request.context
meth = getattr(obj, method)
if (rpc.instantiate is None
or not is_instance_method(obj, method)):
@@ -187,8 +195,10 @@ def _dispatch(request, pool, *args, **kwargs):
# Need to commit to unlock SQLite database
transaction.commit()
if request.authorization.type == 'session':
context = {'_request': request.context}
try:
with Transaction().start(pool.database_name, 0) as transaction:
with Transaction().start(
pool.database_name, 0, context=context) as transaction:
Session = pool.get('ir.session')
Session.reset(request.authorization.get('session'))
except DatabaseOperationalError:
+11 -1
View File
@@ -62,12 +62,22 @@ class Request(_Request):
return None
if auth.type == 'session':
user_id = security.check(
database_name, auth.get('userid'), auth.get('session'))
database_name, auth.get('userid'), auth.get('session'),
context={'_request': self.context})
else:
user_id = security.login(
database_name, auth.username, auth, cache=False)
return user_id
@cached_property
def context(self):
return {
'remote_addr': self.remote_addr,
'http_host': self.environ.get('HTTP_HOST'),
'scheme': self.scheme,
'is_secure': self.is_secure,
}
def parse_authorization_header(value):
if not value:
+5 -6
View File
@@ -15,9 +15,8 @@ def _get_pool(dbname):
return pool
def login(dbname, loginname, parameters, cache=True, language=None):
def login(dbname, loginname, parameters, cache=True, context=None):
DatabaseOperationalError = backend.get('DatabaseOperationalError')
context = {'language': language}
for count in range(config.getint('database', 'retry'), -1, -1):
with Transaction().start(dbname, 0, context=context) as transaction:
pool = _get_pool(dbname)
@@ -43,10 +42,10 @@ def login(dbname, loginname, parameters, cache=True, language=None):
return
def logout(dbname, user, session):
def logout(dbname, user, session, context=None):
DatabaseOperationalError = backend.get('DatabaseOperationalError')
for count in range(config.getint('database', 'retry'), -1, -1):
with Transaction().start(dbname, 0):
with Transaction().start(dbname, 0, context=context):
pool = _get_pool(dbname)
Session = pool.get('ir.session')
try:
@@ -65,10 +64,10 @@ def logout(dbname, user, session):
return name
def check(dbname, user, session):
def check(dbname, user, session, context=None):
DatabaseOperationalError = backend.get('DatabaseOperationalError')
for count in range(config.getint('database', 'retry'), -1, -1):
with Transaction().start(dbname, user) as transaction:
with Transaction().start(dbname, user, context=context) as transaction:
pool = _get_pool(dbname)
Session = pool.get('ir.session')
try: