diff --git a/pyramid_formalchemy/resources.py b/pyramid_formalchemy/resources.py index 73bcd8f..a8aa13c 100644 --- a/pyramid_formalchemy/resources.py +++ b/pyramid_formalchemy/resources.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from pyramid.exceptions import NotFound +from sqlalchemy import exceptions as sqlalchemy_exceptions import logging log = logging.getLogger(__name__) @@ -74,7 +75,12 @@ class Models(Base): if item in ('json', 'xhr'): self.request.format = item return self - model = ModelListing(self.request, item) + + self.request.model_name = item + model_class = self.get_model() + factory = type('%s_CustomFactory' % (model_class.__name__,), (ModelListing, model_class), {}) + model = factory(self.request, item) + model.__parent__ = self if hasattr(model, '__acl__'): # propagate permissions to parent @@ -102,9 +108,11 @@ class ModelListing(Base): if item in ('json', 'xhr'): self.request.format = item return self - if item in ('new',): + factory = type('%s_CustomFactory' % (self.request.model_class.__name__,), (Model, self.request.model_class), {}) + try: + model = factory(self.request, item) + except NotFound: raise KeyError() - model = Model(self.request, item) model.__parent__ = self return model @@ -116,7 +124,13 @@ class Model(Base): def __init__(self, request, name): Base.__init__(self, request, name) query = request.session_factory.query(request.model_class) - request.model_instance = request.query_factory(request, query, id=name) + try: + request.model_instance = request.query_factory(request, query, id=name) + except sqlalchemy_exceptions.SQLAlchemyError, exc: + log.exception(exc) + request.session_factory().rollback() + raise NotFound(request.path) + if request.model_instance is None: raise NotFound(request.path) request.model_id = name