Annotation of kupuMPIWG/plone/librarytool.py, revision 1.1.1.1

1.1       dwinter     1: ##############################################################################
                      2: #
                      3: # Copyright (c) 2003-2005 Kupu Contributors. All rights reserved.
                      4: #
                      5: # This software is distributed under the terms of the Kupu
                      6: # License. See LICENSE.txt for license text. For a list of Kupu
                      7: # Contributors see CREDITS.txt.
                      8: #
                      9: ##############################################################################
                     10: """Kupu library tool
                     11: 
                     12: This module contains Kupu's library tool to support drawers.
                     13: 
                     14: $Id: librarytool.py 14851 2005-07-21 11:39:15Z duncan $
                     15: """
                     16: import Acquisition
                     17: from Acquisition import aq_parent, aq_inner, aq_base
                     18: from Products.CMFCore.Expression import Expression
                     19: from Products.CMFCore.Expression import createExprContext
                     20: from Products.kupu.plone.interfaces import IKupuLibraryTool
                     21: from Products.CMFCore.utils import getToolByName
                     22: 
                     23: class KupuError(Exception): pass
                     24: 
                     25: class KupuLibraryTool(Acquisition.Implicit):
                     26:     """A tool to aid Kupu libraries"""
                     27: 
                     28:     __implements__ = IKupuLibraryTool
                     29: 
                     30:     def __init__(self):
                     31:         self._libraries = []
                     32:         self._res_types = {}
                     33: 
                     34:     def _getExpressionContext(self, object):
                     35:         portal = aq_parent(aq_inner(self))
                     36:         if object is None or not hasattr(object, 'aq_base'):
                     37:             folder = portal
                     38:         else:
                     39:             folder = object
                     40:             # Search up the containment hierarchy until we find an
                     41:             # object that claims it's a folder.
                     42:             while folder is not None:
                     43:                 if getattr(aq_base(folder), 'isPrincipiaFolderish', 0):
                     44:                     # found it.
                     45:                     break
                     46:                 else:
                     47:                     folder = aq_parent(aq_inner(folder))
                     48:         ec = createExprContext(folder, portal, object)
                     49:         return ec
                     50: 
                     51:     def addLibrary(self, id, title, uri, src, icon):
                     52:         """See ILibraryManager"""
                     53:         lib = dict(id=id, title=title, uri=uri, src=src, icon=icon)
                     54:         for key, value in lib.items():
                     55:             if key=='id':
                     56:                 lib[key] = value
                     57:             else:
                     58:                 if not(value.startswith('string:') or value.startswith('python:')):
                     59:                     value = 'string:' + value
                     60:                 lib[key] = Expression(value)
                     61:         self._libraries.append(lib)
                     62: 
                     63:     def getLibraries(self, context):
                     64:         """See ILibraryManager"""
                     65:         expr_context = self._getExpressionContext(context)
                     66:         libraries = []
                     67:         for library in self._libraries:
                     68:             lib = {}
                     69:             for key in library.keys():
                     70:                 if isinstance(library[key], str):
                     71:                     lib[key] = library[key]
                     72:                 else:
                     73:                     # Automatic migration from old version.
                     74:                     if key=='id':
                     75:                         lib[key] = library[key] = library[key].text
                     76:                     else:
                     77:                         lib[key] = library[key](expr_context)
                     78:             libraries.append(lib)
                     79:         return tuple(libraries)
                     80: 
                     81:     def deleteLibraries(self, indices):
                     82:         """See ILibraryManager"""
                     83:         indices.sort()
                     84:         indices.reverse()
                     85:         for index in indices:
                     86:             del self._libraries[index]
                     87: 
                     88:     def updateLibraries(self, libraries):
                     89:         """See ILibraryManager"""
                     90:         for index, lib in enumerate(self._libraries):
                     91:             dic = libraries[index]
                     92:             for key in lib.keys():
                     93:                 if dic.has_key(key):
                     94:                     value = dic[key]
                     95:                     if key=='id':
                     96:                         lib[key] = value
                     97:                     else:
                     98:                         if not(value.startswith('string:') or
                     99:                                value.startswith('python:')):
                    100:                             value = 'string:' + value
                    101:                         lib[key] = Expression(value)
                    102:             self._libraries[index] = lib
                    103: 
                    104:     def moveUp(self, indices):
                    105:         """See ILibraryManager"""
                    106:         indices.sort()
                    107:         libraries = self._libraries[:]
                    108:         for index in indices:
                    109:             new_index = index - 1
                    110:             libraries[index], libraries[new_index] = \
                    111:                               libraries[new_index], libraries[index]
                    112:         self._libraries = libraries
                    113: 
                    114:     def moveDown(self, indices):
                    115:         """See ILibraryManager"""
                    116:         indices.sort()
                    117:         indices.reverse()
                    118:         libraries = self._libraries[:]
                    119:         for index in indices:
                    120:             new_index = index + 1
                    121:             if new_index >= len(libraries):
                    122:                 new_index = 0
                    123:                 #new_index = ((index + 1) % len(libraries)) - 1
                    124:             libraries[index], libraries[new_index] = \
                    125:                               libraries[new_index], libraries[index]
                    126:         self._libraries = libraries
                    127: 
                    128:     def getPortalTypesForResourceType(self, resource_type):
                    129:         """See IResourceTypeMapper"""
                    130:         return self._res_types[resource_type][:]
                    131: 
                    132:     def queryPortalTypesForResourceType(self, resource_type, default=None):
                    133:         """See IResourceTypeMapper"""
                    134:         if not self._res_types.has_key(resource_type):
                    135:             return default
                    136:         return self._res_types[resource_type][:]
                    137: 
                    138:     def _validate_portal_types(self, resource_type, portal_types):
                    139:         typetool = getToolByName(self, 'portal_types')
                    140:         all_portal_types = dict([ (t.id, 1) for t in typetool.listTypeInfo()])
                    141: 
                    142:         portal_types = [ptype.strip() for ptype in portal_types if ptype]
                    143:         for p in portal_types:
                    144:             if p not in all_portal_types:
                    145:                 raise KupuError, "Resource type: %s, invalid type: %s" % (resource_type, p)
                    146:         return portal_types
                    147: 
                    148:     def addResourceType(self, resource_type, portal_types):
                    149:         """See IResourceTypeMapper"""
                    150:         portal_types = self._validate_portal_types(resource_type, portal_types)
                    151:         self._res_types[resource_type] = tuple(portal_types)
                    152: 
                    153:     def updateResourceTypes(self, type_info):
                    154:         """See IResourceTypeMapper"""
                    155:         type_map = self._res_types
                    156:         for type in type_info:
                    157:             resource_type = type['resource_type']
                    158:             portal_types = self._validate_portal_types(resource_type, type['portal_types'])
                    159:             del type_map[type['old_type']]
                    160:             type_map[resource_type] = tuple(portal_types)
                    161: 
                    162:     def deleteResourceTypes(self, resource_types):
                    163:         """See IResourceTypeMapper"""
                    164:         for type in resource_types:
                    165:             del self._res_types[type]

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>