[Checkins] SVN: five.grok/branches/sylvain-viewlets/src/five/grok/components.py Add some code to render viewlets.
Sylvain Viollon
sylvain at infrae.com
Wed Oct 8 09:28:11 EDT 2008
Log message for revision 91903:
Add some code to render viewlets.
Changed:
U five.grok/branches/sylvain-viewlets/src/five/grok/components.py
-=-
Modified: five.grok/branches/sylvain-viewlets/src/five/grok/components.py
===================================================================
--- five.grok/branches/sylvain-viewlets/src/five/grok/components.py 2008-10-08 09:30:09 UTC (rev 91902)
+++ five.grok/branches/sylvain-viewlets/src/five/grok/components.py 2008-10-08 13:28:09 UTC (rev 91903)
@@ -1,7 +1,8 @@
import martian
from zope.annotation.interfaces import IAttributeAnnotatable
-from zope.contentprovider.interfaces import IContentProvider
+from zope.viewlet.interfaces import IViewletManager
+from zope.security.interfaces import IPermission
from zope.app.pagetemplate.viewpagetemplatefile import ViewMapper
from zope import interface, component
@@ -10,15 +11,19 @@
from grokcore.formlib.components import default_display_template, default_form_template
from grokcore.view.components import PageTemplate
import grokcore.view
+import grokcore.security
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile \
as BaseViewPageTemplateFile
from Products.Five.browser.pagetemplatefile import getEngine
from Products.Five.browser import resource
from Products.Five.formlib import formbase
+from Products.Five.viewlet.manager import ViewletManagerBase
from Products.PageTemplates.Expressions import SecureModuleImporter
from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
from OFS.SimpleItem import SimpleItem
+
+from AccessControl import getSecurityManager
import Acquisition
@@ -202,19 +207,59 @@
return namespace
-class ViewletManager(ContentProviderBase):
+class ViewletManager(ContentProviderBase, ViewletManagerBase):
- interface.implements(IContentProvider)
+ interface.implements(IViewletManager)
martian.baseclass()
+ def __init__(self, context, request, view):
+ ContentProviderBase.__init__(self, context, request, view)
+ ViewletManagerBase.__init__(self, context, request, view)
+
def default_namespace(self):
namespace = super(ViewletManager, self).default_namespace()
namespace['viewletmanager'] = self
return namespace
- def update(self):
- pass
+ def sort(self, viewlets):
+ s_viewlets = []
+ for name, viewlet in viewlets:
+ viewlet.__viewlet_name__ = name
+ s_viewlets.append(viewlet)
+ def sort_key(viewlet):
+ # If components have a grok.order directive, sort by that.
+ #explicit_order, implicit_order = silvaconf.order.bind().get(viewlet)
+ return (viewlet.__module__,
+ viewlet.__class__.__name__)
+ s_viewlets = sorted(s_viewlets, key=sort_key)
+ return [(viewlet.__viewlet_name__, viewlet) for viewlet in s_viewlets]
+
+ def filter(self, viewlets):
+ # Wrap viewlet in aquisition, and only return viewlets
+ # accessible to the user.
+ parent = self.aq_parent
+ security_manager = getSecurityManager()
+
+ def checkPermission(viewlet):
+ _, viewlet = viewlet
+ # Unfortuanetly, we don't have easy way to check the permission.
+ permission = grokcore.security.require.bind().get(viewlet)
+ if (permission is None) or (permission == 'zope.Public'):
+ return True
+ if isinstance(permission, str):
+ permission = component.getUtility(IPermission, permission)
+ return security_manager.checkPermission(permission.title, viewlet)
+
+ return filter(checkPermission,
+ [(name, viewlet.__of__(parent)) for name, viewlet in viewlets])
+
def render(self):
- return self.template.render(self)
+ """See zope.contentprovider.interfaces.IContentProvider"""
+ # Now render the view
+ if self.template:
+ return self.template.render(self)
+ else:
+ return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
+
More information about the Checkins
mailing list