[Checkins] SVN: Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/ added viewonview support

Christian Klinger cklinger at novareto.de
Tue Sep 14 10:09:56 EDT 2010


Log message for revision 116403:
  added viewonview support

Changed:
  A   Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/components.py
  U   Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/meta.py
  A   Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_attributetraversal.py
  D   Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_browser.py
  A   Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_viewonview.py

-=-
Added: Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/components.py
===================================================================
--- Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/components.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/components.py	2010-09-14 14:09:56 UTC (rev 116403)
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+
+import grokcore.view
+from zope.interface import alsoProvides
+from zope.publisher.publish import mapply
+from grok.interfaces import IGrokSecurityView
+from zope.security.proxy import removeSecurityProxy
+
+
+
+class ViewExtension(grokcore.view.View):
+
+    def __init__(self, context, request):
+        self.view = context
+        super(grokcore.view.View, self).__init__(context, request)
+        if not IGrokSecurityView.providedBy(context):
+            self.view = removeSecurityProxy(self.view)
+            alsoProvides(self.view, IGrokSecurityView)
+        if not IGrokSecurityView.providedBy(self.view.context):
+            self.context = removeSecurityProxy(self.view.context)
+            alsoProvides(self.context, IGrokSecurityView)
+
+    def __call__(self):
+        view_name = self.__view_name__
+        method = getattr(self, view_name)
+        method_result = mapply(method, (), self.request)
+        return method_result 
+
+    def render(self):
+        return "BLA"
+

Modified: Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/meta.py
===================================================================
--- Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/meta.py	2010-09-14 14:08:30 UTC (rev 116402)
+++ Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/meta.py	2010-09-14 14:09:56 UTC (rev 116403)
@@ -4,12 +4,15 @@
 import martian
 
 from zope import interface, component
+from grok.util import make_checker
 from zope.publisher.browser import BrowserPage
 from grokcore.security.util import protect_getattr
 from zope.publisher.interfaces.browser import IBrowserPage
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 
+from megrok.attributetraverser.components import ViewExtension
 
+
 class AttributeTraversableGrokker(martian.MethodGrokker):
     """"""
     martian.component(grok.View)
@@ -36,6 +39,29 @@
                         callable=protect_getattr,
                         args=(method_view, method_name, permission),
                         )
+        return True
 
+
+class ViewOnViewGrokker(martian.MethodGrokker):
+    """
+    """
+    martian.component(ViewExtension)
+    martian.directive(grok.view)
+    martian.directive(grok.require, name='permission')
+
+    def execute(self, factory, method, config, view, permission, **kw):
+        name = method.__name__
+        method_view = type(
+            factory.__name__, (factory, BrowserPage),
+            {'__view_name__': name})
+        adapts = (view, IDefaultBrowserLayer)
+        config.action(
+            discriminator=('adapter', adapts, interface.Interface, name),
+            callable=component.provideAdapter,
+            args=(method_view, adapts, interface.Interface, name))
+        for method_name in IBrowserPage:
+            config.action(
+                discriminator=('protectName', method_view, method_name),
+                callable=protect_getattr,
+                args=(method_view, method_name, permission))
         return True
-

Copied: Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_attributetraversal.py (from rev 116341, Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_browser.py)
===================================================================
--- Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_attributetraversal.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_attributetraversal.py	2010-09-14 14:09:56 UTC (rev 116403)
@@ -0,0 +1,98 @@
+"""
+Let's setup some basic infrastructure for running the tests.
+
+  >>> from grokcore.component import testing
+  >>> testing.grok(__name__)
+
+  >>> root = getRootFolder() 
+  >>> root['app'] = app = MyApp()
+  >>> root['app']
+  <megrok.attributetraverser.tests.test_attributetraversal.MyApp object at ...>
+
+  >>> from zope.app.wsgi.testlayer import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+
+Now we can call the appview with the testbrowser.
+As result we receive the normal output of grok.View
+
+  >>> browser.open('http://127.0.0.1/app/appview')
+  >>> print browser.contents
+  HELLO
+
+Next, we try to access a method on this view, which is
+not marked as traversable.
+
+  >>> browser.handleErrors = True 
+  >>> browser.open('http://127.0.0.1/app/appview/@@untraversable_method')
+  Traceback (most recent call last):
+  ...
+  HTTPError: HTTP Error 404: Not Found
+
+This method is traversable this means we should get the expected
+result
+
+  >>> browser.open('http://127.0.0.1/app/appview/@@traversable_method')
+  >>> print browser.contents
+  I'm traversable!
+
+This test shows that query_strings work with traversable methods
+
+  >>> browser.open('http://127.0.0.1/app/appview/@@with_querystring?name=Christian')
+  >>> print browser.contents
+  Hello Christian
+
+
+  >>> browser.open('http://127.0.0.1/app/appview/@@json_response')
+  >>> browser.headers.get('content-type')
+  'application/json'
+
+  >>> simplejson.loads(browser.contents)
+  {'name': 'json'}
+"""
+
+
+import grok
+import simplejson
+
+
+class MyApp(grok.Context):
+    pass
+
+
+class Appview(grok.View):
+    grok.context(MyApp)
+    grok.traversable('traversable_method')
+    grok.traversable('with_querystring')
+    grok.traversable('json_response')
+
+    def render(self):
+        return "HELLO"
+
+    def untraversable_method(self):
+        return "I'm not traversable!"
+
+    def traversable_method(self):
+        return "I'm traversable!"
+
+    def with_querystring(self, name):
+        return "Hello " + name
+
+    def json_response(self):
+        self.request.response.setHeader('Content-Type', 'application/json')
+        data = {'name': 'json'}
+        return simplejson.dumps(data)
+
+def test_suite():
+    import unittest
+    from megrok.attributetraverser import tests
+    from zope.testing import doctest
+
+    layer = tests.AttributeTraverserLayer(tests.test_attributetraversal)
+    suite = unittest.TestSuite()
+    mytest = doctest.DocTestSuite(
+        extraglobs={"getRootFolder": layer.getRootFolder},
+        optionflags=(doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS))
+    mytest.layer = layer
+    suite.addTest(mytest)
+    return suite

Deleted: Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_browser.py
===================================================================
--- Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_browser.py	2010-09-14 14:08:30 UTC (rev 116402)
+++ Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_browser.py	2010-09-14 14:09:56 UTC (rev 116403)
@@ -1,98 +0,0 @@
-"""
-Let's setup some basic infrastructure for running the tests.
-
-  >>> from grokcore.component import testing
-  >>> testing.grok(__name__)
-
-  >>> root = getRootFolder() 
-  >>> root['app'] = app = MyApp()
-  >>> root['app']
-  <megrok.attributetraverser.tests.test_browser.MyApp object at ...>
-
-  >>> from zope.app.wsgi.testlayer import Browser
-  >>> browser = Browser()
-  >>> browser.handleErrors = False
-
-Now we can call the appview with the testbrowser.
-As result we receive the normal output of grok.View
-
-  >>> browser.open('http://127.0.0.1/app/appview')
-  >>> print browser.contents
-  HELLO
-
-Next, we try to access a method on this view, which is
-not marked as traversable.
-
-  >>> browser.handleErrors = True 
-  >>> browser.open('http://127.0.0.1/app/appview/@@untraversable_method')
-  Traceback (most recent call last):
-  ...
-  HTTPError: HTTP Error 404: Not Found
-
-This method is traversable this means we should get the expected
-result
-
-  >>> browser.open('http://127.0.0.1/app/appview/@@traversable_method')
-  >>> print browser.contents
-  I'm traversable!
-
-This test shows that query_strings work with traversable methods
-
-  >>> browser.open('http://127.0.0.1/app/appview/@@with_querystring?name=Christian')
-  >>> print browser.contents
-  Hello Christian
-
-
-  >>> browser.open('http://127.0.0.1/app/appview/@@json_response')
-  >>> browser.headers.get('content-type')
-  'application/json'
-
-  >>> simplejson.loads(browser.contents)
-  {'name': 'json'}
-"""
-
-
-import grok
-import simplejson
-
-
-class MyApp(grok.Context):
-    pass
-
-
-class Appview(grok.View):
-    grok.context(MyApp)
-    grok.traversable('traversable_method')
-    grok.traversable('with_querystring')
-    grok.traversable('json_response')
-
-    def render(self):
-        return "HELLO"
-
-    def untraversable_method(self):
-        return "I'm not traversable!"
-
-    def traversable_method(self):
-        return "I'm traversable!"
-
-    def with_querystring(self, name):
-        return "Hello " + name
-
-    def json_response(self):
-        self.request.response.setHeader('Content-Type', 'application/json')
-        data = {'name': 'json'}
-        return simplejson.dumps(data)
-
-def test_suite():
-    import unittest
-    from megrok.attributetraverser import tests
-    from zope.testing import doctest
-
-    layer = tests.AttributeTraverserLayer(tests.test_browser)
-    suite = unittest.TestSuite()
-    mytest = doctest.DocTestSuite(
-        extraglobs={"getRootFolder": layer.getRootFolder},
-        optionflags=(doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS))
-    mytest.layer = layer
-    suite.addTest(mytest)
-    return suite

Added: Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_viewonview.py
===================================================================
--- Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_viewonview.py	                        (rev 0)
+++ Sandbox/cklinger/megrok.attributetraverser/trunk/src/megrok/attributetraverser/tests/test_viewonview.py	2010-09-14 14:09:56 UTC (rev 116403)
@@ -0,0 +1,65 @@
+"""
+Let's setup some basic infrastructure for running the tests.
+
+  >>> from grokcore.component import testing
+  >>> testing.grok(__name__)
+
+  >>> root = getRootFolder() 
+  >>> root['app1'] = app = MyApp()
+  >>> root['app1']
+  <megrok.attributetraverser.tests.test_viewonview.MyApp object at ...>
+
+  >>> from zope.app.wsgi.testlayer import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+
+Now we can call the appview with the testbrowser.
+As result we receive the normal output of grok.View
+
+  >>> browser.open('http://127.0.0.1/app1/simpleview')
+  >>> print browser.contents
+  HELLO
+
+  >>> browser.open('http://127.0.0.1/app1/simpleview/@@getfoo')
+  >>> print browser.contents
+  fooBAR
+"""
+
+
+import grok
+import simplejson
+from megrok.attributetraverser.components import ViewExtension
+
+
+class MyApp(grok.Context):
+    bar = "BAR"
+
+
+class SimpleView(grok.View):
+    grok.context(MyApp)
+    foo = "foo"
+
+    def render(self):
+        return "HELLO"
+
+
+class AjaxMethods(ViewExtension):
+    grok.view(SimpleView)
+
+    def getfoo(self):
+        return self.view.foo + self.context.bar 
+
+
+def test_suite():
+    import unittest
+    from megrok.attributetraverser import tests
+    from zope.testing import doctest
+
+    layer = tests.AttributeTraverserLayer(tests.test_viewonview)
+    suite = unittest.TestSuite()
+    mytest = doctest.DocTestSuite(
+        extraglobs={"getRootFolder": layer.getRootFolder},
+        optionflags=(doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS))
+    mytest.layer = layer
+    suite.addTest(mytest)
+    return suite



More information about the checkins mailing list