from Products.Archetypes import Widget from Products.Archetypes.Widget import TypesWidget from Products.Archetypes.Registry import registerWidget from Products.CMFCore.utils import getToolByName __all__ = ('CategoryTreeWidget',) class CategoryTreeWidget(TypesWidget): _properties = TypesWidget._properties.copy() _properties.update({ 'macro' : "widget_categorytree", 'addable' : 0, # create createObject link for every addable type 'destination' : None, # may be name of method on instance or string. # destination is relative to portal # root 'tree': ''# Path to base of tree object. relative to portal root }) def addableTypes(self, instance, field): """Returns a dictionary which maps portal_type to its human readable form.""" tool = instance.portal_types value = {} for typeid in field.allowed_types: info = tool.getTypeInfo(typeid) if info is None: raise ValueError, 'No such portal type: %s' % typeid value[typeid] = info.Title() return value def getDestination(self, instance): if not self.destination: purl = getToolByName(instance, 'portal_url') return purl.getRelativeUrl(aq_parent(instance)) else: value = getattr(aq_base(instance), self.destination, self.destination) if callable(value): value = value() return value def getPaths(self, instance, field): return [s.getTranslatedPath() for s in field.get(instance) if s ] registerWidget( CategoryTreeWidget, title='Category tree', description=('Renders a popup window for multiple selection from a list'), used_for=('Products.Archetypes.Field.ReferenceField',) )