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>