Mercurial > p > roundup > code
annotate ZTUtils/Tree.py @ 1029:c3e391d9c4e9
more FieldStorage fun
| author | Richard Jones <richard@users.sourceforge.net> |
|---|---|
| date | Tue, 03 Sep 2002 07:42:38 +0000 |
| parents | 7fe79c67aaa9 |
| children |
| 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 |
