annotate ZTUtils/Tree.py @ 1042:adcfdeac4e76

not sure how useful this is...
author Richard Jones <richard@users.sourceforge.net>
date Wed, 04 Sep 2002 04:47:28 +0000
parents 7fe79c67aaa9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
983
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ##############################################################################
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 #
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 # This software is subject to the provisions of the Zope Public License,
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # FOR A PARTICULAR PURPOSE
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 #
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 ##############################################################################
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 __doc__='''Tree manipulation classes
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
15 $Id: Tree.py,v 1.1 2002-08-30 08:25:34 richard Exp $'''
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
16 __version__='$Revision: 1.1 $'[11:-2]
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 from Acquisition import Explicit
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 from ComputedAttribute import ComputedAttribute
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21 class TreeNode(Explicit):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 __allow_access_to_unprotected_subobjects__ = 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23 state = 0 # leaf
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 height = 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 size = 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 def __init__(self):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 self._child_list = []
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 def _add_child(self, child):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 'Add a child which already has all of its children.'
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 self._child_list.append(child)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 self.height = max(self.height, child.height + 1)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 self.size = self.size + child.size
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 def flat(self):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 'Return a flattened preorder list of tree nodes'
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 items = []
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 self.walk(items.append)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 return items
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 def walk(self, f, data=None):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 'Preorder walk this tree, passing each node to a function'
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 if data is None:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 f(self)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 else:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 f(self, data)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 for child in self._child_list:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 child.__of__(self).walk(f, data)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 def _depth(self):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 return self.aq_parent.depth + 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 depth = ComputedAttribute(_depth, 1)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 def __getitem__(self, index):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 return self._child_list[index].__of__(self)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 def __len__(self):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 return len(self._child_list)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 _marker = []
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 class TreeMaker:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 '''Class for mapping a hierachy of objects into a tree of nodes.'''
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 __allow_access_to_unprotected_subobjects__ = 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 _id = 'tpId'
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 _values = 'tpValues'
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 _assume_children = 0
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 _values_filter = None
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 _values_function = None
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 _expand_root = 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 def setChildAccess(self, attrname=_marker, filter=_marker,
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 function=_marker):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 '''Set the criteria for fetching child nodes.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 Child nodes can be accessed through either an attribute name
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 or callback function. Children fetched by attribute name can
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 be filtered through a callback function.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 '''
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 if function is _marker:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 self._values_function = None
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 if attrname is not _marker:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 self._values = str(attrname)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 if filter is not _marker:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 self._values_filter = filter
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 else:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 self._values_function = function
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 def tree(self, root, expanded=None, subtree=0):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 '''Create a tree from root, with specified nodes expanded.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 "expanded" must be false, true, or a mapping.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 Each key of the mapping is the id of a top-level expanded
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 node, and each value is the "expanded" value for the
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 children of that node.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 '''
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 node = self.node(root)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 child_exp = expanded
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 if not simple_type(expanded):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 # Assume a mapping
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97 expanded = expanded.has_key(node.id)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 child_exp = child_exp.get(node.id)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 if expanded or (not subtree and self._expand_root):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 children = self.getChildren(root)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 if children:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 node.state = 1 # expanded
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 for child in children:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 node._add_child(self.tree(child, child_exp, 1))
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 elif self.hasChildren(root):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 node.state = -1 # collapsed
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 if not subtree:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 node.depth = 0
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 if hasattr(self, 'markRoot'):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 self.markRoot(node)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 return node
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 def node(self, object):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 node = TreeNode()
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 node.object = object
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 node.id = b2a(self.getId(object))
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 return node
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 def getId(self, object):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 id_attr = self._id
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 if hasattr(object, id_attr):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 obid = getattr(object, id_attr)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 if not simple_type(obid): obid = obid()
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 return obid
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 if hasattr(object, '_p_oid'): return str(object._p_oid)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 return id(object)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 def hasChildren(self, object):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 if self._assume_children:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 return 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 return self.getChildren(object)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 def getChildren(self, object):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 if self._values_function is not None:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 return self._values_function(object)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 if self._values_filter and hasattr(object, 'aq_acquire'):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 return object.aq_acquire(self._values, aqcallback,
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 self._values_filter)()
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 return getattr(object, self._values)()
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 def simple_type(ob,
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 is_simple={type(''):1, type(0):1, type(0.0):1,
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 type(0L):1, type(None):1 }.has_key):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 return is_simple(type(ob))
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146 def aqcallback(self, inst, parent, name, value, filter):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 return filter(self, inst, parent, name, value)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 from binascii import b2a_base64, a2b_base64
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150 import string
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 from string import split, join, translate
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153 a2u_map = string.maketrans('+/=', '-._')
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 u2a_map = string.maketrans('-._', '+/=')
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 def b2a(s):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 '''Encode a value as a cookie- and url-safe string.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 Encoded string use only alpahnumeric characters, and "._-".
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 '''
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 s = str(s)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 if len(s) <= 57:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 return translate(b2a_base64(s)[:-1], a2u_map)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 frags = []
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165 for i in range(0, len(s), 57):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166 frags.append(b2a_base64(s[i:i + 57])[:-1])
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 return translate(join(frags, ''), a2u_map)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 def a2b(s):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 '''Decode a b2a-encoded string.'''
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 s = translate(s, u2a_map)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 if len(s) <= 76:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173 return a2b_base64(s)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174 frags = []
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 for i in range(0, len(s), 76):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 frags.append(a2b_base64(s[i:i + 76]))
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 return join(frags, '')
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 def encodeExpansion(nodes):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 '''Encode the expanded node ids of a tree into a string.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182 Accepts a list of nodes, such as that produced by root.flat().
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
183 Marks each expanded node with an expansion_number attribute.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
184 Since node ids are encoded, the resulting string is safe for
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185 use in cookies and URLs.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 '''
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187 steps = []
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188 last_depth = -1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189 n = 0
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 for node in nodes:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 if node.state <=0: continue
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192 dd = last_depth - node.depth + 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 last_depth = node.depth
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 if dd > 0:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 steps.append('.' * dd)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 steps.append(node.id)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 node.expansion_number = n
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 n = n + 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199 return join(steps, ':')
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 def decodeExpansion(s, nth=None):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 '''Decode an expanded node map from a string.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 If nth is an integer, also return the (map, key) pair for the nth entry.
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 '''
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 map = m = {}
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 mstack = []
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 pop = 0
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209 nth_pair = None
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 if nth is not None:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211 nth_pair = (None, None)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 for step in split(s, ':'):
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 if step[:1] == '.':
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 pop = len(step) - 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 continue
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 if pop < 0:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 mstack.append(m)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 m[obid] = {}
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 m = m[obid]
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220 elif map:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221 m[obid] = None
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 if len(step) == 0:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 return map
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 obid = step
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225 if pop > 0:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 m = mstack[-pop]
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 del mstack[-pop:]
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
228 pop = -1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
229 if nth == 0:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
230 nth_pair = (m, obid)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231 nth = None
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232 elif nth is not None:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 nth = nth - 1
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 m[obid] = None
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 if nth == 0:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 return map, (m, obid)
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237 if nth_pair is not None:
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238 return map, nth_pair
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239 return map
7fe79c67aaa9 Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240

Roundup Issue Tracker: http://roundup-tracker.org/