[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