[Checkins] SVN: grok/branches/darrylcousins-branch/ Bringing in z3c
layers, dumbing down to IBrowserRequest,
offering also minimal and pagelet layers
Darryl Cousins
darryl at darrylcousins.net.nz
Sun Jul 1 04:23:50 EDT 2007
Log message for revision 77279:
Bringing in z3c layers, dumbing down to IBrowserRequest, offering also minimal and pagelet layers
Changed:
U grok/branches/darrylcousins-branch/megrok.layer/setup.py
U grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
U grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
U grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py
U grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py
U grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
U grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
U grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter.py
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter_templates/
A grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter_templates/painting.pt
U grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py
U grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
U grok/branches/darrylcousins-branch/src/grok/components.py
U grok/branches/darrylcousins-branch/src/grok/meta.py
-=-
Modified: grok/branches/darrylcousins-branch/megrok.layer/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/setup.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/setup.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -16,6 +16,10 @@
license='ZPL',
install_requires=['setuptools',
+ 'z3c.layer',
+ 'z3c.template',
+ 'z3c.macro',
+ 'z3c.pagelet',
],
)
Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -1,3 +1,4 @@
from directive import layer
from components import ILayer, Skin
+from components import IMinimalLayer, IPageletLayer
Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -1,8 +1,16 @@
-from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.publisher.interfaces.browser import IBrowserRequest
+from z3c.layer.pagelet import IPageletBrowserLayer
+from z3c.layer.minimal import IMinimalBrowserLayer
-class ILayer(IDefaultBrowserLayer):
+class ILayer(IBrowserRequest):
pass
+class IMinimalLayer(IMinimalBrowserLayer):
+ pass
+
+class IPageletLayer(IPageletBrowserLayer):
+ pass
+
class Skin(object):
pass
Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -15,9 +15,8 @@
</body>
</html>
-In another branch this would raise NotFound
- >>> #browser.open("http://localhost/++skin++Rotterdam/manfred/cavedrawings")
+ >>> browser.open("http://localhost/++skin++Rotterdam/manfred/cavedrawings")
Traceback (most recent call last):
...
NotFound: Object: <megrok.layer.ftests.layer.view.Mammoth object at ...>, name: u'cavedrawings'
Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -6,7 +6,6 @@
def suiteFromPackage(name):
files = resource_listdir(__name__, name)
suite = unittest.TestSuite()
- #files = ['view.py']
for filename in files:
if not filename.endswith('.py'):
continue
Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -2,6 +2,7 @@
import grok
import zope.component
from zope.publisher.interfaces.browser import (IDefaultBrowserLayer,
+ IBrowserRequest,
IBrowserSkinType)
from martian import util
import megrok.layer
@@ -16,7 +17,7 @@
def grok(self, name, factory, context, module_info, templates):
layer = util.class_annotation(factory, 'megrok.layer.layer',
None) or module_info.getAnnotation('megrok.layer.layer',
- None) or IDefaultBrowserLayer
+ None) or IBrowserRequest
name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
zope.component.interface.provideInterface(name, layer, IBrowserSkinType)
Modified: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -9,69 +9,8 @@
from z3c.viewlet.manager import WeightOrderedViewletManager
-class ViewBase(object):
+from grok.components import ViewBase
- def _render_template(self):
- namespace = self.template.pt_getContext()
- namespace['request'] = self.request
- namespace['view'] = self
- namespace['context'] = self.context
- namespace['static'] = self.static
- return self.template.pt_render(namespace)
-
- def application(self):
- obj = self.context
- while obj is not None:
- if isinstance(obj, grok.Application):
- return obj
- obj = obj.__parent__
- raise ValueErrror("No application found.")
-
- def site(self):
- obj = self.context
- while obj is not None:
- if isinstance(obj, grok.Site):
- return obj
- obj = obj.__parent__
- raise ValueErrror("No site found.")
-
- def application_url(self, name=None):
- obj = self.context
- while obj is not None:
- if isinstance(obj, grok.Application):
- return self.url(obj, name)
- obj = obj.__parent__
- raise ValueErrror("No application found.")
-
- def url(self, obj=None, name=None):
- # if the first argument is a string, that's the name. There should
- # be no second argument
- if isinstance(obj, basestring):
- if name is not None:
- raise TypeError(
- 'url() takes either obj argument, obj, string arguments, '
- 'or string argument')
- name = obj
- obj = None
-
- if name is None and obj is None:
- # create URL to view itself
- obj = self
- elif name is not None and obj is None:
- # create URL to view on context
- obj = self.context
- return url(self.request, obj, name)
-
- def redirect(self, url):
- return self.request.response.redirect(url)
-
- @property
- def response(self):
- return self.request.response
-
- def update(self):
- pass
-
class TemplateContentBase(object):
"""Mixin class to provide render method using given template"""
Modified: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -6,7 +6,6 @@
def suiteFromPackage(name):
files = resource_listdir(__name__, name)
suite = unittest.TestSuite()
- #files = ['view.py']
for filename in files:
if not filename.endswith('.py'):
continue
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter.py (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -0,0 +1,101 @@
+"""
+This first doctest demonstrates the use of grok.MultiAdapter to create and
+configure providers, viewletmanagers and viewlets.
+
+It is more wordy and not as convenient as the grokked equivalent.
+
+ >>> import grok
+ >>> from megrok.viewlet.ftests.viewlet.adapter import Mammoth
+ >>> grok.grok('megrok.viewlet.ftests.viewlet.adapter')
+ >>> getRootFolder()["manfred"] = Mammoth()
+
+ >>> from zope.testbrowser.testing import Browser
+ >>> browser = Browser()
+ >>> browser.handleErrors = False
+ >>> browser.open("http://localhost/++skin++myskin/manfred/@@painting")
+ >>> print browser.contents
+ <html>
+ <body>
+ <h1>This is a cave painting</h1>
+ <div><p>Hello World</p></div>
+ </body>
+ </html>
+
+"""
+import grok
+
+from zope.publisher.interfaces.browser import IBrowserRequest, IBrowserView
+from zope.contentprovider.interfaces import IContentProvider
+from zope.viewlet.interfaces import IViewletManager
+from zope.viewlet.interfaces import IViewlet
+from zope.viewlet.viewlet import ViewletBase
+import zope.component
+
+from z3c.viewlet.manager import WeightOrderedViewletManager
+
+import megrok.layer
+
+class Mammoth(grok.Model):
+ pass
+
+class IMySkinLayer(megrok.layer.ILayer):
+ pass
+
+class MySkin(megrok.layer.Skin):
+ megrok.layer.layer(IMySkinLayer)
+
+class Painting(grok.View):
+ """Template must be in *_templates, I tried and I tried to find out
+ why when inline the `provider` tal directive wasn't found"""
+ pass
+
+class MammothContentProvider(grok.MultiAdapter):
+ grok.adapts(Mammoth, IMySkinLayer, IBrowserView)
+ grok.implements(IContentProvider)
+ grok.name('cave')
+
+ def __init__(self, context, request, view):
+ self.context = context
+ self.request = request
+ self.view = self.__parent__ = view
+
+ def update(self):
+ pass
+
+ def render(self):
+ return u'This is a cave painting'
+
+class MammothViewletManager(grok.MultiAdapter, WeightOrderedViewletManager):
+ grok.adapts(Mammoth, IMySkinLayer, IBrowserView)
+ grok.name('cavecolumn')
+
+ def __init__(self, context, request, view):
+ WeightOrderedViewletManager.__init__(self, context, request, view)
+
+ def update(self):
+ viewlets = zope.component.getAdapters(
+ (self.context, self.request, self.__parent__, self),
+ IViewlet)
+ self.viewlets = []
+ for viewlet in viewlets:
+ self.viewlets.append(viewlet[1])
+
+ def render(self):
+ return '\n'.join([s.render() for s in self.viewlets])
+
+class HelloWorldViewlet(grok.MultiAdapter):
+ grok.adapts(Mammoth, IMySkinLayer, IBrowserView, IViewletManager)
+ grok.implements(IViewlet)
+ grok.name('helloworld')
+ weight = 0
+
+ def __init__(self, context, request, view, manager):
+ self.__parent__ = view
+ self.context = context
+ self.request = request
+ self.manager = manager
+
+ def render(self):
+ return u'<p>Hello World</p>'
+
+
Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter_templates/painting.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter_templates/painting.pt (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter_templates/painting.pt 2007-07-01 08:23:47 UTC (rev 77279)
@@ -0,0 +1,7 @@
+<html>
+<body>
+<h1 tal:content="structure provider:cave">Hello, world!</h1>
+<div tal:content="structure provider:cavecolumn">Cave column</div>
+</body>
+</html>
+
Modified: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -24,9 +24,7 @@
</body>
</html>
-In another branch this would raise NotFound
-
- >>> #browser.open("http://localhost/manfred/@@skinnedindex")
+ >>> browser.open("http://localhost/manfred/@@skinnedindex")
Traceback (most recent call last):
...
NotFound...'@@skinnedindex'
Modified: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -1,7 +1,7 @@
import martian
import grok
from zope import component
-from zope.publisher.interfaces.browser import (IDefaultBrowserLayer,
+from zope.publisher.interfaces.browser import (IBrowserRequest,
IBrowserView)
from zope.viewlet.interfaces import IViewlet, IViewletManager
from zope.contentprovider.interfaces import IContentProvider
@@ -68,7 +68,7 @@
view_layer = util.class_annotation(factory, 'megrok.layer.layer',
None) or module_info.getAnnotation('megrok.layer.layer',
- None) or IDefaultBrowserLayer
+ None) or IBrowserRequest
view_name = util.class_annotation(factory, 'grok.name',
self.factory_name)
@@ -95,7 +95,7 @@
view_layer = util.class_annotation(factory, 'megrok.layer.layer',
None) or module_info.getAnnotation('megrok.layer.layer',
- None) or IDefaultBrowserLayer
+ None) or IBrowserRequest
view_name = util.class_annotation(factory, 'grok.name',
self.factory_name)
Modified: grok/branches/darrylcousins-branch/src/grok/components.py
===================================================================
--- grok/branches/darrylcousins-branch/src/grok/components.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/src/grok/components.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -95,47 +95,40 @@
class Annotation(persistent.Persistent):
pass
+class ViewBase(object):
-class View(BrowserPage):
- interface.implements(interfaces.IGrokView)
-
- def __init__(self, context, request):
- super(View, self).__init__(context, request)
- self.static = component.queryAdapter(
- self.request,
- interface.Interface,
- name=self.module_info.package_dotted_name
- )
-
- @property
- def response(self):
- return self.request.response
-
- def __call__(self):
- mapply(self.update, (), self.request)
- if self.request.response.getStatus() in (302, 303):
- # A redirect was triggered somewhere in update(). Don't
- # continue rendering the template or doing anything else.
- return
-
- template = getattr(self, 'template', None)
- if template is not None:
- return self._render_template()
- return mapply(self.render, (), self.request)
-
def _render_template(self):
namespace = self.template.pt_getContext()
namespace['request'] = self.request
namespace['view'] = self
namespace['context'] = self.context
- # XXX need to check whether we really want to put None here if missing
namespace['static'] = self.static
return self.template.pt_render(namespace)
- def __getitem__(self, key):
- # XXX give nice error message if template is None
- return self.template.macros[key]
+ def application(self):
+ obj = self.context
+ while obj is not None:
+ if isinstance(obj, Application):
+ return obj
+ obj = obj.__parent__
+ raise ValueErrror("No application found.")
+ def site(self):
+ obj = self.context
+ while obj is not None:
+ if isinstance(obj, grok.Site):
+ return obj
+ obj = obj.__parent__
+ raise ValueErrror("No site found.")
+
+ def application_url(self, name=None):
+ obj = self.context
+ while obj is not None:
+ if isinstance(obj, Application):
+ return self.url(obj, name)
+ obj = obj.__parent__
+ raise ValueErrror("No application found.")
+
def url(self, obj=None, name=None):
# if the first argument is a string, that's the name. There should
# be no second argument
@@ -154,21 +147,46 @@
# create URL to view on context
obj = self.context
return url(self.request, obj, name)
-
- def application_url(self, name=None):
- obj = self.context
- while obj is not None:
- if isinstance(obj, Application):
- return self.url(obj, name)
- obj = obj.__parent__
- raise ValueError("No application found.")
-
+
def redirect(self, url):
return self.request.response.redirect(url)
+
+ @property
+ def response(self):
+ return self.request.response
def update(self):
pass
+
+class View(BrowserPage, ViewBase):
+ interface.implements(interfaces.IGrokView)
+
+ def __init__(self, context, request):
+ super(View, self).__init__(context, request)
+ self.static = component.queryAdapter(
+ self.request,
+ interface.Interface,
+ name=self.module_info.package_dotted_name
+ )
+
+ def __call__(self):
+ mapply(self.update, (), self.request)
+ if self.request.response.getStatus() in (302, 303):
+ # A redirect was triggered somewhere in update(). Don't
+ # continue rendering the template or doing anything else.
+ return
+
+ template = getattr(self, 'template', None)
+ if template is not None:
+ return self._render_template()
+ return mapply(self.render, (), self.request)
+
+ def __getitem__(self, key):
+ # XXX give nice error message if template is None
+ return self.template.macros[key]
+
+
class GrokViewAbsoluteURL(AbsoluteURL):
def _getContextName(self, context):
Modified: grok/branches/darrylcousins-branch/src/grok/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/src/grok/meta.py 2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/src/grok/meta.py 2007-07-01 08:23:47 UTC (rev 77279)
@@ -167,12 +167,15 @@
raise GrokError("View %r has no associated template or "
"'render' method." % factory, factory)
+ view_layer = util.class_annotation(factory, 'megrok.layer.layer',
+ None) or module_info.getAnnotation('megrok.layer.layer',
+ None) or IBrowserRequest
view_name = util.class_annotation(factory, 'grok.name',
factory_name)
# __view_name__ is needed to support IAbsoluteURL on views
factory.__view_name__ = view_name
component.provideAdapter(factory,
- adapts=(view_context, IDefaultBrowserLayer),
+ adapts=(view_context, view_layer),
provides=interface.Interface,
name=view_name)
@@ -310,7 +313,7 @@
resource_factory = components.DirectoryResourceFactory(
resource_path, module_info.dotted_name)
component.provideAdapter(
- resource_factory, (IDefaultBrowserLayer,),
+ resource_factory, (IBrowserRequest,),
interface.Interface, name=module_info.dotted_name)
return True
More information about the Checkins
mailing list