[Checkins] SVN: Sandbox/pcardune/z3c.mvc/src/z3c/mvc/ do error checking for dependency injection.
Paul Carduner
paulcarduner at gmail.com
Wed Feb 11 21:49:47 EST 2009
Log message for revision 96458:
do error checking for dependency injection.
Changed:
U Sandbox/pcardune/z3c.mvc/src/z3c/mvc/controller.py
U Sandbox/pcardune/z3c.mvc/src/z3c/mvc/zcml.py
-=-
Modified: Sandbox/pcardune/z3c.mvc/src/z3c/mvc/controller.py
===================================================================
--- Sandbox/pcardune/z3c.mvc/src/z3c/mvc/controller.py 2009-02-12 02:04:33 UTC (rev 96457)
+++ Sandbox/pcardune/z3c.mvc/src/z3c/mvc/controller.py 2009-02-12 02:49:46 UTC (rev 96458)
@@ -17,7 +17,7 @@
"""
__docformat__ = 'restructuredtext'
-
+import sys
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
from zope.component import getMultiAdapter
from zope.interface import implements
@@ -33,6 +33,8 @@
"""
implements(interfaces.IModelProvider)
+ __required_kwargs__ = ()
+
def getModel(self):
raise NotImplemented("Subclasses must provide the getModel method")
@@ -43,3 +45,10 @@
(self, self.request), interfaces.IModelTemplate)
return template(self)
return self.template()
+
+def requires(*attributes):
+ frame = sys._getframe(1)
+ locals = frame.f_locals
+ locals.setdefault('__required_kwargs__', ())
+ locals['__required_kwargs__'] += attributes
+
Modified: Sandbox/pcardune/z3c.mvc/src/z3c/mvc/zcml.py
===================================================================
--- Sandbox/pcardune/z3c.mvc/src/z3c/mvc/zcml.py 2009-02-12 02:04:33 UTC (rev 96457)
+++ Sandbox/pcardune/z3c.mvc/src/z3c/mvc/zcml.py 2009-02-12 02:49:46 UTC (rev 96458)
@@ -62,14 +62,78 @@
for key, value in kwargs.items():
kwargs[key] = globalObject.fromUnicode(value)
- pageletDirective(_context, class_, name, permission, for_=for_,
- layer=layer, provides=IPagelet,
- allowed_interface=None, allowed_attributes=None, **kwargs)
-
if view is not None:
viewDirective(_context, view, controller=class_, layer=layer)
+
+
+ provides=IPagelet
+ allowed_interface=None
+ allowed_attributes=None
+
+ # Security map dictionary
+ required = {}
+
+ # Get the permission; mainly to correctly handle CheckerPublic.
+ permission = viewmeta._handle_permission(_context, permission)
+
+ # The class must be specified.
+ if not class_:
+ raise ConfigurationError("Must specify a class.")
+
+ if not zope.interface.interfaces.IInterface.providedBy(provides):
+ raise ConfigurationError("Provides interface provide IInterface.")
+
+ ifaces = list(zope.interface.Declaration(provides).flattened())
+ if IPagelet not in ifaces:
+ raise ConfigurationError("Provides interface must inherit IPagelet.")
+
+ # Build a new class that we can use different permission settings if we
+ # use the class more then once.
+ cdict = {}
+ cdict['__name__'] = name
+ missing = []
+ if class_.__required_kwargs__:
+ for kwarg in class_.__required_kwargs__:
+ if kwarg not in kwargs.keys():
+ missing.append(kwarg)
+ if missing:
+ raise ConfigurationError("Controller requires the following "
+ "attributes to be set: %s"%', '.join(missing))
+ cdict.update(kwargs)
+ new_class = type(class_.__name__, (class_, BrowserPagelet), cdict)
+
+ # Set up permission mapping for various accessible attributes
+ viewmeta._handle_allowed_interface(
+ _context, allowed_interface, permission, required)
+ viewmeta._handle_allowed_attributes(
+ _context, allowed_attributes, permission, required)
+ viewmeta._handle_allowed_attributes(
+ _context, kwargs.keys(), permission, required)
+ viewmeta._handle_allowed_attributes(
+ _context, ('__call__', 'browserDefault', 'update', 'render',
+ 'publishTraverse'), permission, required)
+
+ # Register the interfaces.
+ viewmeta._handle_for(_context, for_)
+
+ # provide the custom provides interface if not allready provided
+ if not provides.implementedBy(new_class):
+ zope.interface.classImplements(new_class, provides)
+
+ # Create the security checker for the new class
+ zope.security.checker.defineChecker(new_class,
+ zope.security.checker.Checker(required))
+
+ # register pagelet
+ _context.action(
+ discriminator = ('pagelet', for_, layer, name),
+ callable = zope.component.zcml.handler,
+ args = ('registerAdapter',
+ new_class, (for_, layer), provides, name, _context.info),)
+
+
class IViewDirective(zope.interface.Interface):
view = zope.configuration.fields.Path(
More information about the Checkins
mailing list