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, ))
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,) )
def makeClassForTemplate(src, template=None, used_for=None, bases=(), cdict=None): # XXX needs to deal with security from the bases? if cdict is None: cdict = {} cdict.update({'index': ViewPageTemplateFile(src, template)}) bases += (ViewMixinForTemplates,) class_ = makeClass("SimpleViewClass from %s" % src, bases, cdict) if used_for is not None: class_.__used_for__ = used_for return class_
def makeClassForTemplate(src, template=None, used_for=None, bases=(), cdict=None): # XXX needs to deal with security from the bases? if cdict is None: cdict = {} cdict.update({'index': ZopeTwoPageTemplateFile(src, template)}) bases += (ViewMixinForTemplates,) class_ = makeClass("SimpleViewClass from %s" % src, bases, cdict) if used_for is not None: class_.__used_for__ = used_for return class_
def resource(_context, name, layer='default', permission='zope.Public', file=None, image=None, template=None): if ((file and image) or (file and template) or (image and template) or not (file or image or template)): raise ConfigurationError( "Must use exactly one of file or image or template" "attributes for resource directives" ) res = file or image or template res_type = ((file and 'file') or (image and 'image') or (template and 'template')) factory_info = _factory_map.get(res_type) factory_info['count'] += 1 res_factory = factory_info['factory'] class_name = '%s%s' % (factory_info['prefix'], factory_info['count']) new_class = makeClass(class_name, (res_factory.resource,), {}) factory = res_factory(name, res, resource_factory=new_class) _context.action( discriminator = ('resource', name, IBrowserRequest, layer), callable = handler, args = (Presentation, 'provideResource', name, IBrowserRequest, factory, layer), ) _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,) )
def _processWidgets(self): if self._widgets: customWidgetsObject = makeClass('CustomWidgetsMixin', (ExtensionClass.Base,), self._widgets) self.bases = self.bases + (customWidgetsObject,)
class view(zope_app_view): def __call__(self): (_context, name, for_, permission, layer, class_, allowed_interface, allowed_attributes) = self.args required = {} cdict = {} pages = {} for pname, attribute, template in self.pages: try: s = getGlobalService(Presentation) except ComponentLookupError, err: pass if template: cdict[pname] = ZopeTwoPageTemplateFile(template) if attribute and attribute != name: cdict[attribute] = cdict[pname] else: if not hasattr(class_, attribute): raise ConfigurationError("Undefined attribute", attribute) attribute = attribute or pname required[pname] = permission pages[pname] = attribute # This should go away, but noone seems to remember what to do. :-( if hasattr(class_, 'publishTraverse'): def publishTraverse(self, request, name, pages=pages, getattr=getattr): if name in pages: return getattr(self, pages[name]) view = zapi.queryView(self, name, request) if view is not None: return view m = class_.publishTraverse.__get__(self) return m(request, name) else: def publishTraverse(self, request, name, pages=pages, getattr=getattr): if name in pages: return getattr(self, pages[name]) view = zapi.queryView(self, name, request) if view is not None: return view raise NotFoundError(self, name, request) cdict['publishTraverse'] = publishTraverse if not hasattr(class_, 'browserDefault'): if self.default or self.pages: default = self.default or self.pages[0][0] cdict['browserDefault'] = ( lambda self, request, default=default: (self, (default, )) ) elif providesCallable(class_): cdict['browserDefault'] = ( lambda self, request: (self, ()) ) if class_ is not None: bases = (class_, ViewMixinForTemplates) else: bases = (ViewMixinForTemplates) try: cname = str(name) except: cname = "GeneratedClass" newclass = makeClass(cname, bases, cdict) _handle_for(_context, for_) if self.provides is not None: _context.action( discriminator = None, callable = provideInterface, args = ('', self.provides) ) _context.action( discriminator = ('view', for_, name, IBrowserRequest, layer, self.provides), callable = handler, args = (Presentation, 'provideAdapter', IBrowserRequest, newclass, name, [for_], self.provides, layer, _context.info), )
if attribute != '__call__': if not hasattr(class_, attribute): raise ConfigurationError( "The provided class doesn't have the specified attribute " ) cdict = getSecurityInfo(class_) if template: new_class = makeClassForTemplate(template, bases=(class_, ), cdict=cdict) elif attribute != "__call__": # we're supposed to make a page for an attribute (read: # method) and it's not __call__. We thus need to create a # new class using our mixin for attributes. cdict.update({'__page_attribute__': attribute}) new_class = makeClass(class_.__name__, (class_, ViewMixinForAttributes), cdict) # in case the attribute does not provide a docstring, # ZPublisher refuses to publish it. So, as a workaround, # we provide a stub docstring func = getattr(new_class, attribute) if not func.__doc__: # cannot test for MethodType/UnboundMethod here # because of ExtensionClass if hasattr(func, 'im_func'): # you can only set a docstring on functions, not # on method objects func = func.im_func func.__doc__ = "Stub docstring to make ZPublisher work" else: