[Checkins] SVN: Grokstar/trunk/src/megrok.viewlet/ A rough and ready viewlet proof of concept. Supports viewlets, viewletmanagers, and

Lennart Regebro regebro at gmail.com
Sun Mar 18 10:55:44 EDT 2007


Log message for revision 73312:
  A rough and ready viewlet proof of concept. Supports viewlets, viewletmanagers, and 
  also a way to render them without being dependant on ZPT.
  

Changed:
  A   Grokstar/trunk/src/megrok.viewlet/
  A   Grokstar/trunk/src/megrok.viewlet/trunk/
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/__init__.py
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/__init__.py
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/configure.zcml
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/interfaces.py
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/main_template.pt
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/meta.py
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/publication.py
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlet_manager_default.pt
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlet_manager_empty.pt
  A   Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlets.py

-=-
Added: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/__init__.py
===================================================================
--- Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/__init__.py	2007-03-18 14:01:18 UTC (rev 73311)
+++ Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/__init__.py	2007-03-18 14:55:43 UTC (rev 73312)
@@ -0,0 +1,3 @@
+# make this directory a namespace package
+import pkg_resources
+pkg_resources.declare_namespace('megrok')
\ No newline at end of file


Property changes on: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/__init__.py
===================================================================
--- Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/__init__.py	2007-03-18 14:01:18 UTC (rev 73311)
+++ Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/__init__.py	2007-03-18 14:55:43 UTC (rev 73312)
@@ -0,0 +1 @@
+# make this directory a namespace package


Property changes on: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/__init__.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/configure.zcml
===================================================================
--- Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/configure.zcml	2007-03-18 14:01:18 UTC (rev 73311)
+++ Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/configure.zcml	2007-03-18 14:55:43 UTC (rev 73312)
@@ -0,0 +1,17 @@
+<configure    
+  xmlns="http://namespaces.zope.org/zope"
+  xmlns:browser="http://namespaces.zope.org/browser"
+  xmlns:grok="http://namespaces.zope.org/grok" 
+  i18n_domain="zope">
+
+  <grok:grok package="." />
+
+  <publisher
+      name="BROWSER"
+      factory=".publication.SkinnedBrowserFactory"
+      methods="GET POST HEAD"
+      mimetypes="*"
+      priority="12"
+      />
+
+</configure>


Property changes on: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/configure.zcml
___________________________________________________________________
Name: svn:keywords
   + Id

Added: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/interfaces.py
===================================================================
--- Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/interfaces.py	2007-03-18 14:01:18 UTC (rev 73311)
+++ Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/interfaces.py	2007-03-18 14:55:43 UTC (rev 73312)
@@ -0,0 +1,23 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Interfaces
+"""
+
+from zope.viewlet.interfaces import IViewletManager
+
+class ITitle(IViewletManager):
+      """Title of my page."""
+
+class IMainContent(IViewletManager):
+      """Main content of my page."""


Property changes on: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/interfaces.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/main_template.pt
===================================================================
--- Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/main_template.pt	2007-03-18 14:01:18 UTC (rev 73311)
+++ Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/main_template.pt	2007-03-18 14:55:43 UTC (rev 73312)
@@ -0,0 +1,10 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+  <head>
+    <title tal:content="python:managers['title'].render()">title</title>
+  </head>
+  <body>
+    <div class="left_column" tal:content="structure python:managers['main_content'].render()"/>
+
+  </body>
+</html>


Property changes on: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/main_template.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/meta.py
===================================================================
--- Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/meta.py	2007-03-18 14:01:18 UTC (rev 73311)
+++ Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/meta.py	2007-03-18 14:55:43 UTC (rev 73312)
@@ -0,0 +1,84 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Interfaces
+"""
+from zope import component
+from zope.publisher.interfaces.browser import IBrowserView
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.viewlet.interfaces import IViewlet, IViewletManager
+from zope.viewlet.manager import ViewletManagerBase
+from zope.security.checker import NamesChecker, defineChecker
+
+import grok
+
+class ViewletManager(ViewletManagerBase, grok.Model):
+    template = None
+        
+class ViewletManagerGrokker(grok.ClassGrokker):
+    component_class = ViewletManager
+
+    def register(self, context, name, factory, module_info, templates):
+        provides = grok.util.class_annotation(factory, 'grok.provides', None)
+        name = grok.util.class_annotation(factory, 'grok.name', name)
+        component.provideAdapter(factory,
+                                 adapts=(None, # TODO: Make configurable
+                                         IDefaultBrowserLayer, # TODO: Make configurable
+                                         IBrowserView),
+                                 provides=provides,
+                                 name=name)
+        
+class Viewlet(grok.Model):
+
+    def __init__(self, context, request, view, manager):
+        self.context = context
+        self.request = request
+        self.view = view
+        self.manager = manager
+        
+    def update(self):
+        pass
+        
+class ViewletGrokker(grok.ClassGrokker):
+    component_class = Viewlet
+
+    def register(self, context, name, factory, module_info, templates):
+        # Try to set up permissions (copied from the View grokker)
+        permissions = grok.util.class_annotation(factory, 'grok.require', [])
+        if not permissions:
+            checker = NamesChecker(['render'])
+        elif len(permissions) > 1:
+            raise GrokError('grok.require was called multiple times in viewlet '
+                            '%r. It may only be called once.' % factory,
+                            factory)
+        elif permissions[0] == 'zope.Public':
+            checker = NamesChecker(['render'])
+        else:
+            perm = permissions[0]
+            if component.queryUtility(IPermission, name=perm) is None:
+                raise GrokError('Undefined permission %r in view %r. Use '
+                                'grok.define_permission first.'
+                                % (perm, factory), factory)
+            checker = NamesChecker(['render'], permissions[0])
+
+        defineChecker(factory, checker)
+        
+        manager = factory.viewlet_manager
+        component.provideAdapter(factory,
+                                 adapts=(None, # TODO: Make configurable
+                                         IDefaultBrowserLayer, # TODO: Make configurable
+                                         IBrowserView, 
+                                         manager),
+                                 provides=IViewlet,
+                                 name=name)
+        
\ No newline at end of file


Property changes on: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/meta.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/publication.py
===================================================================
--- Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/publication.py	2007-03-18 14:01:18 UTC (rev 73311)
+++ Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/publication.py	2007-03-18 14:55:43 UTC (rev 73312)
@@ -0,0 +1,51 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Skinned Grok publication objects
+"""
+
+import zope.interface
+import zope.component
+from zope.app.publication.requestpublicationfactories import BrowserFactory
+from zope.security.checker import selectChecker
+
+from grok.publication import GrokBrowserPublication
+from grok.components import PageTemplateFile
+
+from interfaces import ITitle
+
+class SkinnedBrowserPublication(GrokBrowserPublication):
+
+    def callObject(self, request, ob):
+        if getattr(ob, 'context', None) is None:
+            return super(SkinnedBrowserPublication, self).callObject(request, ob)
+            
+        checker = selectChecker(ob)
+        if checker is not None:
+            checker.check(ob, '__call__')
+        
+        managers = dict(zope.component.getAdapters((ob.context, request, ob), 
+                                                   zope.interface.Interface))
+        for manager in managers.values():
+            manager.update()
+        
+        # TODO: make template configurable (pick up from layer?)
+        template = PageTemplateFile('main_template.pt')
+        return template.pt_render({'managers': managers})
+
+
+class SkinnedBrowserFactory(BrowserFactory):
+
+    def __call__(self):
+        request, publication = super(SkinnedBrowserFactory, self).__call__()
+        return request, SkinnedBrowserPublication


Property changes on: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/publication.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlet_manager_default.pt
===================================================================
--- Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlet_manager_default.pt	2007-03-18 14:01:18 UTC (rev 73311)
+++ Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlet_manager_default.pt	2007-03-18 14:55:43 UTC (rev 73312)
@@ -0,0 +1,5 @@
+<div class="viewlet_manager" tal:attributes="id options">
+  <div class="viewlet"
+       tal:repeat="viewlet options/viewlets"
+       tal:content="structure viewlet/render" />
+</div>
\ No newline at end of file


Property changes on: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlet_manager_default.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlet_manager_empty.pt
===================================================================
--- Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlet_manager_empty.pt	2007-03-18 14:01:18 UTC (rev 73311)
+++ Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlet_manager_empty.pt	2007-03-18 14:55:43 UTC (rev 73312)
@@ -0,0 +1,3 @@
+<tal:block
+  tal:repeat="viewlet options/viewlets"
+  tal:content="structure viewlet/render" />
\ No newline at end of file


Property changes on: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlet_manager_empty.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlets.py
===================================================================
--- Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlets.py	2007-03-18 14:01:18 UTC (rev 73311)
+++ Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlets.py	2007-03-18 14:55:43 UTC (rev 73312)
@@ -0,0 +1,53 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Interfaces
+"""
+from zope import component
+from zope.interface import implements
+from zope.publisher.publish import mapply
+import grok
+
+import interfaces
+from meta import Viewlet, ViewletManager
+
+class TitleViewletManager(ViewletManager):
+    grok.name('title')
+    # Implements AND provides? Can I get rid of one?
+    implements(interfaces.ITitle)
+    grok.provides(interfaces.ITitle)
+
+
+class TitleViewlet(Viewlet):
+    # Should this be like grok.viewlet_manager(ILeftColumn) instead?
+    viewlet_manager = interfaces.ITitle
+
+    def render(self):
+        return getattr(self.context, 'title', u'')
+
+
+class ContentViewletManager(ViewletManager):
+    grok.name('main_content')
+    # Implements AND provides? Can I get rid of one?
+    implements(interfaces.IMainContent)
+    grok.provides(interfaces.IMainContent)
+
+
+class ContentViewlet(Viewlet):
+    viewlet_manager = interfaces.IMainContent
+
+    def render(self):
+        return mapply(self.view, 
+                      self.request.getPositionalArguments(), 
+                      self.request)
+


Property changes on: Grokstar/trunk/src/megrok.viewlet/trunk/src/megrok/viewlet/viewlets.py
___________________________________________________________________
Name: svn:keywords
   + Id



More information about the Checkins mailing list