[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