[Checkins] SVN: five.grok/branches/sylvain-viewlets/src/five/grok/ Adding a simple content provider "viewletmanager to be later".
Sylvain Viollon
sylvain at infrae.com
Mon Oct 6 11:14:06 EDT 2008
Log message for revision 91811:
Adding a simple content provider "viewletmanager to be later".
Changed:
U five.grok/branches/sylvain-viewlets/src/five/grok/__init__.py
U five.grok/branches/sylvain-viewlets/src/five/grok/components.py
A five.grok/branches/sylvain-viewlets/src/five/grok/directives.py
U five.grok/branches/sylvain-viewlets/src/five/grok/meta.py
-=-
Modified: five.grok/branches/sylvain-viewlets/src/five/grok/__init__.py
===================================================================
--- five.grok/branches/sylvain-viewlets/src/five/grok/__init__.py 2008-10-06 14:07:04 UTC (rev 91810)
+++ five.grok/branches/sylvain-viewlets/src/five/grok/__init__.py 2008-10-06 15:14:05 UTC (rev 91811)
@@ -4,7 +4,10 @@
from grokcore.formlib import *
from five.grok.components import View, Model, Form, AddForm, EditForm, DisplayForm
+from five.grok.components import ViewletManager
+from five.grok.directives import view
+
# Override the one from grokcore.view so that we get Zope 2 semantics
from five.grok.components import ZopeTwoPageTemplate as PageTemplate
Modified: five.grok/branches/sylvain-viewlets/src/five/grok/components.py
===================================================================
--- five.grok/branches/sylvain-viewlets/src/five/grok/components.py 2008-10-06 14:07:04 UTC (rev 91810)
+++ five.grok/branches/sylvain-viewlets/src/five/grok/components.py 2008-10-06 15:14:05 UTC (rev 91811)
@@ -1,6 +1,7 @@
import martian
from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.contentprovider.interfaces import IContentProvider
from zope.app.pagetemplate.viewpagetemplatefile import ViewMapper
from zope import interface, component
@@ -167,3 +168,53 @@
martian.baseclass()
template = default_display_template
+
+
+# Content provider/viewlets
+
+class ContentProviderBase(Acquisition.Explicit):
+
+ martian.baseclass()
+
+ def __init__(self, context, request, view):
+ self.context = context
+ self.request = request
+ self.view = view
+ static = component.queryAdapter(
+ self.request, interface.Interface,
+ name = self.module_info.package_dotted_name)
+ if not (static is None):
+ self.static = static.__of__(self)
+ else:
+ self.static = static
+ self.__parent__ = view
+ self.__name__ = self.__view_name__
+
+ getPhysicalPath = Acquisition.Acquired
+
+ def namespace(self):
+ return {}
+
+ def default_namespace(self):
+ namespace = {}
+ namespace['view'] = self.view
+ namespace['static'] = self.static
+ return namespace
+
+
+class ViewletManager(ContentProviderBase):
+
+ interface.implements(IContentProvider)
+
+ martian.baseclass()
+
+ def default_namespace(self):
+ namespace = super(ContentProvider, self).default_namespace()
+ namespace['provider'] = self
+ return namespace
+
+ def update(self):
+ pass
+
+ def render(self):
+ return self.template.render(self)
Added: five.grok/branches/sylvain-viewlets/src/five/grok/directives.py
===================================================================
--- five.grok/branches/sylvain-viewlets/src/five/grok/directives.py (rev 0)
+++ five.grok/branches/sylvain-viewlets/src/five/grok/directives.py 2008-10-06 15:14:05 UTC (rev 91811)
@@ -0,0 +1,8 @@
+
+import martian
+
+class view(martian.Directive):
+ scope = martian.CLASS_OR_MODULE
+ store = martian.ONCE
+ default = None
+ validate = martian.validateInterfaceOrClass
Modified: five.grok/branches/sylvain-viewlets/src/five/grok/meta.py
===================================================================
--- five.grok/branches/sylvain-viewlets/src/five/grok/meta.py 2008-10-06 14:07:04 UTC (rev 91810)
+++ five.grok/branches/sylvain-viewlets/src/five/grok/meta.py 2008-10-06 15:14:05 UTC (rev 91811)
@@ -2,12 +2,17 @@
import martian
import five.grok
import grokcore.security
+import grokcore.view
+import grokcore.component
from zope import interface, component
+from zope.contentprovider.interfaces import IContentProvider
from zope.publisher.interfaces.browser import IDefaultBrowserLayer
from five.grok import components
from martian.error import GrokError
+from grokcore.view.meta.views import default_view_name
+
from Products.Five.security import protectClass
from Globals import InitializeClass as initializeClass
@@ -73,4 +78,53 @@
)
return True
- return False
\ No newline at end of file
+ return False
+
+
+class ViewletManagerGrokker(martian.ClassGrokker):
+
+ martian.component(components.ViewletManager)
+ martian.directive(grokcore.component.name, get_default=default_view_name)
+ martian.directive(grokcore.component.context)
+ martian.directive(grokcore.view.layer)
+ martian.directive(five.grok.view)
+
+ def grok(self, name, provider, module_info, **kw):
+ # Store module_info on the object.
+ provider.__view_name__ = name
+ provider.module_info = module_info
+ return super(ViewletManagerGrokker, self).grok(
+ name, provider, module_info, **kw)
+
+ def execute(self, provider, name, context, view, layer, config, **kw):
+ """Register a content provider.
+ """
+
+ if view is None:
+ # Can't set default on the directive because of import loop.
+ view = interface.Interface
+
+ templates = provider.module_info.getAnnotation('grok.templates', None)
+ if templates is not None:
+ config.action(
+ discriminator=None,
+ callable=self.checkTemplates,
+ args=(templates, provider.module_info, provider)
+ )
+
+ for_ = (context, layer, view,)
+ config.action(
+ discriminator=('adapter', for_, IContentProvider, name),
+ callable=component.provideAdapter,
+ args=(provider, for_, IContentProvider, name),
+ )
+
+ return True
+
+ def checkTemplates(self, templates, module_info, provider):
+ def has_render(provider):
+ return provider.render != components.ViewletManager.render
+ def has_no_render(provider):
+ return not has_render(provider)
+ templates.checkTemplates(module_info, provider, 'contentprovider',
+ has_render, has_no_render)
More information about the Checkins
mailing list