diff options
| author | Chris McDonough <chrism@plope.com> | 2011-08-18 17:17:56 -0400 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2011-08-18 17:17:56 -0400 |
| commit | ff5f5d2717f9f584734b01e8f189fd3850d9faaf (patch) | |
| tree | ddeddc8a44744244db09296458201450240eb814 | |
| parent | 5ca67cd8805ff557383359d158c94e3703d12c43 (diff) | |
| parent | 3603dd5c7b368ca5e0bc0c40cb156b43b7a169c8 (diff) | |
| download | pyramid-ff5f5d2717f9f584734b01e8f189fd3850d9faaf.tar.gz pyramid-ff5f5d2717f9f584734b01e8f189fd3850d9faaf.tar.bz2 pyramid-ff5f5d2717f9f584734b01e8f189fd3850d9faaf.zip | |
Merge branch 'SpotOn-master'
| -rw-r--r-- | pyramid/config/views.py | 9 | ||||
| -rw-r--r-- | pyramid/mako_templating.py | 22 | ||||
| -rw-r--r-- | pyramid/tests/test_config/test_views.py | 78 |
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 |
