+def session_wrapper(fn):
+ """
+ Wrapper around common ".., session=None):" handling. If the wrapped
+ function is called without passing 'session', we create a local one
+ and destroy it when the function ends.
+ """
+
+ def wrapped(*args, **kwargs):
+ private_transaction = False
+ session = kwargs.get('session')
+
+ # No session specified as last argument or in kwargs, create one.
+ if session is None and len(args) <= len(getargspec(fn)[0]) - 1:
+ private_transaction = True
+ kwargs['session'] = DBConn().session()
+
+ try:
+ return fn(*args, **kwargs)
+ finally:
+ if private_transaction:
+ # We created a session; close it.
+ kwargs['session'].close()
+
+ wrapped.__doc__ = fn.__doc__
+ wrapped.func_name = fn.func_name
+
+ return wrapped
+
+################################################################################
+