[Checkins] SVN: grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/ First steps splitting out grok.CodeView

Christian Klinger cklinger at novareto.de
Fri Jul 3 06:26:48 EDT 2009


Log message for revision 101427:
  First steps splitting out grok.CodeView

Changed:
  U   grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/__init__.py
  U   grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/components.py
  U   grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/meta/views.py
  A   grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/view/code_view.py

-=-
Modified: grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/__init__.py
===================================================================
--- grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/__init__.py	2009-07-03 10:22:14 UTC (rev 101426)
+++ grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/__init__.py	2009-07-03 10:26:48 UTC (rev 101427)
@@ -19,7 +19,7 @@
 from zope.publisher.interfaces.browser import IBrowserRequest
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 
-from grokcore.view.components import View
+from grokcore.view.components import View, CodeView
 from grokcore.view.components import PageTemplate, PageTemplateFile
 from grokcore.view.components import DirectoryResource
 from grokcore.view.directive import layer, template, templatedir, skin, path

Modified: grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/components.py
===================================================================
--- grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/components.py	2009-07-03 10:22:14 UTC (rev 101426)
+++ grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/components.py	2009-07-03 10:26:48 UTC (rev 101427)
@@ -31,6 +31,28 @@
 from grokcore.view import interfaces, util
 
 
+class CodeView(BrowserPage):
+    interface.implements(interfaces.IGrokView)
+
+    def __init__(self, context, request):
+        super(CodeView, self).__init__(context, request)
+
+    def __call__(self):
+        mapply(self.update, (), self.request)
+        if self.request.response.getStatus() in (302, 303):
+            # A redirect was triggered somewhere in update().  Don't
+            # continue rendering the template or doing anything else.
+            return
+
+        template = getattr(self, 'template', None)
+        if template is not None:
+            return self._render_template()
+        return mapply(self.render, (), self.request)
+
+    def update(self):
+        pass
+
+
 class View(BrowserPage):
     interface.implements(interfaces.IGrokView)
 

Modified: grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/meta/views.py
===================================================================
--- grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/meta/views.py	2009-07-03 10:22:14 UTC (rev 101426)
+++ grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/meta/views.py	2009-07-03 10:26:48 UTC (rev 101427)
@@ -88,7 +88,62 @@
         templates.checkTemplates(module_info, factory, 'view',
                                  has_render, has_no_render)
 
+class CodeViewGrokker(martian.ClassGrokker):
+    martian.component(components.CodeView)
+    martian.directive(grokcore.component.context)
+    martian.directive(grokcore.view.layer, default=IDefaultBrowserLayer)
+    martian.directive(grokcore.component.name, get_default=default_view_name)
 
+    def grok(self, name, factory, module_info, **kw):
+        # Need to store the module info object on the view class so that it
+        # can look up the 'static' resource directory.
+        factory.module_info = module_info
+        return super(CodeViewGrokker, self).grok(name, factory, module_info, **kw)
+                
+    def execute(self, factory, config, context, layer, name, **kw):
+        # find templates
+        templates = factory.module_info.getAnnotation('grok.templates', None)
+        if templates is not None:
+            config.action(
+                discriminator=None,
+                callable=self.checkTemplates,
+                args=(templates, factory.module_info, factory)
+                )
+
+        # safety belt: make sure that the programmer didn't use
+        # @grok.require on any of the view's methods.
+        methods = util.methods_from_class(factory)
+        for method in methods:
+            if grokcore.security.require.bind().get(method) is not None:
+                raise GrokError('The @grok.require decorator is used for '
+                                'method %r in view %r. It may only be used '
+                                'for XML-RPC methods.'
+                                % (method.__name__, factory), factory)
+
+        # __view_name__ is needed to support IAbsoluteURL on views
+        factory.__view_name__ = name
+        adapts = (context, layer)
+
+        config.action(
+            discriminator=('adapter', adapts, interface.Interface, name),
+            callable=component.provideAdapter,
+            args=(factory, adapts, interface.Interface, name),
+            )
+        return True
+
+    def checkTemplates(self, templates, module_info, factory):
+
+        def has_render(factory):
+            render = getattr(factory, 'render', None)
+            base_method = getattr(render, 'base_method', False)
+            return render and not base_method
+
+        def has_no_render(factory):
+            return not getattr(factory, 'render', None)
+        templates.checkTemplates(module_info, factory, 'view',
+                                 has_render, has_no_render)
+
+
 class ViewSecurityGrokker(martian.ClassGrokker):
     martian.component(components.View)
     martian.directive(grokcore.security.require, name='permission')

Copied: grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/view/code_view.py (from rev 101414, grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/view/view.py)
===================================================================
--- grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/view/code_view.py	                        (rev 0)
+++ grokcore.view/branches/reinout-christian-codeview/src/grokcore/view/tests/view/code_view.py	2009-07-03 10:26:48 UTC (rev 101427)
@@ -0,0 +1,24 @@
+"""
+
+  >>> grok.testing.grok(__name__)
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> from zope.component import getMultiAdapter
+
+  >>> mammoth = Mammoth()
+
+  >>> code_view = getMultiAdapter((mammoth, TestRequest()), name="cavepainting")
+  >>> print code_view()
+  A cave painting of a mammoth
+
+"""
+
+import grokcore.view as grok
+
+class Mammoth(grok.Context):
+    pass
+
+class CavePainting(grok.CodeView):
+
+    def render(self):
+        return 'A cave painting of a mammoth'



More information about the Checkins mailing list