Chris McDonough
2015-04-06 17c7f4091a3e747fb215328803462ff14de556d2
change excview_tween to use _call_view instead of adapters.lookup; parameterize _call_view and _find_views to cope
2 files modified
43 ■■■■ changed files
pyramid/tweens.py 17 ●●●●● patch | view | raw | blame | history
pyramid/view.py 26 ●●●● patch | view | raw | blame | history
pyramid/tweens.py
@@ -3,17 +3,16 @@
from pyramid.interfaces import (
    IExceptionViewClassifier,
    IRequest,
    IView,
    )
from zope.interface import providedBy
from pyramid.view import _call_view
def excview_tween_factory(handler, registry):
    """ A :term:`tween` factory which produces a tween that catches an
    exception raised by downstream tweens (or the main Pyramid request
    handler) and, if possible, converts it into a Response using an
    :term:`exception view`."""
    adapters = registry.adapters
    def excview_tween(request):
        attrs = request.__dict__
@@ -39,11 +38,17 @@
            # https://github.com/Pylons/pyramid/issues/700
            request_iface = attrs.get('request_iface', IRequest)
            provides = providedBy(exc)
            for_ = (IExceptionViewClassifier, request_iface.combined, provides)
            view_callable = adapters.lookup(for_, IView, default=None)
            if view_callable is None:
            response = _call_view(
                registry,
                request,
                exc,
                provides,
                '',
                view_classifier=IExceptionViewClassifier,
                request_iface=request_iface.combined
                )
            if response is None:
                raise
            response = view_callable(exc, request)
        return response
pyramid/view.py
@@ -9,6 +9,7 @@
    ISecuredView,
    IView,
    IViewClassifier,
    IRequest,
    )
from pyramid.compat import decode_path_info
@@ -416,17 +417,27 @@
        settings['_info'] = info.codeinfo # fbo "action_method"
        return wrapped
def _find_views(registry, request_iface, context_iface, view_name):
def _find_views(
    registry,
    request_iface,
    context_iface,
    view_name,
    view_types=None,
    view_classifier=None,
    ):
    if  view_types is None:
        view_types = (IView, ISecuredView, IMultiView)
    if view_classifier is  None:
        view_classifier = IViewClassifier
    registered = registry.adapters.registered
    cache = registry._view_lookup_cache
    views = cache.get((request_iface, context_iface, view_name))
    if views is None:
        views = []
        view_types = (IView, ISecuredView, IMultiView)
        for req_type, ctx_type in itertools.product(
            request_iface.__sro__, context_iface.__sro__
        ):
            source_ifaces = (IViewClassifier, req_type, ctx_type)
            source_ifaces = (view_classifier, req_type, ctx_type)
            for view_type in view_types:
                view_callable = registered(
                    source_ifaces,
@@ -453,13 +464,20 @@
    context,
    context_iface,
    view_name,
    view_types=None,
    view_classifier=None,
    secure=True,
    request_iface=None,
    ):
    if request_iface is None:
        request_iface = getattr(request, 'request_iface', IRequest)
    view_callables = _find_views(
        registry,
        request.request_iface,
        request_iface,
        context_iface,
        view_name,
        view_types=view_types,
        view_classifier=view_classifier,
        )
    pme = None