## Script (Python) "kupuInfoForBrains"
##title=Provide dictionaries with information about a list of catalog brains
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=values, linkhere=False, linkparent=False, showimagesize=False
from Products.CMFCore.utils import getToolByName
import AccessControl
from AccessControl import Unauthorized
request = context.REQUEST
response = request.RESPONSE
response.setHeader('Cache-Control', 'no-cache')
types_tool = getToolByName(context, 'portal_types')
kupu_tool = getToolByName(context, 'kupu_library_tool')
url_tool = getToolByName(context, 'portal_url')
uid_catalog = getToolByName(context, 'uid_catalog')
linkbyuid = kupu_tool.getLinkbyuid()
coll_types = kupu_tool.queryPortalTypesForResourceType('collection', ())
preview_action = 'kupupreview'
portal_base = url_tool.getPortalPath()
prefix_length = len(portal_base)+1
# The redirecting url must be absolute otherwise it won't work for
# preview when the page is using portal_factory
# The absolute to relative conversion when the document is saved
# should strip the url right back down to resolveuid/whatever.
base = context.absolute_url()
security = AccessControl.getSecurityManager()
def info_object(obj, allowCollection=True):
'''Get information from a content object'''
# Parent folder might not be accessible if we came here from a
# search.
if not security.checkPermission('View', obj):
return None
try:
id = obj.getId()
portal_type = getattr(obj, 'portal_type','')
collection = allowCollection and portal_type in coll_types
if linkbyuid and not collection and hasattr(obj, 'UID'):
url = base+'/resolveuid/%s' % obj.UID()
else:
url = obj.absolute_url()
icon = "%s/%s" % (context.portal_url(), obj.getIcon())
width = height = size = None
preview = obj.getTypeInfo().getActionById(preview_action, None)
try:
size = context.getObjSize(obj)
except:
size = None
if showimagesize:
width = getattr(obj, 'width', None)
height = getattr(obj, 'height', None)
if callable(width): width = width()
if callable(height): height = height()
title = obj.Title() or obj.getId()
description = obj.Description()
return {'id': id, 'url': url, 'portal_type': portal_type,
'collection': collection, 'icon': icon, 'size': size,
'width': width, 'height': height,
'preview': preview, 'title': title, 'description': description,
}
except Unauthorized:
return None
def info(brain, allowCollection=True):
'''Get information from a brain'''
id = brain.getId
url = brain.getURL()
portal_type = brain.portal_type
collection = portal_type in coll_types
# Path for the uid catalog doesn't have the leading '/'
path = brain.getPath()
UID = None
if path:
metadata = uid_catalog.getMetadataForUID(path[prefix_length:])
if metadata:
UID = metadata.get('UID', None)
if linkbyuid and not collection and UID:
url = base+'/resolveuid/%s' % UID
else:
url = brain.getURL()
icon = "%s/%s" % (context.portal_url(), brain.getIcon)
width = height = size = None
preview = types_tool.getTypeInfo(brain.portal_type).getActionById(preview_action, None)
# It would be nice to do everything from the brain, but
# unfortunately we need to get the object for the preview size.
# XXX Figure out some way to get the image size client side
# instead of inserting it here.
if showimagesize:
obj = brain.getObject()
if hasattr(obj, 'get_size'):
size = context.getObjSize(obj)
width = getattr(obj, 'width', None)
height = getattr(obj, 'height', None)
if callable(width): width = width()
if callable(height): height = height()
title = brain.Title or brain.getId
description = brain.Description
return {'id': id, 'url': url, 'portal_type': portal_type,
'collection': collection, 'icon': icon, 'size': size,
'width': width, 'height': height,
'preview': preview, 'title': title, 'description': description,
}
# For Plone 2.0.5 compatability, if getId is callable we assume
# we have an object rather than a brains.
if values and callable(values[0].getId):
info = info_object
# return [info(brain) for brain in values]
res = []
portal = url_tool.getPortalObject()
if linkhere and portal is not context:
data = info_object(context, False)
if data:
data['label'] = '. (%s)' % context.title_or_id()
res.append(data)
if linkparent:
if portal is not context:
data = info_object(context.aq_parent, True)
if data:
data['label'] = '.. (Parent folder)'
res.append(data)
for obj in values:
data = info(obj, True)
if data:
res.append(data)
return res
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>