[Checkins] SVN: grok/branches/ksmith_mcweekly-viewlet/src/grok/ *
based on Lennart Regebro's work on megrok.viewlet
Kevin Smith
kevin at mcweekly.com
Thu Apr 26 02:13:36 EDT 2007
Log message for revision 74778:
* based on Lennart Regebro's work on megrok.viewlet
* add components grok.ViewletManager, grok.Viewlet
* add directive grok.viewletmanager
usage
-----
class MyView(grok.View):
pass
myview.pt
<span tal:replace="provider:boxes" />
class Boxes(grok.ViewletManager):
grok.context(MyView)
grok.name('boxes') #default, available as provider:boxes
class Box1(grok.Viewlet):
grok.viewletmanager(Boxes)
def render(self):
return "Box1"
class Box2(grok.Viewlet):
grok.viewletmanager(Boxes)
def render(self):
return "Box2"
Changed:
U grok/branches/ksmith_mcweekly-viewlet/src/grok/__init__.py
U grok/branches/ksmith_mcweekly-viewlet/src/grok/components.py
U grok/branches/ksmith_mcweekly-viewlet/src/grok/directive.py
U grok/branches/ksmith_mcweekly-viewlet/src/grok/ftests/static/simple_fixture/ellie.py
U grok/branches/ksmith_mcweekly-viewlet/src/grok/interfaces.py
U grok/branches/ksmith_mcweekly-viewlet/src/grok/meta.py
U grok/branches/ksmith_mcweekly-viewlet/src/grok/tests/test_grok.py
-=-
Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/__init__.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/__init__.py 2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/__init__.py 2007-04-26 06:13:36 UTC (rev 74778)
@@ -34,10 +34,12 @@
from grok.components import PageTemplate, PageTemplateFile, Container, Traverser
from grok.components import Site, GlobalUtility, LocalUtility, Annotation
from grok.components import Application, Form, AddForm, EditForm, DisplayForm
-from grok.components import Indexes, Skin
+from grok.components import Indexes, Skin, ViewletManager, Viewlet
+
from grok.directive import (context, name, template, templatedir, provides,
baseclass, global_utility, local_utility,
- define_permission, require, site, layer)
+ define_permission, require, site, layer,
+ viewletmanager)
from grok._grok import do_grok as grok # Avoid name clash within _grok
from grok._grok import SubscribeDecorator as subscribe
Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/components.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/components.py 2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/components.py 2007-04-26 06:13:36 UTC (rev 74778)
@@ -39,6 +39,8 @@
from zope.traversing.browser.absoluteurl import AbsoluteURL
from zope.traversing.browser.absoluteurl import _safe as SAFE_URL_CHARACTERS
from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.viewlet.manager import ViewletManagerBase
+from zope.viewlet.viewlet import ViewletBase
from zope.app.pagetemplate.engine import TrustedAppPT
from zope.app.publisher.browser import getDefaultViewName
@@ -510,3 +512,11 @@
class Skin(object):
pass
+
+
+class ViewletManager(ViewletManagerBase):
+ template = None
+
+
+class Viewlet(ViewletBase):
+ pass
Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/directive.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/directive.py 2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/directive.py 2007-04-26 06:13:36 UTC (rev 74778)
@@ -284,3 +284,5 @@
layer = InterfaceOrClassDirective('grok.layer',
ClassOrModuleDirectiveContext())
+viewletmanager = InterfaceOrClassDirective('grok.viewletmanager',
+ ClassDirectiveContext())
Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/ftests/static/simple_fixture/ellie.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/ftests/static/simple_fixture/ellie.py 2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/ftests/static/simple_fixture/ellie.py 2007-04-26 06:13:36 UTC (rev 74778)
@@ -19,7 +19,6 @@
class MammothSkin(grok.Skin):
grok.layer(MammothLayer)
-
class CaveDrawings(grok.View):
def render(self):
Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/interfaces.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/interfaces.py 2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/interfaces.py 2007-04-26 06:13:36 UTC (rev 74778)
@@ -41,8 +41,12 @@
AddForm = interface.Attribute("Base class for add forms.")
EditForm = interface.Attribute("Base class for edit forms.")
DisplayForm = interface.Attribute("Base class for display forms.")
- Layer = interface.Attribute("Base interface for skin layers.")
+ Layer = interface.Attribute("Base interface for layer.")
+ Skin = interface.Attribute("Base interface for skin.")
+ ViewletManager = interface.Attribute("Base interface for viewletmanager.")
+ Viewlet = interface.Attribute("Base interface for viewlet.")
+
class IGrokErrors(interface.Interface):
def GrokError(message, component):
@@ -81,11 +85,6 @@
This directive acts as a contraint on the 'request' of
grok.View. This directive can only be used on class level."""
- def skin(skin):
- """Declare this layer as a named skin.
-
- This directive can only be used on class level."""
-
def template(template):
"""Declare the template name for a view.
@@ -131,8 +130,6 @@
The site should in this case be a container.
name_in_container - the name to use for storing the utility
"""
- def register_skin(name, iface):
- """Register skin name for layer."""
def define_permission(permission):
"""Defines a new permission with the id ``permission``."""
Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/meta.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/meta.py 2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/meta.py 2007-04-26 06:13:36 UTC (rev 74778)
@@ -7,8 +7,11 @@
IBrowserPublisher,
IBrowserSkinType)
from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
+from zope.publisher.browser import IBrowserView
+from zope.viewlet.interfaces import IViewletManager, IViewlet
from zope.security.permission import Permission
from zope.security.interfaces import IPermission
+from zope.security.checker import NamesChecker, defineChecker
from zope.annotation.interfaces import IAnnotations
from zope.app.publisher.xmlrpc import MethodPublisher
@@ -595,3 +598,63 @@
None) or grok.IDefaultBrowserLayer
name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
zope.component.interface.provideInterface(name, layer, IBrowserSkinType)
+
+
+
+class ViewletManagerGrokker(grok.ClassGrokker):
+ component_class = grok.ViewletManager
+
+ def register(self, context, name, factory, module_info, templates):
+
+ name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
+ view_layer = util.class_annotation(factory, 'grok.layer',
+ None) or module_info.getAnnotation('grok.layer',
+ None) or IDefaultBrowserLayer
+
+ view_context = util.determine_class_context(factory, context)
+ component.provideAdapter(factory,
+ adapts=(None, # TODO: Make configurable
+ view_layer,
+ view_context),
+ provides=IViewletManager,
+ name=factory.__name__.lower())
+
+
+class ViewletGrokker(grok.ClassGrokker):
+ component_class = grok.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(['update', '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(['update','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(['update','render'], permissions[0])
+
+ defineChecker(factory, checker)
+
+ # New directive
+ viewletmanager = grok.util.class_annotation(factory, 'grok.viewletmanager', [])
+ layer = util.class_annotation(factory, 'grok.layer',
+ None) or module_info.getAnnotation('grok.layer',
+ None) or IDefaultBrowserLayer
+
+ component.provideAdapter(factory,
+ adapts=(None, # TODO: Make configurable
+ layer,
+ IBrowserView,
+ viewletmanager),
+ provides=IViewlet,
+ name=name)
+
Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/tests/test_grok.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/tests/test_grok.py 2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/tests/test_grok.py 2007-04-26 06:13:36 UTC (rev 74778)
@@ -2,10 +2,12 @@
from pkg_resources import resource_listdir
from zope.testing import doctest, cleanup
import zope.component.eventtesting
+import zope.viewlet.tests
def setUpZope(test):
zope.component.eventtesting.setUp(test)
-
+ zope.viewlet.tests.setUp(test) # setup 'provider' talnamespace
+
def cleanUpZope(test):
cleanup.cleanUp()
More information about the Checkins
mailing list