[Checkins] SVN: megrok.quarry/trunk/ fixed missing checkin,
fixed buildout order issue, added demo
Kevin Smith
kevin at mcweekly.com
Wed May 2 18:38:10 EDT 2007
Log message for revision 75031:
fixed missing checkin, fixed buildout order issue, added demo
Changed:
U megrok.quarry/trunk/buildout.cfg
U megrok.quarry/trunk/setup.py
U megrok.quarry/trunk/src/megrok/quarry/__init__.py
U megrok.quarry/trunk/src/megrok/quarry/components.py
U megrok.quarry/trunk/src/megrok/quarry/configure.zcml
A megrok.quarry/trunk/src/megrok/quarry/demo/
A megrok.quarry/trunk/src/megrok/quarry/demo/__init__.py
A megrok.quarry/trunk/src/megrok/quarry/demo/app.py
A megrok.quarry/trunk/src/megrok/quarry/demo/configure.zcml
A megrok.quarry/trunk/src/megrok/quarry/demo/demoshare.py
A megrok.quarry/trunk/src/megrok/quarry/demo/master.pt
A megrok.quarry/trunk/src/megrok/quarry/demo/menu.pt
U megrok.quarry/trunk/src/megrok/quarry/directive.py
U megrok.quarry/trunk/src/megrok/quarry/meta.py
-=-
Modified: megrok.quarry/trunk/buildout.cfg
===================================================================
--- megrok.quarry/trunk/buildout.cfg 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/buildout.cfg 2007-05-02 22:38:10 UTC (rev 75031)
@@ -1,9 +1,8 @@
[test]
working-directory = parts/instance
-eggs = megrok.quarry
- grok
+eggs = grok
recipe = zc.recipe.testrunner
-extra-paths = /root/zope3/src
+extra-paths = /parts/zope3/src
defaults = ['--tests-pattern', '^f?tests$',
'-v'
]
@@ -12,12 +11,12 @@
recipe = zc.recipe.filestorage
[zope3]
-location = /root/zope3
+recipe = zc.recipe.zope3checkout
+url = svn://svn.zope.org/repos/main/Zope3/branches/3.3
[buildout]
-parts = data instance test
+parts = zope3 data instance test
develop = .
- ../grok
[instance]
database = data
@@ -45,7 +44,8 @@
zope.app.intid
zope.app.keyreference
zope.app.twisted
- megrok.quarry-meta
+ zope.contentprovider
grok
grok-meta
-
+ megrok.quarry-meta
+ megrok.quarry
Modified: megrok.quarry/trunk/setup.py
===================================================================
--- megrok.quarry/trunk/setup.py 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/setup.py 2007-05-02 22:38:10 UTC (rev 75031)
@@ -15,6 +15,7 @@
url="",
license="ZPL",
package_dir={'': 'src'},
+ namespace_packages=['megrok'],
packages=find_packages('src'),
include_package_data=True,
zip_safe=False,
Modified: megrok.quarry/trunk/src/megrok/quarry/__init__.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/__init__.py 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/__init__.py 2007-05-02 22:38:10 UTC (rev 75031)
@@ -1,5 +1,5 @@
# this directory is a package
-from directive import layer, template
-from components import Layer, Skin, View
+from directive import layer, template, viewletmanager
+from components import Layer, Skin, View, Viewlet, ViewletManager
Modified: megrok.quarry/trunk/src/megrok/quarry/components.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/components.py 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/components.py 2007-05-02 22:38:10 UTC (rev 75031)
@@ -1,10 +1,13 @@
from zope import interface, component
from zope.publisher.browser import BrowserPage
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.viewlet.manager import ViewletManagerBase
+from zope.viewlet.viewlet import ViewletBase
+from zope.publisher.interfaces.browser import IBrowserView
from zope.publisher.publish import mapply
from grok import util, interfaces, formlib
+import grok
-
class Layer(IDefaultBrowserLayer):
pass
@@ -23,6 +26,7 @@
interface.Interface,
name=self.module_info.package_dotted_name
)
+
@property
def response(self):
@@ -52,6 +56,17 @@
def __getitem__(self, key):
# XXX give nice error message if template is None
return self.template.macros[key]
+
+ def application_obj(self):
+ obj = self.context
+ while obj:
+ if isinstance(obj, grok.Application):
+ return obj
+ obj = obj.__parent__
+ raise ValueErrror("No application found.")
+
+ def application_url(self):
+ return self.url(self.application_obj())
def url(self, obj=None, name=None):
# if the first argument is a string, that's the name. There should
@@ -79,136 +94,136 @@
pass
-# class ViewletManager(ViewletManagerBase):
-# """ A grok.View-like ViewletManager
-# """
+class ViewletManager(ViewletManagerBase):
+ """ A grok.View-like ViewletManager
+ """
-# template = None
+ template = None
-# def __init__(self, context, request, view):
-# super(ViewletManager, self).__init__(context, request, view)
-# self.static = component.queryAdapter(
-# self.request,
-# interface.Interface,
-# name=self.module_info.package_dotted_name
-# )
+ def __init__(self, context, request, view):
+ super(ViewletManager, self).__init__(context, request, view)
+ self.static = component.queryAdapter(
+ self.request,
+ interface.Interface,
+ name=self.module_info.package_dotted_name
+ )
-# def render(self):
-# """See zope.contentprovider.interfaces.IContentProvider"""
-# # Now render the view
-# if self.template:
-# #return self.template(viewlets=self.viewlets)
-# return self._render_template()
-# else:
-# return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
+ def render(self):
+ """See zope.contentprovider.interfaces.IContentProvider"""
+ # Now render the view
+ if self.template:
+ #return self.template(viewlets=self.viewlets)
+ return self._render_template()
+ else:
+ return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
-# @property
-# def response(self):
-# return self.request.response
+ @property
+ def response(self):
+ return self.request.response
-# def _render_template(self):
-# namespace = self.template.pt_getContext()
-# namespace['request'] = self.request
-# namespace['view'] = self
-# namespace['viewlets'] = self.viewlets
-# namespace['static'] = self.static
-# namespace['context'] = self.context
-# # XXX need to check whether we really want to put None here if missing
-# return self.template.pt_render(namespace)
+ def _render_template(self):
+ namespace = self.template.pt_getContext()
+ namespace['request'] = self.request
+ namespace['view'] = self
+ namespace['viewlets'] = self.viewlets
+ namespace['static'] = self.static
+ namespace['context'] = self.context
+ # XXX need to check whether we really want to put None here if missing
+ return self.template.pt_render(namespace)
-# def sort(self, viewlets):
-# # sort by viewlet class name as default
-# return sorted(viewlets, lambda x,y: cmp(x[0], y[0]))
+ def sort(self, viewlets):
+ # sort by viewlet class name as default
+ return sorted(viewlets, lambda x,y: cmp(x[0], y[0]))
-# 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
+ 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 util.url(self.request, obj, name)
+ 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 util.url(self.request, obj, name)
-# def redirect(self, url):
-# return self.request.response.redirect(url)
+ def redirect(self, url):
+ return self.request.response.redirect(url)
-# class Viewlet(ViewletBase):
-# """ A grok.View-like viewlet
-# """
+class Viewlet(ViewletBase):
+ """ A grok.View-like viewlet
+ """
-# def __init__(self, context, request, view, manager):
-# super(Viewlet, self).__init__(context, request, view, manager)
-# self.static = component.queryAdapter(
-# self.request,
-# interface.Interface,
-# name=self.module_info.package_dotted_name
-# )
+ def __init__(self, context, request, view, manager):
+ super(Viewlet, self).__init__(context, request, view, manager)
+ self.static = component.queryAdapter(
+ self.request,
+ interface.Interface,
+ name=self.module_info.package_dotted_name
+ )
-# @property
-# def response(self):
-# return self.request.response
+ @property
+ def response(self):
+ return self.request.response
-# def render(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
+ def render(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()
+ template = getattr(self, 'template', None)
+ if template is not None:
+ return self._render_template()
-# 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 _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 __getitem__(self, key):
+ # XXX give nice error message if template is None
+ return self.template.macros[key]
-# 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
+ 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 util.url(self.request, obj, name)
+ 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 util.url(self.request, obj, name)
-# def redirect(self, url):
-# return self.request.response.redirect(url)
+ def redirect(self, url):
+ return self.request.response.redirect(url)
-# def update(self):
-# pass
+ def update(self):
+ pass
Modified: megrok.quarry/trunk/src/megrok/quarry/configure.zcml
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/configure.zcml 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/configure.zcml 2007-05-02 22:38:10 UTC (rev 75031)
@@ -1 +1,5 @@
-<configure></configure>
\ No newline at end of file
+<configure>
+
+ <include package=".demo" />
+
+</configure>
\ No newline at end of file
Added: megrok.quarry/trunk/src/megrok/quarry/demo/__init__.py
===================================================================
Added: megrok.quarry/trunk/src/megrok/quarry/demo/app.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/demo/app.py 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/demo/app.py 2007-05-02 22:38:10 UTC (rev 75031)
@@ -0,0 +1,94 @@
+import os
+import grok
+from megrok import quarry
+
+class QuarryDemo(grok.Application, grok.Container):
+ pass
+
+
+# access any template in the python path
+
+class Index(quarry.View):
+ quarry.template('megrok.quarry.demo.demoshare.template')
+
+
+
+
+
+
+# skins and layers
+
+class TestLayer(quarry.Layer):
+ pass
+
+
+class Test(quarry.Skin):
+ grok.name('test') # default to this
+ quarry.layer(TestLayer)
+ # accessible as ++skin++test
+
+
+class TestView(quarry.View):
+
+ def render(self):
+ return """<html><body><h1>GROK NO HIDE</h1>
+ Now try http:://yourhost/++skin++test/yourdemo/@@hiddenview
+ </body></html>"""
+
+
+
+
+
+
+# viewlets
+
+class MenuPage(quarry.View):
+ quarry.template('megrok.quarry.demo.app.menu')
+ grok.name('menu')
+
+ title = "Viewlet Test Page"
+
+
+class Menu(quarry.View):
+ """ View class needed when defining inline page templates
+
+ Due to a possible bug or implementation issue,
+ the tal namespace 'provider' only seems to work with
+ grok.PageTemplateFile and grok.PageTemplate or strings.
+ """
+
+menu = grok.PageTemplateFile(os.path.join('menu.pt'))
+
+
+
+class MenuManager(quarry.ViewletManager):
+ grok.context(MenuPage)
+ grok.name('body') #talnamespace 'provider:body'
+
+
+class Menu10(quarry.Viewlet):
+ quarry.viewletmanager(MenuManager)
+
+ def render(self):
+ return "<li>Fish</li>"
+
+
+class Menu20(quarry.Viewlet):
+ quarry.viewletmanager(MenuManager)
+
+ def render(self):
+ return "<li>Stone Soup</li>"
+
+
+class Menu30(quarry.Viewlet):
+ """
+ <li tal:repeat="item view/items">
+ <span tal:replace="item" />
+ </li>
+ """
+ quarry.viewletmanager(MenuManager)
+ quarry.template('megrok.quarry.demo.app.Menu30.__doc__')
+
+ def items(self): #accessible as view/items
+ return ['Buffalo Wings', 'Celery', 'Blue Cheese' ,'Duffs T-shirt']
+
Added: megrok.quarry/trunk/src/megrok/quarry/demo/configure.zcml
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/demo/configure.zcml 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/demo/configure.zcml 2007-05-02 22:38:10 UTC (rev 75031)
@@ -0,0 +1 @@
+<grok package="." xmlns="http://namespaces.zope.org/grok" />
\ No newline at end of file
Added: megrok.quarry/trunk/src/megrok/quarry/demo/demoshare.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/demo/demoshare.py 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/demo/demoshare.py 2007-05-02 22:38:10 UTC (rev 75031)
@@ -0,0 +1,26 @@
+import grok
+from zope import interface
+import os
+
+
+class Template(grok.View):
+ grok.context(interface.Interface)
+
+template = grok.PageTemplate("""
+<html><body>
+<h2>GROK SMASH ZCML!</h2>
+<ul>
+<li><a href="./@@testview">Test Skins & Layers</a></li>
+<li><a href="./@@menu">Viewlet Test Page</a></li>
+</ul>
+</body></html>
+""")
+
+
+
+class Master(grok.View):
+ grok.context(interface.Interface)
+
+
+master = grok.PageTemplateFile(os.path.join('master.pt'))
+
Added: megrok.quarry/trunk/src/megrok/quarry/demo/master.pt
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/demo/master.pt 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/demo/master.pt 2007-05-02 22:38:10 UTC (rev 75031)
@@ -0,0 +1,10 @@
+<html metal:define-macro="page">
+ <head>
+ <title>Master Template</title>
+ </head>
+
+ <body metal:define-slot="body">
+
+ </body>
+
+</html>
\ No newline at end of file
Added: megrok.quarry/trunk/src/megrok/quarry/demo/menu.pt
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/demo/menu.pt 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/demo/menu.pt 2007-05-02 22:38:10 UTC (rev 75031)
@@ -0,0 +1,6 @@
+<html metal:use-macro="context/@@master/page">
+ <body metal:fill-slot="body">
+ <h2 tal:content="view/title|default">Menu</h2>
+ <span tal:replace="structure provider:body" />
+ </body>
+</html>
\ No newline at end of file
Modified: megrok.quarry/trunk/src/megrok/quarry/directive.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/directive.py 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/directive.py 2007-05-02 22:38:10 UTC (rev 75031)
@@ -5,3 +5,7 @@
ClassOrModuleDirectiveContext())
template = SingleTextDirective('quarry.template', ClassDirectiveContext())
+
+
+viewletmanager = InterfaceOrClassDirective('quarry.viewletmanager',
+ ClassDirectiveContext())
Modified: megrok.quarry/trunk/src/megrok/quarry/meta.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/meta.py 2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/meta.py 2007-05-02 22:38:10 UTC (rev 75031)
@@ -3,12 +3,14 @@
from grok import util, components, formlib
from grok.error import GrokError
-from zope.publisher.interfaces.browser import IBrowserSkinType
+from zope.publisher.interfaces.browser import IBrowserSkinType, IDefaultBrowserLayer
+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.dottedname.resolve import resolve
from zope import interface, component
import zope.component.interface
@@ -22,7 +24,7 @@
def register(self, context, name, factory, module_info, templates):
layer = util.class_annotation(factory, 'quarry.layer',
- None) or module_info.getAnnotation('grok.layer',
+ None) or module_info.getAnnotation('quarry.layer',
None) or grok.IDefaultBrowserLayer
name = util.class_annotation(factory, 'grok.name', factory.__name__.lower())
zope.component.interface.provideInterface(name, layer, IBrowserSkinType)
@@ -49,7 +51,7 @@
"template or a custom-supplied one." % factory,
factory)
- # find templates
+ # can't use grok.template
if util.class_annotation(factory, 'grok.template',
None):
raise GrokError(
@@ -65,15 +67,15 @@
if factory_name != template_name:
- # grok.template is being used
+ # quarry.template is being used
if templates.get(factory_name):
raise GrokError("Multiple possible templates for view %r. It "
- "uses grok.template('%s'), but there is also "
+ "uses quarry.template('%s'), but there is also "
"a template called '%s'."
% (factory, template_name, factory_name),
factory)
# no conflicts, lets try and load the template
- # using grok.Template('with.dotted.name')
+ # using quarry.template('with.dotted.name')
try:
factory.template = resolve(template_name)
# accept string and unicode objects, useful if .__doc__ is referenced
@@ -111,8 +113,8 @@
raise GrokError("View %r has no associated template or "
"'render' method." % factory, factory)
- view_layer = util.class_annotation(factory, 'grok.layer',
- None) or module_info.getAnnotation('grok.layer',
+ view_layer = util.class_annotation(factory, 'quarry.layer',
+ None) or module_info.getAnnotation('quarry.layer',
None) or IDefaultBrowserLayer
view_name = util.class_annotation(factory, 'grok.name',
@@ -139,108 +141,226 @@
% (method.__name__, factory), factory)
+class ViewletManagerGrokker(grok.ClassGrokker):
+ component_class = quarry.ViewletManager
+ def register(self, context, name, factory, module_info, templates):
-# class ViewletManagerGrokker(grok.ClassGrokker):
-# component_class = (grok.ViewletManager, grok.OrderedViewletManager)
+ factory.module_info = module_info # to make /static available
+ factory_name = factory.__name__.lower()
+
+ 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)
-# def register(self, context, name, factory, module_info, templates):
+ # can't use grok.template
+ if util.class_annotation(factory, 'grok.template',
+ None):
+ raise GrokError(
+ "%s may not use grok.template, use quarry.template instead."
+ % factory.__name__, factory)
-# factory.module_info = module_info # to make /static available
-# 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
+ # find templates
+ template_name = util.class_annotation(factory, 'quarry.template',
+ factory_name)
+ template = templates.get(template_name)
+
+ if factory_name != template_name:
+ # quarry.template is being used
+ if templates.get(factory_name):
+ raise GrokError("Multiple possible templates for view %r. It "
+ "uses quarry.template('%s'), but there is also "
+ "a template called '%s'."
+ % (factory, template_name, factory_name),
+ factory)
+
+ # no conflicts, lets try and load the template
+ # using quarry.template('with.dotted.name')
+ try:
+ factory.template = resolve(template_name)
+ # accept string and unicode objects, useful if .__doc__ is referenced
+ if isinstance(factory.template, (str, unicode)):
+ factory.template = grok.PageTemplate(factory.template)
+ except ImportError:
+ # verify this is a dotted name
+ if template_name.find('.') >=0:
+ raise GrokError(
+ "'%s' is not importable. Check the path and"
+ "be sure it's a grok.PageTemplate,"
+ "grok.PageTemplateFile, string, or unicode object"
+ % template_name, factory)
+
+
+ # support in-class imports template = grok.PageTemplateFile
+ factory_template = getattr(factory, 'template', None)
-# view_context = util.determine_class_context(factory, context)
-# component.provideAdapter(factory,
-# adapts=(None, # TODO: Make configurable
-# view_layer, # TODO: Make configurable
-# view_context),
-# provides=IViewletManager,
-# name=name)
+ if template:
+ if (getattr(factory, 'render', None) and not
+ util.check_subclass(factory, components.GrokForm) and not
+ util.check_subclass(factory, components.Viewlet)):
+ # we do not accept render and template both for a view
+ # (unless it's a form, they happen to have render.)
+ # Forms currently not implemented in viewlets.
+ raise GrokError(
+ "Multiple possible ways to render view %r. "
+ "It has both a 'render' method as well as "
+ "an associated template." % factory, factory)
+ templates.markAssociated(template_name)
+ factory.template = template
+ elif factory_template and isinstance(factory_template, (components.PageTemplate, components.PageTemplateFile)):
+ pass
+ else:
+ if not getattr(factory, 'render', None):
+ # we do not accept a view without any way to render it
+ raise GrokError("View %r has no associated template or "
+ "'render' method." % factory, factory)
+
+
+
+
+
+
+ name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
+ layer = util.class_annotation(factory, 'quarry.layer',
+ None) or module_info.getAnnotation('quarry.layer',
+ None) or IDefaultBrowserLayer
+
+ view_context = util.determine_class_context(factory, context)
+ component.provideAdapter(factory,
+ adapts=(None, # TODO: Make configurable
+ layer, # TODO: Make configurable
+ view_context),
+ provides=IViewletManager,
+ name=name)
+
-# class ViewletGrokker(grok.ClassGrokker):
-# component_class = grok.Viewlet
+class ViewletGrokker(grok.ClassGrokker):
+ component_class = quarry.Viewlet
-# def register(self, context, name, factory, module_info, templates):
-# # Try to set up permissions (copied from the View grokker)
+ def register(self, context, name, factory, module_info, templates):
+ # Try to set up permissions (copied from the View grokker)
-# factory.module_info = module_info # to make /static available
-# factory_name = factory.__name__.lower()
+ factory.module_info = module_info # to make /static available
+ factory_name = factory.__name__.lower()
-# 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])
+ 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)
+ defineChecker(factory, checker)
+ # can't use grok.template
+ if util.class_annotation(factory, 'grok.template',
+ None):
+ raise GrokError(
+ "%s may not use grok.template, use quarry.template instead."
+ % factory.__name__, factory)
-# # find templates
-# template_name = util.class_annotation(factory, 'grok.template',
-# factory_name)
-# template = templates.get(template_name)
+ # can't use grok.viewletmanager
+ if util.class_annotation(factory, 'grok.viewletmanager',
+ None):
+ raise GrokError(
+ "!!!%s may not use grok.viewletmanager, use quarry.viewletmanager instead."
+ % factory.__name__, factory)
-# if factory_name != template_name:
-# # grok.template is being used
-# if templates.get(factory_name):
-# raise GrokError("Multiple possible templates for view %r. It "
-# "uses grok.template('%s'), but there is also "
-# "a template called '%s'."
-# % (factory, template_name, factory_name),
-# factory)
-# factory_template = getattr(factory,'template', None)
+ # find templates
+ template_name = util.class_annotation(factory, 'quarry.template',
+ factory_name)
+ template = templates.get(template_name)
+
+ if factory_name != template_name:
+ # quarry.template is being used
+ if templates.get(factory_name):
+ raise GrokError("Multiple possible templates for view %r. It "
+ "uses quarry.template('%s'), but there is also "
+ "a template called '%s'."
+ % (factory, template_name, factory_name),
+ factory)
+ # no conflicts, lets try and load the template
+ # using quarry.template('with.dotted.name')
+ try:
+ factory.template = resolve(template_name)
+ # accept string and unicode objects, useful if .__doc__ is referenced
+ if isinstance(factory.template, (str, unicode)):
+ factory.template = grok.PageTemplate(factory.template)
+ except ImportError:
+ # verify this is a dotted name
+ if template_name.find('.') >=0:
+ raise GrokError(
+ "'%s' is not importable. Check the path and"
+ "be sure it's a grok.PageTemplate,"
+ "grok.PageTemplateFile, string, or unicode object"
+ % template_name, factory)
+
+
+ factory_template = getattr(factory,'template', None)
-# if template:
-# if (getattr(factory, 'render', None) and not
-# util.check_subclass(factory, components.GrokForm) and not
-# util.check_subclass(factory, components.Viewlet)):
-# # we do not accept render and template both for a view
-# # (unless it's a form, they happen to have render.)
-# # Forms currently not implemented in viewlets.
-# raise GrokError(
-# "Multiple possible ways to render view %r. "
-# "It has both a 'render' method as well as "
-# "an associated template." % factory, factory)
+ if template:
+ if (getattr(factory, 'render', None) and not
+ util.check_subclass(factory, components.GrokForm) and not
+ util.check_subclass(factory, components.Viewlet)):
+ # we do not accept render and template both for a view
+ # (unless it's a form, they happen to have render.)
+ # Forms currently not implemented in viewlets.
+ raise GrokError(
+ "Multiple possible ways to render view %r. "
+ "It has both a 'render' method as well as "
+ "an associated template." % factory, factory)
-# templates.markAssociated(template_name)
-# factory.template = template
-# elif factory_template and isinstance(factory_template, (components.PageTemplate, components.PageTemplateFile)):
-# pass
-# else:
-# if not getattr(factory, 'render', None):
-# # we do not accept a view without any way to render it
-# raise GrokError("View %r has no associated template or "
-# "'render' method." % factory, factory)
+ templates.markAssociated(template_name)
+ factory.template = template
+ elif factory_template and isinstance(factory_template, (components.PageTemplate, components.PageTemplateFile)):
+ pass
+ else:
+ if not getattr(factory, 'render', None):
+ # we do not accept a view without any way to render it
+ raise GrokError("View %r has no associated template or "
+ "'render' method." % factory, factory)
-# # 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
+ # New directive
+ viewletmanager = grok.util.class_annotation(factory, 'quarry.viewletmanager', [])
+
+ layer = util.class_annotation(factory, 'quarry.layer',
+ None) or module_info.getAnnotation('quarry.layer',
+ None) or IDefaultBrowserLayer
-# component.provideAdapter(factory,
-# adapts=(None, # TODO: Make configurable
-# layer,
-# IBrowserView,
-# viewletmanager),
-# provides=IViewlet,
-# name=name)
+ component.provideAdapter(factory,
+ adapts=(None, # TODO: Make configurable
+ layer,
+ IBrowserView,
+ viewletmanager),
+ provides=IViewlet,
+ name=name)
More information about the Checkins
mailing list