[Checkins] SVN: z3c.responseheaders/trunk/src/z3c/responseheaders/ use obj, request adapter aka view, so we dont have to rely on specific view implementations which hold the request as self.request

Bernd Dorn bernd.dorn at lovelysystems.com
Fri Nov 24 14:18:19 EST 2006


Log message for revision 71302:
  use obj,request adapter aka view, so we dont have to rely on specific view implementations which hold the request as self.request

Changed:
  U   z3c.responseheaders/trunk/src/z3c/responseheaders/README.txt
  U   z3c.responseheaders/trunk/src/z3c/responseheaders/__init__.py
  U   z3c.responseheaders/trunk/src/z3c/responseheaders/setter.py
  U   z3c.responseheaders/trunk/src/z3c/responseheaders/tests.py

-=-
Modified: z3c.responseheaders/trunk/src/z3c/responseheaders/README.txt
===================================================================
--- z3c.responseheaders/trunk/src/z3c/responseheaders/README.txt	2006-11-24 15:05:27 UTC (rev 71301)
+++ z3c.responseheaders/trunk/src/z3c/responseheaders/README.txt	2006-11-24 19:18:18 UTC (rev 71302)
@@ -3,7 +3,7 @@
 ===================================
 
 This package provides an implementation for setting response headers
-(e.g. for chahe settings) on browser views by providing adapters to
+(e.g. for chahe settings) on browser views by registering views on
 views. This way we do not have to change view code in order to set
 headers differently.
 
@@ -23,39 +23,42 @@
   ...     pass
   >>> class FooView(BrowserView):
   ...     interface.implements(IFooView)
-  ...     def __call__(self):
-  ...         return u'i am so foo'
 
   >>> from zope.publisher.browser import TestRequest
   >>> request = TestRequest()
   >>> foo = Foo()
   >>> view = FooView(foo, request)
 
-Headers are applied before traversing the view. We do not set up
-events for this test because we don't need it. We just call the
-handler directly
+Headers are applied by a handler on IBeforeTraverseEvent traversing
+the view. We have to fire the event manually for testing.
 
-  >>> from z3c.responseheaders import setter
-  >>> setter.onBrowserViewBeforeTraverse(view, request)
+  >>> from zope import event
+  >>> from zope.app.publication.interfaces import BeforeTraverseEvent
+  >>> event.notify(BeforeTraverseEvent(view, request))
 
-In the normal case no cache headers are applied because no adapters
+
+In the normal case no cache headers are applied because no views
 are registered.
 
   >>> request.response.getHeaders()
   [('X-Powered-By', 'Zope (www.zope.org), Python (www.python.org)')]
 
-Let us define a header setter adapter. The adapter has to adapt
-(context, view) to IResponseHeaderSetter.
+Let us define a header setter view. The view has to provide to
+IResponseHeaderSetter. There is a base class we can use.
 
+  >>> from z3c.responseheaders import setter
   >>> class MySetter(setter.BaseSetter):
-  ...     component.adapts(IFooView)
   ...     headers = (('My-Header','My Header Value'),)
 
-  >>> component.provideAdapter(MySetter)
+And register the view.
 
+  >>> from zope.app.testing import ztapi
+  >>> from z3c.responseheaders.interfaces import IResponseHeaderSetter
+  >>> ztapi.browserViewProviding(IFooView, MySetter, IResponseHeaderSetter)
+
 And call the event handler again.
 
-  >>> setter.onBrowserViewBeforeTraverse(view, request)
+  >>> event.notify(BeforeTraverseEvent(view, request))
   >>> request.response.getHeaders()
   [('X-Powered-By', 'Zope (www.zope.org),
    Python (www.python.org)'),

Modified: z3c.responseheaders/trunk/src/z3c/responseheaders/__init__.py
===================================================================
--- z3c.responseheaders/trunk/src/z3c/responseheaders/__init__.py	2006-11-24 15:05:27 UTC (rev 71301)
+++ z3c.responseheaders/trunk/src/z3c/responseheaders/__init__.py	2006-11-24 19:18:18 UTC (rev 71302)
@@ -12,6 +12,6 @@
 #
 ##############################################################################
 """
-$Id:§
+$Id:$
 """
 __docformat__ = 'restructuredtext'

Modified: z3c.responseheaders/trunk/src/z3c/responseheaders/setter.py
===================================================================
--- z3c.responseheaders/trunk/src/z3c/responseheaders/setter.py	2006-11-24 15:05:27 UTC (rev 71301)
+++ z3c.responseheaders/trunk/src/z3c/responseheaders/setter.py	2006-11-24 19:18:18 UTC (rev 71302)
@@ -4,21 +4,22 @@
 import interfaces
 
 def onBrowserViewBeforeTraverse(obj, event):
-    adapter = interfaces.IResponseHeaderSetter(obj, None)
-    if adapter is None:
+    setter = component.queryMultiAdapter(
+        (obj, event.request), interfaces.IResponseHeaderSetter)
+    if setter is None:
         return
-    adapter.setHeaders()
+    setter.setHeaders()
 
 class BaseSetter(object):
 
     interface.implements(interfaces.IResponseHeaderSetter)
     headers = []
 
-    def __init__(self, context):
+    def __init__(self, context, request):
         self.context = context
+        self.request = request
         
     def setHeaders(self):
-        request = removeSecurityProxy(self.context).request
         for name, value in self.headers:
-            request.response.setHeader(name, value)
+            self.request.response.setHeader(name, value)
 

Modified: z3c.responseheaders/trunk/src/z3c/responseheaders/tests.py
===================================================================
--- z3c.responseheaders/trunk/src/z3c/responseheaders/tests.py	2006-11-24 15:05:27 UTC (rev 71301)
+++ z3c.responseheaders/trunk/src/z3c/responseheaders/tests.py	2006-11-24 19:18:18 UTC (rev 71302)
@@ -12,7 +12,7 @@
 #
 ##############################################################################
 """
-$Id:§
+$Id:$
 """
 __docformat__ = 'restructuredtext'
 
@@ -21,16 +21,24 @@
 from zope.testing import doctest
 from zope.testing.doctestunit import DocFileSuite
 from zope.app.testing import setup
+from zope import event
+import setter
+from zope.publisher.interfaces.browser import IBrowserView
+from zope.app.publication.interfaces import IBeforeTraverseEvent
+from zope import component
 
-
 def setUp(test):
     root = setup.placefulSetUp()
+    component.provideHandler(setter.onBrowserViewBeforeTraverse,
+                             (IBrowserView, IBeforeTraverseEvent))
+
 def tearDown(test):
     setup.placefulTearDown()
 
 def test_suite():
     return unittest.TestSuite((
         DocFileSuite('README.txt',
+                     setUp=setUp, tearDown=tearDown,
                      optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
                      ),
         ))



More information about the Checkins mailing list