[Checkins] SVN: grokcore.view/trunk/src/grokcore/view/ Split up the view grokking process into two grokkers

Philipp von Weitershausen philikon at philikon.de
Sat Jul 19 22:21:10 EDT 2008


Log message for revision 88630:
  Split up the view grokking process into two grokkers
  * 1st one registers the view as an adapter
  * 2nd one does security declarations
  
  This is much saner and more easily extensible than a base class for view grokkers.
  five.grok should now simply write its own ViewSecurityGrokker. It doesn't even have
  to disable the one from grokcore.view. Who cares if there's a Zope 3-style checker
  defined for Five views since they're not used in Zope 2 anyway.
  
  

Changed:
  U   grokcore.view/trunk/src/grokcore/view/meta.py
  U   grokcore.view/trunk/src/grokcore/view/testing.py
  D   grokcore.view/trunk/src/grokcore/view/tests/meta.py
  U   grokcore.view/trunk/src/grokcore/view/util.py

-=-
Modified: grokcore.view/trunk/src/grokcore/view/meta.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/meta.py	2008-07-20 02:08:27 UTC (rev 88629)
+++ grokcore.view/trunk/src/grokcore/view/meta.py	2008-07-20 02:21:06 UTC (rev 88630)
@@ -16,6 +16,7 @@
 from grokcore.view import templatereg
 from grokcore.view.util import default_view_name
 from grokcore.view.util import default_fallback_to_name
+from grokcore.view.util import make_checker
 
 
 class SkinGrokker(martian.ClassGrokker):
@@ -31,20 +32,20 @@
         return True
 
 
-class ViewGrokkerBase(martian.ClassGrokker):
+class ViewGrokker(martian.ClassGrokker):
+    martian.component(grokcore.view.View)
     martian.directive(grokcore.component.context)
     martian.directive(grokcore.view.layer, default=IDefaultBrowserLayer)
     martian.directive(grokcore.component.name, get_default=default_view_name)
-    martian.directive(grokcore.view.require, name='permission')
 
     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(ViewGrokkerBase, self).grok(name, factory, module_info,
+        return super(ViewGrokker, self).grok(name, factory, module_info,
             **kw)
 
-    def execute(self, factory, config, context, layer, name, permission, **kw):
+    def execute(self, factory, config, context, layer, name, **kw):
         if util.check_subclass(factory, components.GrokForm):
             # setup form_fields from context class if we've encountered a form
             if getattr(factory, 'form_fields', None) is None:
@@ -84,9 +85,6 @@
             callable=component.provideAdapter,
             args=(factory, adapts, interface.Interface, name),
             )
-
-        self.protectName(config, factory, permission)
-
         return True
 
     def checkTemplates(self, templates, module_info, factory):
@@ -104,6 +102,21 @@
         raise NotImplementedError
 
 
+class ViewSecurityGrokker(martian.ClassGrokker):
+    martian.component(grokcore.view.View)
+    martian.directive(grokcore.view.require, name='permission')
+
+    def execute(self, factory, config, permission, **kw):
+        config.action(
+            # TODO For pure Zope 3 we need to protect the whole
+            # IBrowserPage interface, not just __call__
+            discriminator=('protectName', factory, '__call__'),
+            callable=make_checker,
+            args=(factory, factory, permission),
+            )
+        return True
+
+
 class PermissionGrokker(martian.ClassGrokker):
     martian.component(grokcore.view.Permission)
     martian.priority(1500)

Modified: grokcore.view/trunk/src/grokcore/view/testing.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/testing.py	2008-07-20 02:08:27 UTC (rev 88629)
+++ grokcore.view/trunk/src/grokcore/view/testing.py	2008-07-20 02:21:06 UTC (rev 88630)
@@ -10,7 +10,6 @@
     zcml.do_grok('grokcore.component.meta', config)
     zcml.do_grok('grokcore.view.meta', config)
     zcml.do_grok('grokcore.view.templatereg', config)
-    zcml.do_grok('grokcore.view.tests.meta', config)
     zcml.do_grok(module_name, config)
     config.execute_actions()
 

Deleted: grokcore.view/trunk/src/grokcore/view/tests/meta.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/tests/meta.py	2008-07-20 02:08:27 UTC (rev 88629)
+++ grokcore.view/trunk/src/grokcore/view/tests/meta.py	2008-07-20 02:21:06 UTC (rev 88630)
@@ -1,50 +0,0 @@
-from zope import component
-from zope.security.checker import NamesChecker, defineChecker
-from zope.security.interfaces import IPermission
-
-import martian
-from martian.error import GrokError
-
-from grokcore.view.meta import ViewGrokkerBase
-import grokcore.view
-
-
-def make_checker(factory, view_factory, permission, method_names=None):
-    """Make a checker for a view_factory associated with factory.
-
-    These could be one and the same for normal views, or different
-    in case we make method-based views such as for JSON and XMLRPC.
-    """
-
-    if method_names is None:
-        method_names = ['__call__']
-    if permission is not None:
-        check_permission(factory, permission)
-    if permission is None or permission == 'zope.Public':
-        checker = NamesChecker(method_names)
-    else:
-        checker = NamesChecker(method_names, permission)
-    defineChecker(view_factory, checker)
-
-
-def check_permission(factory, permission):
-    """Check whether a permission is defined.
-
-    If not, raise error for factory.
-    """
-    if component.queryUtility(IPermission,
-                              name=permission) is None:
-        raise GrokError('Undefined permission %r in %r. Use '
-                        'grok.Permission first.'
-                        % (permission, factory), factory)
-
-
-class ViewGrokker(ViewGrokkerBase):
-    martian.component(grokcore.view.View)
-
-    def protectName(self, config, factory, permission):
-        config.action(
-            discriminator=('protectName', factory, '__call__'),
-            callable=make_checker,
-            args=(factory, factory, permission),
-            )

Modified: grokcore.view/trunk/src/grokcore/view/util.py
===================================================================
--- grokcore.view/trunk/src/grokcore/view/util.py	2008-07-20 02:08:27 UTC (rev 88629)
+++ grokcore.view/trunk/src/grokcore/view/util.py	2008-07-20 02:21:06 UTC (rev 88630)
@@ -3,8 +3,12 @@
 from zope import component
 from zope.traversing.browser.interfaces import IAbsoluteURL
 from zope.traversing.browser.absoluteurl import _safe as SAFE_URL_CHARACTERS
+from zope.security.checker import NamesChecker, defineChecker
+from zope.security.interfaces import IPermission
 
+from martian.error import GrokError
 
+
 def url(request, obj, name=None, data={}):
     url = component.getMultiAdapter((obj, request), IAbsoluteURL)()
     if name is not None:
@@ -26,3 +30,31 @@
 
 def default_fallback_to_name(factory, module, name, **data):
     return name
+
+def make_checker(factory, view_factory, permission, method_names=None):
+    """Make a checker for a view_factory associated with factory.
+
+    These could be one and the same for normal views, or different
+    in case we make method-based views such as for JSON and XMLRPC.
+    """
+    if method_names is None:
+        method_names = ['__call__']
+    if permission is not None:
+        check_permission(factory, permission)
+    if permission is None or permission == 'zope.Public':
+        checker = NamesChecker(method_names)
+    else:
+        checker = NamesChecker(method_names, permission)
+    defineChecker(view_factory, checker)
+
+def check_permission(factory, permission):
+    """Check whether a permission is defined.
+
+    If not, raise error for factory.
+    """
+    if component.queryUtility(IPermission,
+                              name=permission) is None:
+        raise GrokError('Undefined permission %r in %r. Use '
+                        'grok.Permission first.'
+                        % (permission, factory), factory)
+



More information about the Checkins mailing list