summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2011-08-18 17:17:56 -0400
committerChris McDonough <chrism@plope.com>2011-08-18 17:17:56 -0400
commitff5f5d2717f9f584734b01e8f189fd3850d9faaf (patch)
treeddeddc8a44744244db09296458201450240eb814
parent5ca67cd8805ff557383359d158c94e3703d12c43 (diff)
parent3603dd5c7b368ca5e0bc0c40cb156b43b7a169c8 (diff)
downloadpyramid-ff5f5d2717f9f584734b01e8f189fd3850d9faaf.tar.gz
pyramid-ff5f5d2717f9f584734b01e8f189fd3850d9faaf.tar.bz2
pyramid-ff5f5d2717f9f584734b01e8f189fd3850d9faaf.zip
Merge branch 'SpotOn-master'
-rw-r--r--pyramid/config/views.py9
-rw-r--r--pyramid/mako_templating.py22
-rw-r--r--pyramid/tests/test_config/test_views.py78
3 files changed, 105 insertions, 4 deletions
diff --git a/pyramid/config/views.py b/pyramid/config/views.py
index b2047a53b..5ec2f68a1 100644
--- a/pyramid/config/views.py
+++ b/pyramid/config/views.py
@@ -179,8 +179,10 @@ class ViewDeriver(object):
result = _permitted(context, request)
if result:
return view(context, request)
- msg = getattr(request, 'authdebug_message',
- 'Unauthorized: %s failed permission check' % view)
+ view_name = getattr(view, '__name__', view)
+ msg = getattr(
+ request, 'authdebug_message',
+ 'Unauthorized: %s failed permission check' % view_name)
raise HTTPForbidden(msg, result=result)
_secured_view.__call_permissive__ = view
_secured_view.__permitted__ = _permitted
@@ -230,8 +232,9 @@ class ViewDeriver(object):
def predicate_wrapper(context, request):
if all((predicate(context, request) for predicate in predicates)):
return view(context, request)
+ view_name = getattr(view, '__name__', view)
raise PredicateMismatch(
- 'predicate mismatch for view %s' % view)
+ 'predicate mismatch for view %s' % view_name)
def checker(context, request):
return all((predicate(context, request) for predicate in
predicates))
diff --git a/pyramid/mako_templating.py b/pyramid/mako_templating.py
index 3055e2cfb..b8105c68a 100644
--- a/pyramid/mako_templating.py
+++ b/pyramid/mako_templating.py
@@ -1,4 +1,5 @@
import os
+import sys
import threading
from zope.interface import implements
@@ -110,6 +111,14 @@ def renderer_factory(info):
return MakoLookupTemplateRenderer(path, lookup)
+class MakoRenderingException(Exception):
+ def __init__(self, text):
+ self.text = text
+
+ def __repr__(self):
+ return self.text
+
+ __str__ = __repr__
class MakoLookupTemplateRenderer(object):
implements(ITemplateRenderer)
@@ -134,5 +143,16 @@ class MakoLookupTemplateRenderer(object):
template = self.implementation()
if def_name is not None:
template = template.get_def(def_name)
- result = template.render_unicode(**system)
+ try:
+ result = template.render_unicode(**system)
+ except:
+ try:
+ exc_info = sys.exc_info()
+ errtext = exceptions.text_error_template().render(
+ error=exc_info[0],
+ traceback=exc_info[2])
+ raise MakoRenderingException(errtext)
+ finally:
+ del exc_info
+
return result
diff --git a/pyramid/tests/test_config/test_views.py b/pyramid/tests/test_config/test_views.py
index aa5b8d2d6..b1cf8e72f 100644
--- a/pyramid/tests/test_config/test_views.py
+++ b/pyramid/tests/test_config/test_views.py
@@ -929,6 +929,84 @@ class TestViewDeriver(unittest.TestCase):
request.url = 'url'
self.assertEqual(result(None, request), response)
+ def test_secured_view_raises_forbidden_no_name(self):
+ from pyramid.interfaces import IAuthenticationPolicy
+ from pyramid.interfaces import IAuthorizationPolicy
+ from pyramid.httpexceptions import HTTPForbidden
+ response = DummyResponse()
+ view = lambda *arg: response
+ self.config.registry.settings = {}
+ policy = DummySecurityPolicy(False)
+ self.config.registry.registerUtility(policy, IAuthenticationPolicy)
+ self.config.registry.registerUtility(policy, IAuthorizationPolicy)
+ deriver = self._makeOne(permission='view')
+ result = deriver(view)
+ request = self._makeRequest()
+ request.view_name = 'view_name'
+ request.url = 'url'
+ try:
+ result(None, request)
+ except HTTPForbidden, e:
+ self.assertEqual(e.message,
+ 'Unauthorized: <lambda> failed permission check')
+ else:
+ raise AssertionError
+
+ def test_secured_view_raises_forbidden_with_name(self):
+ from pyramid.interfaces import IAuthenticationPolicy
+ from pyramid.interfaces import IAuthorizationPolicy
+ from pyramid.httpexceptions import HTTPForbidden
+ def myview(request): pass
+ self.config.registry.settings = {}
+ policy = DummySecurityPolicy(False)
+ self.config.registry.registerUtility(policy, IAuthenticationPolicy)
+ self.config.registry.registerUtility(policy, IAuthorizationPolicy)
+ deriver = self._makeOne(permission='view')
+ result = deriver(myview)
+ request = self._makeRequest()
+ request.view_name = 'view_name'
+ request.url = 'url'
+ try:
+ result(None, request)
+ except HTTPForbidden, e:
+ self.assertEqual(e.message,
+ 'Unauthorized: myview failed permission check')
+ else:
+ raise AssertionError
+
+ def test_predicate_mismatch_view_has_no_name(self):
+ from pyramid.exceptions import PredicateMismatch
+ response = DummyResponse()
+ view = lambda *arg: response
+ def predicate1(context, request):
+ return False
+ deriver = self._makeOne(predicates=[predicate1])
+ result = deriver(view)
+ request = self._makeRequest()
+ request.method = 'POST'
+ try:
+ result(None, None)
+ except PredicateMismatch, e:
+ self.assertEqual(e.detail, 'predicate mismatch for view <lambda>')
+ else:
+ raise AssertionError
+
+ def test_predicate_mismatch_view_has_name(self):
+ from pyramid.exceptions import PredicateMismatch
+ def myview(request): pass
+ def predicate1(context, request):
+ return False
+ deriver = self._makeOne(predicates=[predicate1])
+ result = deriver(myview)
+ request = self._makeRequest()
+ request.method = 'POST'
+ try:
+ result(None, None)
+ except PredicateMismatch, e:
+ self.assertEqual(e.detail, 'predicate mismatch for view myview')
+ else:
+ raise AssertionError
+
def test_with_predicates_all(self):
response = DummyResponse()
view = lambda *arg: response