From 6f2f04a4d2d1df1b5fd7d5327c57e96e059279cd Mon Sep 17 00:00:00 2001
From: Michael Merickel <michael@merickel.org>
Date: Thu, 15 Jun 2017 08:13:10 +0200
Subject: [PATCH] add a reraise argument to request.invoke_exception_view

---
 pyramid/view.py            |   26 +++++++++++++++++---------
 pyramid/tests/test_view.py |   27 +++++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/pyramid/tests/test_view.py b/pyramid/tests/test_view.py
index a9ce223..e03487a 100644
--- a/pyramid/tests/test_view.py
+++ b/pyramid/tests/test_view.py
@@ -886,6 +886,18 @@
         else: # pragma: no cover
             self.fail()
 
+    def test_it_reraises_if_not_found(self):
+        request = self._makeOne()
+        dummy_exc = RuntimeError()
+        try:
+            raise dummy_exc
+        except RuntimeError:
+            self.assertRaises(
+                RuntimeError,
+                lambda: request.invoke_exception_view(reraise=True))
+        else: # pragma: no cover
+            self.fail()
+
     def test_it_raises_predicate_mismatch(self):
         from pyramid.exceptions import PredicateMismatch
         def exc_view(exc, request): pass
@@ -900,6 +912,21 @@
         else: # pragma: no cover
             self.fail()
 
+    def test_it_reraises_after_predicate_mismatch(self):
+        def exc_view(exc, request): pass
+        self.config.add_view(exc_view, context=Exception, request_method='POST')
+        request = self._makeOne()
+        request.method = 'GET'
+        dummy_exc = RuntimeError()
+        try:
+            raise dummy_exc
+        except RuntimeError:
+            self.assertRaises(
+                RuntimeError,
+                lambda: request.invoke_exception_view(reraise=True))
+        else: # pragma: no cover
+            self.fail()
+
 class ExceptionResponse(Exception):
     status = '404 Not Found'
     app_iter = ['Not Found']
diff --git a/pyramid/view.py b/pyramid/view.py
index 14d1182..dc4aae3 100644
--- a/pyramid/view.py
+++ b/pyramid/view.py
@@ -16,6 +16,7 @@
     )
 
 from pyramid.compat import decode_path_info
+from pyramid.compat import reraise as reraise_
 
 from pyramid.exceptions import (
     ConfigurationError,
@@ -630,8 +631,9 @@
         self,
         exc_info=None,
         request=None,
-        secure=True
-        ):
+        secure=True,
+        reraise=False,
+    ):
         """ Executes an exception view related to the request it's called upon.
         The arguments it takes are these:
 
@@ -654,14 +656,12 @@
             does not have the appropriate permission, this should be ``True``.
             Default: ``True``.
 
-        If called with no arguments, it uses the global exception information
-        returned by ``sys.exc_info()`` as ``exc_info``, the request
-        object that this method is attached to as the ``request``, and
-        ``True`` for ``secure``.
+        ``reraise``
 
-        This method returns a :term:`response` object or raises
-        :class:`pyramid.httpexceptions.HTTPNotFound` if a matching view cannot
-        be found.
+            A boolean indicating whether the original error should be reraised
+            if a :term:`response` object could not be created. If ``False``
+            then an :class:`pyramid.httpexceptions.HTTPNotFound`` exception
+            will be raised. Default: ``False``.
 
         If a response is generated then ``request.exception`` and
         ``request.exc_info`` will be left at the values used to render the
@@ -674,6 +674,8 @@
            The ``request.exception`` and ``request.exc_info`` properties will
            reflect the exception used to render the response where previously
            they were reset to the values prior to invoking the method.
+
+           Also added the ``reraise`` argument.
 
         """
         if request is None:
@@ -716,10 +718,16 @@
                     secure=secure,
                     request_iface=request_iface.combined,
                     )
+            except:
+                if reraise:
+                    reraise_(*exc_info)
+                raise
             finally:
                 manager.pop()
 
         if response is None:
+            if reraise:
+                reraise_(*exc_info)
             raise HTTPNotFound
 
         # successful response, overwrite exception/exc_info

--
Gitblit v1.9.3