[Checkins] SVN: Sandbox/nadako/zope.ptresource/ Don't render PageTemplateResource when called as the IResource interface requires that __call__ method should return an absolute URL. When accessed by browser, it still will be rendered, because "browserDefault" method now returns a callable that will render the template to browser.

Dan Korostelev nadako at gmail.com
Mon Aug 24 07:58:23 EDT 2009


Log message for revision 103139:
  Don't render PageTemplateResource when called as the IResource interface requires that __call__ method should return an absolute URL. When accessed  by browser, it still will be rendered, because "browserDefault" method now returns a callable that will render the template to browser.

Changed:
  U   Sandbox/nadako/zope.ptresource/CHANGES.txt
  U   Sandbox/nadako/zope.ptresource/src/zope/ptresource/configure.zcml
  U   Sandbox/nadako/zope.ptresource/src/zope/ptresource/ptresource.py
  U   Sandbox/nadako/zope.ptresource/src/zope/ptresource/tests.py

-=-
Modified: Sandbox/nadako/zope.ptresource/CHANGES.txt
===================================================================
--- Sandbox/nadako/zope.ptresource/CHANGES.txt	2009-08-24 11:37:52 UTC (rev 103138)
+++ Sandbox/nadako/zope.ptresource/CHANGES.txt	2009-08-24 11:58:22 UTC (rev 103139)
@@ -9,3 +9,10 @@
 of refactoring process. It's now a plugin for another package that was
 refactored from zope.app.publisher - zope.browserresource. See its
 documentation for more details.
+
+Other changes:
+
+ * Don't render PageTemplateResource when called as the IResource interface
+   requires that __call__ method should return an absolute URL. When accessed
+   by browser, it still will be rendered, because "browserDefault" method now
+   returns a callable that will render the template to browser.

Modified: Sandbox/nadako/zope.ptresource/src/zope/ptresource/configure.zcml
===================================================================
--- Sandbox/nadako/zope.ptresource/src/zope/ptresource/configure.zcml	2009-08-24 11:37:52 UTC (rev 103138)
+++ Sandbox/nadako/zope.ptresource/src/zope/ptresource/configure.zcml	2009-08-24 11:58:22 UTC (rev 103139)
@@ -3,19 +3,19 @@
   <utility
       name="pt"
       component=".ptresource.PageTemplateResourceFactory"
-      provides=".interfaces.IResourceFactoryFactory"
+      provides="zope.browserresource.interfaces.IResourceFactoryFactory"
       />
   
   <utility
       name="zpt"
       component=".ptresource.PageTemplateResourceFactory"
-      provides=".interfaces.IResourceFactoryFactory"
+      provides="zope.browserresource.interfaces.IResourceFactoryFactory"
       />
   
   <utility
       name="html"
       component=".ptresource.PageTemplateResourceFactory"
-      provides=".interfaces.IResourceFactoryFactory"
+      provides="zope.browserresource.interfaces.IResourceFactoryFactory"
       />
 
   <class class=".ptresource.PageTemplateResource">

Modified: Sandbox/nadako/zope.ptresource/src/zope/ptresource/ptresource.py
===================================================================
--- Sandbox/nadako/zope.ptresource/src/zope/ptresource/ptresource.py	2009-08-24 11:37:52 UTC (rev 103138)
+++ Sandbox/nadako/zope.ptresource/src/zope/ptresource/ptresource.py	2009-08-24 11:58:22 UTC (rev 103139)
@@ -61,17 +61,20 @@
 
     def browserDefault(self, request):
         '''See interface IBrowserPublisher'''
-        return self, ()
+        return getattr(self, request.method), ()
 
-    def __call__(self):
-        # TODO: this method violates the IResource contract according to
-        # which, it sould return an absolute URL. Let's do something with
-        # it. Probably move the rendering code to another method and point
-        # to it with browserDefault. nadako, 23 Aug 2009
+    def HEAD(self):
         pt = self.context
         response = self.request.response
         if not response.getHeader("Content-Type"):
             response.setHeader("Content-Type", pt.content_type)
+        return ''
+
+    def GET(self):
+        pt = self.context
+        response = self.request.response
+        if not response.getHeader("Content-Type"):
+            response.setHeader("Content-Type", pt.content_type)
         return pt(self.request)
 
 class PageTemplateResourceFactory(object):

Modified: Sandbox/nadako/zope.ptresource/src/zope/ptresource/tests.py
===================================================================
--- Sandbox/nadako/zope.ptresource/src/zope/ptresource/tests.py	2009-08-24 11:37:52 UTC (rev 103138)
+++ Sandbox/nadako/zope.ptresource/src/zope/ptresource/tests.py	2009-08-24 11:58:22 UTC (rev 103139)
@@ -54,17 +54,28 @@
                           resource.request, ())
         os.unlink(path)
 
-    def testCall(self):
+    def testBrowserDefault(self):
         path = self.createTestFile(
             '<html><body tal:content="request/test_data"></body></html>')
         test_data = "Foobar"
         request = TestRequest(test_data=test_data)
         factory = PageTemplateResourceFactory(path, checker, 'testresource.pt')
         resource = factory(request)
-        self.assertEquals(resource(),
+        view, next = resource.browserDefault(request)
+        self.assertEquals(view(),
                           '<html><body>%s</body></html>' % test_data)
         self.assertEquals('text/html',
                           request.response.getHeader('Content-Type'))
+        self.assertEquals(next, ())
+
+        request = TestRequest(test_data=test_data, REQUEST_METHOD='HEAD')
+        resource = factory(request)
+        view, next = resource.browserDefault(request)
+        self.assertEquals(view(), '')
+        self.assertEquals('text/html',
+                          request.response.getHeader('Content-Type'))
+        self.assertEquals(next, ())
+        
         os.unlink(path)
 
 



More information about the Checkins mailing list