[z3-checkins] r5694 - z3/Five/branch/dc-experiments

dreamcatcher at codespeak.net dreamcatcher at codespeak.net
Mon Jul 26 16:15:55 MEST 2004


Author: dreamcatcher
Date: Mon Jul 26 16:15:54 2004
New Revision: 5694

Modified:
   z3/Five/branch/dc-experiments/browserconfigure.py
Log:

- Remove unneeded import.
- Implement browser:resourceDirectory handler



Modified: z3/Five/branch/dc-experiments/browserconfigure.py
==============================================================================
--- z3/Five/branch/dc-experiments/browserconfigure.py	(original)
+++ z3/Five/branch/dc-experiments/browserconfigure.py	Mon Jul 26 16:15:54 2004
@@ -27,7 +27,7 @@
 
 from resource import FileResourceFactory, ImageResourceFactory
 from resource import PageTemplateResourceFactory
-from viewable import Viewable
+from resource import DirectoryResourceFactory
 from api import BrowserView
 from metaclass import makeClass
 from security import getSecurityInfo, protectClass, initializeClass
@@ -191,6 +191,74 @@
         args = (new_class,)
         )
 
+_rd_map = {ImageResourceFactory:{'prefix':'DirContainedImageResource',
+                                 'count':0},
+           FileResourceFactory:{'prefix':'DirContainedFileResource',
+                                'count':0},
+           PageTemplateResourceFactory:{'prefix':'DirContainedPTResource',
+                                        'count':0},
+           DirectoryResourceFactory:{'prefix':'DirectoryResource',
+                                     'count':0}
+           }
+
+def resourceDirectory(_context, name, directory, layer='default',
+                      permission='zope.Public'):
+
+    if not os.path.isdir(directory):
+        raise ConfigurationError(
+            "Directory %s does not exist" % directory
+            )
+
+    resource = DirectoryResourceFactory.resource
+    f_cache = {}
+    resource_factories = dict(resource.resource_factories)
+    resource_factories['default'] = resource.default_factory
+    for ext, factory in resource_factories.items():
+        if f_cache.get(factory) is not None:
+            continue
+        factory_info = _rd_map.get(factory)
+        factory_info['count'] += 1
+        class_name = '%s%s' % (factory_info['prefix'], factory_info['count'])
+        factory_name = '%s%s' % (factory.__name__, factory_info['count'])
+        f_resource = makeClass(class_name, (factory.resource,), {})
+        f_cache[factory] = makeClass(factory_name, (factory,),
+                                     {'resource':f_resource})
+    for ext, factory in resource_factories.items():
+        resource_factories[ext] = f_cache[factory]
+    default_factory = resource_factories['default']
+    del resource_factories['default']
+
+    cdict = {'resource_factories':resource_factories,
+             'default_factory':default_factory}
+
+    factory_info = _rd_map.get(DirectoryResourceFactory)
+    factory_info['count'] += 1
+    class_name = '%s%s' % (factory_info['prefix'], factory_info['count'])
+    dir_factory = makeClass(class_name, (resource,), cdict)
+    factory = DirectoryResourceFactory(name, directory,
+                                       resource_factory=dir_factory)
+
+    new_classes = [dir_factory,
+                   ] + [f.resource for f in f_cache.values()]
+
+    _context.action(
+        discriminator = ('resource', name, IBrowserRequest, layer),
+        callable = handler,
+        args = (Presentation, 'provideResource',
+                name, IBrowserRequest, factory, layer),
+        )
+    for new_class in new_classes:
+        _context.action(
+            discriminator = ('five:protectClass', new_class),
+            callable = protectClass,
+            args = (new_class, permission)
+            )
+        _context.action(
+            discriminator = ('five:initialize:class', new_class),
+            callable = initializeClass,
+            args = (new_class,)
+            )
+
 #
 # mixin classes / class factories
 #


More information about the z3-checkins mailing list