[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