Source code for tet.sqlalchemy.factory

"""
Root factory base class for SQLAlchemy-backed traversal.

This module provides a base class for implementing Pyramid traversal
with SQLAlchemy models.

Example
-------

Creating a root factory for users::

    from sqlalchemy.orm import Session
    from tet.sqlalchemy.factory import SQLARootFactory

    class UserFactory(SQLARootFactory):
        def supplier(self, item):
            session = self.request.find_service(Session)
            return session.query(User).filter(User.id == int(item)).one()

Using in route configuration::

    config.add_route("user", "/users/{id}", factory=UserFactory)
"""
from sqlalchemy.exc import DataError
from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound


[docs] class SQLARootFactory(object): """ Base class for SQLAlchemy-backed traversal root factories. Subclasses must implement :meth:`supplier` to look up resources. SQLAlchemy exceptions are converted to :exc:`KeyError` for Pyramid traversal. """ def __init__(self, request): """Initialize with the current request.""" self.request = request def __getitem__(self, item): """Look up a resource by key, delegating to :meth:`supplier`.""" try: return self.supplier(item) except (MultipleResultsFound, NoResultFound, DataError) as e: raise KeyError(item) from e