Annotation of kupu/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>