Example #1
0
 def __init__(self):
     self.__request_context_scope = \
         _create_scoped_session(scope_func=SessionContext._request_context_scope_func)
     self.__thread_local_scope = \
         _create_scoped_session()
     self.__observable = Observable()
Example #2
0
 def __init__(self, values=None, immutables=None):
     self.__active = False
     self.__store = dict() if values is None else values.copy()
     self.__immutables = set() if immutables is None else immutables.copy()
     self.__observable = Observable()
Example #3
0
class SessionContext(object):
    def __init__(self):
        self.__request_context_scope = \
            _create_scoped_session(scope_func=SessionContext._request_context_scope_func)
        self.__thread_local_scope = \
            _create_scoped_session()
        self.__observable = Observable()

    def __call__(self, *args, **kwargs):
        if self.request_context_scoped:
            session = self.__request_context_scope()
        else:
            session = self.__thread_local_scope()
        return self._init_session(session)

    @property
    def request_context_scoped(self):
        return RequestContextManager.active()

    def remove(self):
        if self.request_context_scoped:
            self.__request_context_scope.remove()
        else:
            self.__thread_local_scope.remove()

        # call listeners on removed event
        self.__observable("removed", None)

    def _init_session(self, session):

        # add register after commit method to the session
        if not hasattr(session, "register_after_commit"):
            session.after_commit_callbacks = []
            session.register_after_commit = lambda cb, handle_error=False: \
                session.after_commit_callbacks.append((cb, handle_error))

        # call listeners on created event
        self.__observable("created", session)

        return session

    @staticmethod
    def _request_context_scope_func():
        request_context = RequestContextManager.get_context()
        if not request_context.contains_listener(
                SessionContext._request_context_session_release):
            request_context.register_listener(
                SessionContext._request_context_session_release)
        return request_context.id

    @staticmethod
    def _request_context_session_release(event, context):
        # remove sessions on deactivate events
        if event == "deactivate":
            try:
                Session.remove()
            except:
                logger.warn(
                    "Failed to remove db session from request context: %s",
                    context.id)

    def contains_listener(self, listener):
        return listener in self.__observable

    def register_listener(self, listener):
        self.__observable.register(listener)
Example #4
0
class RequestContext(MutableMapping):
    def __init__(self, values=None, immutables=None):
        self.__active = False
        self.__store = dict() if values is None else values.copy()
        self.__immutables = set() if immutables is None else immutables.copy()
        self.__observable = Observable()

    def __contains__(self, item):
        return item in self.__store

    def __len__(self):
        return len(self.__store)

    def __getitem__(self, item):
        return self.__store[item]

    def __delitem__(self, key):
        self.__check_immutable(key)
        del self.__store[key]

    def __setitem__(self, key, value):
        self.__check_immutable(key)
        self.__store[key] = value

    def __iter__(self):
        return iter(self.__store)

    @property
    def active(self):
        return self.__active

    @property
    def id(self):
        return id(self)

    def __check_immutable(self, key):
        if key in self.__immutables:
            raise ValueError("The value is immutable and cannot be changed.")

    def clone(self):
        """
        Clones the RequestContext creating a new RequestContext with the data
        copied from the original.  Observables / callbacks are not copied in the
        cloning process.

        :return: a new RequestContext
        """
        return RequestContext(values=self.__store,
                              immutables=self.__immutables)

    def immutable(self, key, value):
        """Sets the given value and makes it immutable for the
        lifetime of the request context.  If someone tries to change
        the value then a ValueError is raised.
        """
        self.__check_immutable(key)
        self[key] = value
        self.__immutables.add(key)

    def contains_listener(self, listener):
        return listener in self.__observable

    def register_listener(self, listener):
        self.__observable.register(listener)

    def _activate(self):
        _request_store.context = self
        self.__active = True
        self.__observable("activate", self)

    def _release(self):
        if self.__active:
            # fire listener first because listeners may depend on
            # request to perform cleanup work
            self.__observable("deactivate", self)
            _request_store.release()
            self.__active = False
Example #5
0
 def __init__(self):
     self.__active = False
     self.__store = dict()
     self.__immutable = set()
     self.__observable = Observable()
Example #6
0
class RequestContext(MutableMapping):

    def __init__(self):
        self.__active = False
        self.__store = dict()
        self.__immutable = set()
        self.__observable = Observable()

    def __contains__(self, item):
        return item in self.__store

    def __len__(self):
        return len(self.__store)

    def __getitem__(self, item):
        return self.__store[item]

    def __delitem__(self, key):
        self.__check_immutable(key)
        del self.__store[key]

    def __setitem__(self, key, value):
        self.__check_immutable(key)
        self.__store[key] = value

    def __iter__(self):
        return iter(self.__store)

    @property
    def active(self):
        return self.__active

    @property
    def id(self):
        return id(self)

    def __check_immutable(self, key):
        if key in self.__immutable:
            raise ValueError("The value is immutable and cannot be changed.")

    def immutable(self, key, value):
        """Sets the given value and makes it immutable for the
        lifetime of the request context.  If someone tries to change
        the value then a ValueError is raised.
        """
        self.__check_immutable(key)
        self[key] = value
        self.__immutable.add(key)

    def contains_listener(self, listener):
        return listener in self.__observable

    def register_listener(self, listener):
        self.__observable.register(listener)

    def _activate(self):
        _request_store.context = self
        self.__active = True
        self.__observable("activate", self)

    def _release(self):
        if self.__active:
            # fire listener first because listeners may depend on
            # request to perform cleanup work
            self.__observable("deactivate", self)
            _request_store.release()
            self.__active = False
Example #7
0
 def __init__(self):
     self.__request_context_scope = \
         _create_scoped_session(scope_func=SessionContext._request_context_scope_func)
     self.__thread_local_scope = \
         _create_scoped_session()
     self.__observable = Observable()
Example #8
0
class SessionContext(object):

    def __init__(self):
        self.__request_context_scope = \
            _create_scoped_session(scope_func=SessionContext._request_context_scope_func)
        self.__thread_local_scope = \
            _create_scoped_session()
        self.__observable = Observable()

    def __call__(self, *args, **kwargs):
        if self.request_context_scoped:
            session = self.__request_context_scope()
        else:
            session = self.__thread_local_scope()
        return self._init_session(session)

    @property
    def request_context_scoped(self):
        return RequestContextManager.active()

    def remove(self):
        if self.request_context_scoped:
            self.__request_context_scope.remove()
        else:
            self.__thread_local_scope.remove()

        # call listeners on removed event
        self.__observable("removed", None)

    def _init_session(self, session):

        # add register after commit method to the session
        if not hasattr(session, "register_after_commit"):
            session.after_commit_callbacks = []
            session.register_after_commit = lambda cb, handle_error=False: \
                session.after_commit_callbacks.append((cb, handle_error))

        # call listeners on created event
        self.__observable("created", session)

        return session

    @staticmethod
    def _request_context_scope_func():
        request_context = RequestContextManager.get_context()
        if not request_context.contains_listener(SessionContext._request_context_session_release):
            request_context.register_listener(SessionContext._request_context_session_release)
        return request_context.id

    @staticmethod
    def _request_context_session_release(event, context):
        # remove sessions on deactivate events
        if event == "deactivate":
            try:
                Session.remove()
            except:
                logger.warn("Failed to remove db session from request context: %s", context.id)

    def contains_listener(self, listener):
        return listener in self.__observable

    def register_listener(self, listener):
        self.__observable.register(listener)