Annotation of kupuMPIWG/plone/kupu_plone_layer/kupuInfoForBrains.py, revision 1.1
1.1 ! dwinter 1: ## Script (Python) "kupuInfoForBrains"
! 2: ##title=Provide dictionaries with information about a list of catalog brains
! 3: ##bind container=container
! 4: ##bind context=context
! 5: ##bind namespace=
! 6: ##bind script=script
! 7: ##bind subpath=traverse_subpath
! 8: ##parameters=values, linkhere=False, linkparent=False, showimagesize=False
! 9: from Products.CMFCore.utils import getToolByName
! 10: import AccessControl
! 11: from AccessControl import Unauthorized
! 12:
! 13: request = context.REQUEST
! 14: response = request.RESPONSE
! 15: response.setHeader('Cache-Control', 'no-cache')
! 16:
! 17: types_tool = getToolByName(context, 'portal_types')
! 18: kupu_tool = getToolByName(context, 'kupu_library_tool')
! 19: url_tool = getToolByName(context, 'portal_url')
! 20: uid_catalog = getToolByName(context, 'uid_catalog')
! 21: linkbyuid = kupu_tool.getLinkbyuid()
! 22: coll_types = kupu_tool.queryPortalTypesForResourceType('collection', ())
! 23: preview_action = 'kupupreview'
! 24: portal_base = url_tool.getPortalPath()
! 25: prefix_length = len(portal_base)+1
! 26:
! 27: # The redirecting url must be absolute otherwise it won't work for
! 28: # preview when the page is using portal_factory
! 29: # The absolute to relative conversion when the document is saved
! 30: # should strip the url right back down to resolveuid/whatever.
! 31: base = context.absolute_url()
! 32: security = AccessControl.getSecurityManager()
! 33:
! 34: def info_object(obj, allowCollection=True):
! 35: '''Get information from a content object'''
! 36:
! 37: # Parent folder might not be accessible if we came here from a
! 38: # search.
! 39: if not security.checkPermission('View', obj):
! 40: return None
! 41:
! 42: try:
! 43: id = obj.getId()
! 44: portal_type = getattr(obj, 'portal_type','')
! 45: collection = allowCollection and portal_type in coll_types
! 46:
! 47: if linkbyuid and not collection and hasattr(obj, 'UID'):
! 48: url = base+'/resolveuid/%s' % obj.UID()
! 49: else:
! 50: url = obj.absolute_url()
! 51:
! 52: icon = "%s/%s" % (context.portal_url(), obj.getIcon())
! 53: width = height = size = None
! 54: preview = obj.getTypeInfo().getActionById(preview_action, None)
! 55:
! 56: try:
! 57: size = context.getObjSize(obj)
! 58: except:
! 59: size = None
! 60:
! 61: if showimagesize:
! 62: width = getattr(obj, 'width', None)
! 63: height = getattr(obj, 'height', None)
! 64: if callable(width): width = width()
! 65: if callable(height): height = height()
! 66:
! 67: title = obj.Title() or obj.getId()
! 68: description = obj.Description()
! 69:
! 70: return {'id': id, 'url': url, 'portal_type': portal_type,
! 71: 'collection': collection, 'icon': icon, 'size': size,
! 72: 'width': width, 'height': height,
! 73: 'preview': preview, 'title': title, 'description': description,
! 74: }
! 75: except Unauthorized:
! 76: return None
! 77:
! 78: def info(brain, allowCollection=True):
! 79: '''Get information from a brain'''
! 80: id = brain.getId
! 81:
! 82: url = brain.getURL()
! 83: portal_type = brain.portal_type
! 84: collection = portal_type in coll_types
! 85:
! 86: # Path for the uid catalog doesn't have the leading '/'
! 87: path = brain.getPath()
! 88: UID = None
! 89: if path:
! 90: metadata = uid_catalog.getMetadataForUID(path[prefix_length:])
! 91: if metadata:
! 92: UID = metadata.get('UID', None)
! 93:
! 94: if linkbyuid and not collection and UID:
! 95: url = base+'/resolveuid/%s' % UID
! 96: else:
! 97: url = brain.getURL()
! 98:
! 99: icon = "%s/%s" % (context.portal_url(), brain.getIcon)
! 100: width = height = size = None
! 101: preview = types_tool.getTypeInfo(brain.portal_type).getActionById(preview_action, None)
! 102:
! 103: # It would be nice to do everything from the brain, but
! 104: # unfortunately we need to get the object for the preview size.
! 105: # XXX Figure out some way to get the image size client side
! 106: # instead of inserting it here.
! 107: if showimagesize:
! 108: obj = brain.getObject()
! 109: if hasattr(obj, 'get_size'):
! 110: size = context.getObjSize(obj)
! 111: width = getattr(obj, 'width', None)
! 112: height = getattr(obj, 'height', None)
! 113: if callable(width): width = width()
! 114: if callable(height): height = height()
! 115:
! 116: title = brain.Title or brain.getId
! 117: description = brain.Description
! 118:
! 119: return {'id': id, 'url': url, 'portal_type': portal_type,
! 120: 'collection': collection, 'icon': icon, 'size': size,
! 121: 'width': width, 'height': height,
! 122: 'preview': preview, 'title': title, 'description': description,
! 123: }
! 124:
! 125: # For Plone 2.0.5 compatability, if getId is callable we assume
! 126: # we have an object rather than a brains.
! 127: if values and callable(values[0].getId):
! 128: info = info_object
! 129:
! 130: # return [info(brain) for brain in values]
! 131: res = []
! 132:
! 133: portal = url_tool.getPortalObject()
! 134: if linkhere and portal is not context:
! 135: data = info_object(context, False)
! 136: if data:
! 137: data['label'] = '. (%s)' % context.title_or_id()
! 138: res.append(data)
! 139:
! 140: if linkparent:
! 141: if portal is not context:
! 142: data = info_object(context.aq_parent, True)
! 143: if data:
! 144: data['label'] = '.. (Parent folder)'
! 145: res.append(data)
! 146:
! 147: for obj in values:
! 148: data = info(obj, True)
! 149: if data:
! 150: res.append(data)
! 151: return res
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>