Source code for grokcore.viewlet.components
##############################################################################
#
# Copyright (c) 2006-2007 Zope Foundation 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.
#
##############################################################################
"""Grok components"""
from operator import itemgetter
from zope import component
from zope import interface
from zope.viewlet.manager import ViewletManagerBase
from zope.viewlet.viewlet import ViewletBase
from grokcore.viewlet import interfaces
from grokcore.viewlet import util
[docs]
@interface.implementer(interfaces.IViewletManager)
class ViewletManager(ViewletManagerBase):
template = None
def __init__(self, context, request, view):
super().__init__(context, request, view)
self.context = context
self.request = request
self.view = view
self.__name__ = self.__view_name__
static_name = getattr(self, '__static_name__', None)
if static_name is not None:
self.static = component.queryAdapter(
self.request,
interface.Interface,
name=static_name)
else:
self.static = None
def sort(self, viewlets):
"""Sort the viewlets.
``viewlets`` is a list of tuples of the form (name, viewlet).
"""
# Sort viewlets following grok.order rule.
return util.sort_components(viewlets, key=itemgetter(1))
[docs]
def default_namespace(self):
namespace = {}
namespace['context'] = self.context
namespace['request'] = self.request
namespace['static'] = self.static
namespace['view'] = self.view
namespace['viewletmanager'] = self
return namespace
[docs]
def namespace(self):
return {}
[docs]
def update(self):
super().update()
# Filter out the unavailable viewlets *after* the viewlet's update()
# has been called.
self.viewlets = [v for v in self.viewlets if v.available()]
[docs]
def render(self):
"""See zope.contentprovider.interfaces.IContentProvider"""
# Now render the view
if self.template:
return self.template.render(self)
else:
return '\n'.join([viewlet.render() for viewlet in self.viewlets])
# Mark the render() method as a method from the base class. That
# way we can detect whether somebody overrides render() in a subclass.
render.base_method = True
[docs]
class Viewlet(ViewletBase):
"""Batteries included viewlet.
"""
def __init__(self, context, request, view, manager):
super().__init__(context, request, view, manager)
self.context = context
self.request = request
self.view = view
self.viewletmanager = manager
self.__name__ = self.__view_name__
static_name = getattr(self, '__static_name__', None)
if static_name is not None:
self.static = component.queryAdapter(
self.request,
interface.Interface,
name=static_name)
else:
self.static = None
[docs]
def default_namespace(self):
namespace = {}
namespace['context'] = self.context
namespace['request'] = self.request
namespace['static'] = self.static
namespace['view'] = self.view
namespace['viewlet'] = self
namespace['viewletmanager'] = self.manager
return namespace
[docs]
def namespace(self):
return {}
[docs]
def available(self):
"""Return True if this viewlet is to be rendered. False otherwise.
Note that the available() method is called *after* update() but
*before* render() has been called.
"""
return True
[docs]
def render(self):
return self.template.render(self)
# Mark the render() method as a method from the base class. That
# way we can detect whether somebody overrides render() in a subclass.
render.base_method = True