[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