[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