From a9454c13d890c5775d58735199f57caaf75aed33 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Fri, 14 Aug 2009 07:27:44 +0000 Subject: - Move (non-API) default_view, default_forbidden_view, and default_notfound_view functions into the ``repoze.bfg.view`` module (moved from ``repoze.bfg.router``). --- CHANGES.txt | 4 ++++ repoze/bfg/router.py | 34 +++---------------------------- repoze/bfg/tests/test_router.py | 21 ++------------------ repoze/bfg/tests/test_view.py | 44 +++++++++++++++++++++++++++++++++++++++++ repoze/bfg/view.py | 32 ++++++++++++++++++++++++++++++ 5 files changed, 85 insertions(+), 50 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 0943070db..b022bf8c7 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,10 @@ Next release ============ +- Move (non-API) default_view, default_forbidden_view, and + default_notfound_view functions into the ``repoze.bfg.view`` module + (moved from ``repoze.bfg.router``). + - Request-only-convention examples in the "Views" narrative documentation were broken. diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index c89296837..db7d4c174 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -1,11 +1,8 @@ -import cgi import os import sys -from webob import Response from zope.interface import providedBy from zope.component.event import dispatch -from zope.component import queryUtility from zope.interface import implements @@ -16,7 +13,6 @@ from repoze.bfg.events import NewResponse from repoze.bfg.events import WSGIApplicationCreatedEvent from repoze.bfg.interfaces import ILogger -from repoze.bfg.interfaces import IResponseFactory from repoze.bfg.interfaces import IRootFactory from repoze.bfg.interfaces import IRouter from repoze.bfg.interfaces import IRoutesMapper @@ -47,6 +43,9 @@ from repoze.bfg.traversal import _traverse from repoze.bfg.urldispatch import RoutesRootFactory +from repoze.bfg.view import default_forbidden_view +from repoze.bfg.view import default_notfound_view + _marker = object() class Router(object): @@ -182,33 +181,6 @@ class Router(object): finally: self.threadlocal_manager.pop() -def default_view(context, request, status): - try: - msg = cgi.escape(request.environ['repoze.bfg.message']) - except KeyError: - msg = '' - html = """ - - %s - -

%s

- %s - - - """ % (status, status, msg) - headers = [('Content-Length', str(len(html))), - ('Content-Type', 'text/html')] - response_factory = queryUtility(IResponseFactory, default=Response) - return response_factory(status = status, - headerlist = headers, - app_iter = [html]) - -def default_forbidden_view(context, request): - return default_view(context, request, '401 Unauthorized') - -def default_notfound_view(context, request): - return default_view(context, request, '404 Not Found') - def make_app(root_factory, package=None, filename='configure.zcml', authentication_policy=None, authorization_policy=None, options=None, registry=None, debug_logger=None, diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py index 8c3e23c91..cf9f2a835 100644 --- a/repoze/bfg/tests/test_router.py +++ b/repoze/bfg/tests/test_router.py @@ -140,7 +140,7 @@ class RouterTests(unittest.TestCase): def test_iforbiddenview_nooverride(self): context = DummyContext() router = self._makeOne() - from repoze.bfg.router import default_forbidden_view + from repoze.bfg.view import default_forbidden_view self.assertEqual(router.forbidden_view, default_forbidden_view) def test_inotfoundview_override(self): @@ -154,7 +154,7 @@ class RouterTests(unittest.TestCase): def test_inotfoundview_nooverride(self): context = DummyContext() router = self._makeOne() - from repoze.bfg.router import default_notfound_view + from repoze.bfg.view import default_notfound_view self.assertEqual(router.notfound_view, default_notfound_view) def test_call_no_view_registered_no_isettings(self): @@ -885,23 +885,6 @@ class MakeAppTests(unittest.TestCase): authzpolicy) self.assertEqual(len(logger.messages), 1) # deprecation warning -class TestDefaultForbiddenView(unittest.TestCase): - def _callFUT(self, context, request): - from repoze.bfg.router import default_forbidden_view - return default_forbidden_view(context, request) - - def test_nomessage(self): - request = DummyRequest({}) - context = DummyContext() - response = self._callFUT(context, request) - self.failUnless('' in response.body) - - def test_withmessage(self): - request = DummyRequest({'repoze.bfg.message':'abc&123'}) - context = DummyContext() - response = self._callFUT(context, request) - self.failUnless('abc&123' in response.body) - class TestDefaultRootFactory(unittest.TestCase): def _getTargetClass(self): from repoze.bfg.router import DefaultRootFactory diff --git a/repoze/bfg/tests/test_view.py b/repoze/bfg/tests/test_view.py index 5b870fa7d..a35930f69 100644 --- a/repoze/bfg/tests/test_view.py +++ b/repoze/bfg/tests/test_view.py @@ -452,10 +452,54 @@ class TestBFGViewDecorator(unittest.TestCase): self.assertEqual(result.context, None) self.assertEqual(result.request, None) +class TestDefaultForbiddenView(unittest.TestCase): + def _callFUT(self, context, request): + from repoze.bfg.view import default_forbidden_view + return default_forbidden_view(context, request) + + def test_nomessage(self): + request = DummyRequest({}) + context = DummyContext() + response = self._callFUT(context, request) + self.assertEqual(response.status, '401 Unauthorized') + self.failUnless('' in response.body) + + def test_withmessage(self): + request = DummyRequest({'repoze.bfg.message':'abc&123'}) + context = DummyContext() + response = self._callFUT(context, request) + self.assertEqual(response.status, '401 Unauthorized') + self.failUnless('abc&123' in response.body) + +class TestDefaultNotFoundView(unittest.TestCase): + def _callFUT(self, context, request): + from repoze.bfg.view import default_notfound_view + return default_notfound_view(context, request) + + def test_nomessage(self): + request = DummyRequest({}) + context = DummyContext() + response = self._callFUT(context, request) + self.assertEqual(response.status, '404 Not Found') + self.failUnless('' in response.body) + + def test_withmessage(self): + request = DummyRequest({'repoze.bfg.message':'abc&123'}) + context = DummyContext() + response = self._callFUT(context, request) + self.assertEqual(response.status, '404 Not Found') + self.failUnless('abc&123' in response.body) + + class DummyContext: pass class DummyRequest: + def __init__(self, environ=None): + if environ is None: + environ = {} + self.environ = environ + def get_response(self, application): return application diff --git a/repoze/bfg/view.py b/repoze/bfg/view.py index ce7153249..4e5418175 100644 --- a/repoze/bfg/view.py +++ b/repoze/bfg/view.py @@ -1,3 +1,4 @@ +import cgi import os import inspect import mimetypes @@ -12,12 +13,16 @@ import mimetypes if hasattr(mimetypes, 'init'): mimetypes.init() +from webob import Response + from paste.urlparser import StaticURLParser from zope.component import queryMultiAdapter +from zope.component import queryUtility from zope.deprecation import deprecated from repoze.bfg.interfaces import IView +from repoze.bfg.interfaces import IResponseFactory from repoze.bfg.path import caller_path from repoze.bfg.path import caller_package from repoze.bfg.security import view_execution_permitted @@ -303,3 +308,30 @@ class bfg_view(object): _bfg_view.__route_name__ = self.route_name return _bfg_view +def default_view(context, request, status): + try: + msg = cgi.escape(request.environ['repoze.bfg.message']) + except KeyError: + msg = '' + html = """ + + %s + +

%s

+ %s + + + """ % (status, status, msg) + headers = [('Content-Length', str(len(html))), + ('Content-Type', 'text/html')] + response_factory = queryUtility(IResponseFactory, default=Response) + return response_factory(status = status, + headerlist = headers, + app_iter = [html]) + +def default_forbidden_view(context, request): + return default_view(context, request, '401 Unauthorized') + +def default_notfound_view(context, request): + return default_view(context, request, '404 Not Found') + -- cgit v1.2.3