[Checkins] SVN: megrok.jinja/trunk/src/megrok/jinja/ A new extension it's added: `ContentProviderExtension`. Now, it's possible to use {{ provider('manager') }}

Santiago Videla santiago.videla at gmail.com
Mon Apr 6 23:31:57 EDT 2009


Log message for revision 98960:
  A new extension it's added: `ContentProviderExtension`. Now, it's possible to use {{ provider('manager') }}
  This is equivalent to <tal:block content="structure provider:manager" /> in zpt
  
  

Changed:
  U   megrok.jinja/trunk/src/megrok/jinja/extensions.py
  U   megrok.jinja/trunk/src/megrok/jinja/factory.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/providers/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/providers/__init__.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers.py
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers_templates/
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers_templates/usingviewlets.jinja
  A   megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers_templates/viewlet.jinja
  U   megrok.jinja/trunk/src/megrok/jinja/ftests/test_functional.py

-=-
Modified: megrok.jinja/trunk/src/megrok/jinja/extensions.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/extensions.py	2009-04-07 02:22:24 UTC (rev 98959)
+++ megrok.jinja/trunk/src/megrok/jinja/extensions.py	2009-04-07 03:31:56 UTC (rev 98960)
@@ -15,8 +15,9 @@
 from jinja2 import nodes
 from jinja2.ext import Extension, InternationalizationExtension
 from jinja2.utils import contextfunction
-from zope.component import getUtility
+from zope.component import getUtility, getMultiAdapter
 from zope.i18n.interfaces import ITranslationDomain, IUserPreferredLanguages
+from zope.contentprovider.interfaces import IContentProvider
 from zope.cachedescriptors import method
 
 class DomainNotDefined(Exception):
@@ -102,3 +103,25 @@
         if variables:
             node = nodes.Mod(node, variables)
         return nodes.Output([node])
+
+class ContentProviderExtension(Extension):
+    """
+    Jinja2 extension to support the use of viewlets (content
+    providers).
+
+    It doesn't define any `tag`, just set the `provider` name function
+    in the `Environment.globals`
+    """
+    def __init__(self, environment):
+        Extension.__init__(self, environment)
+        environment.globals['provider'] = self._get_content_provider
+
+    @contextfunction
+    def _get_content_provider(self, context, name):
+        view = context.resolve('view')
+
+        provider = getMultiAdapter((view.context, view.request, view),
+                                    IContentProvider,
+                                    name=name)
+        provider.update()
+        return provider.render()

Modified: megrok.jinja/trunk/src/megrok/jinja/factory.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/factory.py	2009-04-07 02:22:24 UTC (rev 98959)
+++ megrok.jinja/trunk/src/megrok/jinja/factory.py	2009-04-07 03:31:56 UTC (rev 98960)
@@ -19,14 +19,14 @@
 from grokcore.view.components import GrokTemplate
 from grokcore.view.interfaces import ITemplate, ITemplateFileFactory
 
-from extensions import i18nExtension
+from extensions import i18nExtension, ContentProviderExtension
 
 # Create an Environment instance with the i18n extension
 # and the FileSystemLoader class loader that will look for
 # absolute path templates.
 # By default, auto_reload = True, for production system
 # should be set to False for higher performance
-env = Environment(extensions=[i18nExtension],
+env = Environment(extensions=[i18nExtension, ContentProviderExtension],
                   loader=FileSystemLoader('/'))
 
 env.install_gettext_translations()

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers.py	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers.py	2009-04-07 03:31:56 UTC (rev 98960)
@@ -0,0 +1,37 @@
+"""
+  >>> from zope.publisher.browser import TestRequest
+  >>> from zope.component import getMultiAdapter
+  >>> context = Context()
+  >>> request = TestRequest()
+
+Let's test the viewlets support in Jinja2 templates.
+Instead of <tal:block content="structure provider:manager" />
+we use: {{ provider('manager')}} ::
+
+  >>> view = getMultiAdapter((context, request), name='usingviewlets')
+  >>> print view()
+  Testing megrok.jinja with viewlets support
+  From the view: A view variable
+  From the viewlet: A viewlet variable
+"""
+
+import grok
+
+class Context(grok.Context):
+    pass
+
+class UsingViewlets(grok.View):
+    def update(self):
+        self.something = 'A view variable'
+
+class ViewletMgr(grok.ViewletManager):
+    grok.context(Context)
+    grok.name('manager')
+
+class Viewlet(grok.Viewlet):
+    grok.context(Context)
+    grok.viewletmanager(ViewletMgr)
+
+    def update(self):
+        self.another = 'A viewlet variable'
+

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers_templates/usingviewlets.jinja
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers_templates/usingviewlets.jinja	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers_templates/usingviewlets.jinja	2009-04-07 03:31:56 UTC (rev 98960)
@@ -0,0 +1 @@
+{{ provider('manager') }}
\ No newline at end of file

Added: megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers_templates/viewlet.jinja
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers_templates/viewlet.jinja	                        (rev 0)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/providers/test_providers_templates/viewlet.jinja	2009-04-07 03:31:56 UTC (rev 98960)
@@ -0,0 +1,3 @@
+Testing megrok.jinja with viewlets support
+From the view: {{ view.something }}
+From the viewlet: {{ viewlet.another }}
\ No newline at end of file

Modified: megrok.jinja/trunk/src/megrok/jinja/ftests/test_functional.py
===================================================================
--- megrok.jinja/trunk/src/megrok/jinja/ftests/test_functional.py	2009-04-07 02:22:24 UTC (rev 98959)
+++ megrok.jinja/trunk/src/megrok/jinja/ftests/test_functional.py	2009-04-07 03:31:56 UTC (rev 98960)
@@ -83,7 +83,7 @@
 
 def test_suite():
     suite = unittest.TestSuite()
-    for name in ['module_directory', 'inline', 'i18n']:
+    for name in ['module_directory', 'inline', 'i18n', 'providers']:
         suite.addTest(suiteFromPackage(name))
     return suite
 



More information about the Checkins mailing list