Mercurial > p > roundup > code
annotate ZTUtils/Zope.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 |
| 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__='''Zope-specific versions of ZTUTils 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: Zope.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 import sys, cgi, urllib, cgi |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
19 from Tree import encodeExpansion, decodeExpansion, TreeMaker |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
20 from SimpleTree import SimpleTreeMaker |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
21 from Batch import Batch |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
22 from Products.ZCatalog.Lazy import Lazy |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
23 from AccessControl import getSecurityManager |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
24 from string import split, join |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
25 from types import StringType, ListType, IntType, FloatType |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
26 from DateTime import DateTime |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
27 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
28 try: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
29 from AccessControl.ZopeGuards import guarded_getitem |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
30 except ImportError: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
31 Unauthorized = 'Unauthorized' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
32 def guarded_getitem(object, index): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
33 v = object[index] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
34 if getSecurityManager().validate(object, object, index, v): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
35 return v |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
36 raise Unauthorized, 'unauthorized access to element %s' % `i` |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
37 else: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
38 from AccessControl import Unauthorized |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
39 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
40 class LazyFilter(Lazy): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
41 # A LazyFilter that checks with the security policy |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
42 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
43 def __init__(self, seq, test=None, skip=None): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
44 self._seq=seq |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
45 self._data=[] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
46 self._eindex=-1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
47 self._test=test |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
48 if not (skip is None or str(skip) == skip): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
49 raise TypeError, 'Skip must be None or a string' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
50 self._skip = skip |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
51 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
52 def __getitem__(self,index): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
53 data=self._data |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
54 try: s=self._seq |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
55 except AttributeError: return data[index] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
56 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
57 i=index |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
58 if i < 0: i=len(self)+i |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
59 if i < 0: raise IndexError, index |
|
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 ind=len(data) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
62 if i < ind: return data[i] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
63 ind=ind-1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
64 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
65 test=self._test |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
66 e=self._eindex |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
67 skip = self._skip |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
68 while i > ind: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
69 e = e + 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
70 try: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
71 try: v = guarded_getitem(s, e) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
72 except Unauthorized, vv: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
73 if skip is None: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
74 self._eindex = e |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
75 msg = '(item %s): %s' % (index, vv) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
76 raise Unauthorized, msg, sys.exc_info()[2] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
77 skip_this = 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
78 else: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
79 skip_this = 0 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
80 except IndexError: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
81 del self._test |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
82 del self._seq |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
83 del self._eindex |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
84 raise IndexError, index |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
85 if skip_this: continue |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
86 if skip and not getSecurityManager().checkPermission(skip, v): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
87 continue |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
88 if test is None or test(v): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
89 data.append(v) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
90 ind=ind+1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
91 self._eindex=e |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
92 return data[i] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
93 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
94 class TreeSkipMixin: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
95 '''Mixin class to make trees test security, and allow |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
96 skipping of unauthorized objects. ''' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
97 skip = None |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
98 def setSkip(self, skip): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
99 self.skip = skip |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
100 return self |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
101 def getChildren(self, object): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
102 return LazyFilter(self._getChildren(object), skip=self.skip) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
103 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
104 class TreeMaker(TreeSkipMixin, TreeMaker): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
105 _getChildren = TreeMaker.getChildren |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
106 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
107 class SimpleTreeMaker(TreeSkipMixin, SimpleTreeMaker): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
108 _getChildren = SimpleTreeMaker.getChildren |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
109 def cookieTree(self, root_object, default_state=None): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
110 '''Make a tree with state stored in a cookie.''' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
111 tree_pre = self.tree_pre |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
112 state_name = '%s-state' % tree_pre |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
113 set_name = '%s-setstate' % tree_pre |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
114 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
115 req = root_object.REQUEST |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
116 state = req.get(state_name) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
117 if state: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
118 setst = req.form.get(set_name) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
119 if setst: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
120 st, pn, expid = split(setst, ',') |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
121 state, (m, obid) = decodeExpansion(state, int(pn)) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
122 if m is None: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
123 pass |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
124 elif st == 'e': |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
125 if m[obid] is None: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
126 m[obid] = {expid: None} |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
127 else: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
128 m[obid][expid] = None |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
129 elif st == 'c' and m is not state and obid==expid: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
130 del m[obid] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
131 else: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
132 state = decodeExpansion(state) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
133 else: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
134 state = default_state |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
135 tree = self.tree(root_object, state) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
136 rows = tree.flat() |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
137 req.RESPONSE.setCookie(state_name, encodeExpansion(rows)) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
138 return tree, rows |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
139 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
140 # Make the Batch class test security, and let it skip unauthorized. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
141 _Batch = Batch |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
142 class Batch(Batch): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
143 def __init__(self, sequence, size, start=0, end=0, |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
144 orphan=0, overlap=0, skip_unauthorized=None): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
145 sequence = LazyFilter(sequence, skip=skip_unauthorized) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
146 _Batch.__init__(self, sequence, size, start, end, |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
147 orphan, overlap) |
|
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 # These functions are meant to be used together in templates that use |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
150 # trees or batches. For example, given a batch with a 'bstart' query |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
151 # argument, you would use "url_query(request, omit='bstart')" to get |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
152 # the base for the batching links, then append |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
153 # "make_query(bstart=batch.previous.first)" to one and |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
154 # "make_query(bstart=batch.end)" to the other. |
|
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 make_query(*args, **kwargs): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
157 '''Construct a URL query string, with marshalling markup. |
|
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 If there are positional arguments, they must be dictionaries. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
160 They are combined with the dictionary of keyword arguments to form |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
161 a dictionary of query names and values. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
162 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
163 Query names (the keys) must be strings. Values may be strings, |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
164 integers, floats, or DateTimes, and they may also be lists or |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
165 namespaces containing these types. Names and string values |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
166 should not be URL-quoted. All arguments are marshalled with |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
167 complex_marshal(). |
|
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 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
170 d = {} |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
171 for arg in args: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
172 d.update(arg) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
173 d.update(kwargs) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
174 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
175 uq = urllib.quote |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
176 qlist = complex_marshal(d.items()) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
177 for i in range(len(qlist)): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
178 k, m, v = qlist[i] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
179 qlist[i] = '%s%s=%s' % (uq(k), m, uq(str(v))) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
180 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
181 return join(qlist, '&') |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
182 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
183 def make_hidden_input(*args, **kwargs): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
184 '''Construct a set of hidden input elements, with marshalling markup. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
185 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
186 If there are positional arguments, they must be dictionaries. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
187 They are combined with the dictionary of keyword arguments to form |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
188 a dictionary of query names and values. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
189 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
190 Query names (the keys) must be strings. Values may be strings, |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
191 integers, floats, or DateTimes, and they may also be lists or |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
192 namespaces containing these types. All arguments are marshalled with |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
193 complex_marshal(). |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
194 ''' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
195 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
196 d = {} |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
197 for arg in args: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
198 d.update(arg) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
199 d.update(kwargs) |
|
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 hq = cgi.escape |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
202 qlist = complex_marshal(d.items()) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
203 for i in range(len(qlist)): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
204 k, m, v = qlist[i] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
205 qlist[i] = ('<input type="hidden" name="%s%s" value="%s">' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
206 % (hq(k), m, hq(str(v)))) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
207 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
208 return join(qlist, '\n') |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
209 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
210 def complex_marshal(pairs): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
211 '''Add request marshalling information to a list of name-value pairs. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
212 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
213 Names must be strings. Values may be strings, |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
214 integers, floats, or DateTimes, and they may also be lists or |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
215 namespaces containing these types. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
216 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
217 The list is edited in place so that each (name, value) pair |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
218 becomes a (name, marshal, value) triple. The middle value is the |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
219 request marshalling string. Integer, float, and DateTime values |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
220 will have ":int", ":float", or ":date" as their marshal string. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
221 Lists will be flattened, and the elements given ":list" in |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
222 addition to their simple marshal string. Dictionaries will be |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
223 flattened and marshalled using ":record". |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
224 ''' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
225 i = len(pairs) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
226 while i > 0: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
227 i = i - 1 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
228 k, v = pairs[i] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
229 m = '' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
230 sublist = None |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
231 if isinstance(v, StringType): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
232 pass |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
233 elif hasattr(v, 'items'): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
234 sublist = [] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
235 for sk, sv in v.items(): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
236 sm = simple_marshal(sv) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
237 sublist.append(('%s.%s' % (k, sk), '%s:record' % sm, sv)) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
238 elif isinstance(v, ListType): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
239 sublist = [] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
240 for sv in v: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
241 sm = simple_marshal(sv) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
242 sublist.append((k, '%s:list' % sm, sv)) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
243 else: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
244 m = simple_marshal(v) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
245 if sublist is None: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
246 pairs[i] = (k, m, v) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
247 else: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
248 pairs[i:i + 1] = sublist |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
249 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
250 return pairs |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
251 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
252 def simple_marshal(v): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
253 if isinstance(v, StringType): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
254 return '' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
255 if isinstance(v, IntType): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
256 return ':int' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
257 if isinstance(v, FloatType): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
258 return ':float' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
259 if isinstance(v, DateTime): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
260 return ':date' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
261 return '' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
262 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
263 def url_query(request, req_name="URL", omit=None): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
264 '''Construct a URL with a query string, using the current request. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
265 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
266 request: the request object |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
267 req_name: the name, such as "URL1" or "BASEPATH1", to get from request |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
268 omit: sequence of name of query arguments to omit. If a name |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
269 contains a colon, it is treated literally. Otherwise, it will |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
270 match each argument name that starts with the name and a period or colon. |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
271 ''' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
272 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
273 base = request[req_name] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
274 qs = request.get('QUERY_STRING', '') |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
275 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
276 if qs and omit: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
277 qsparts = split(qs, '&') |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
278 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
279 if isinstance(omit, StringType): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
280 omits = {omit: None} |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
281 else: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
282 omits = {} |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
283 for name in omit: |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
284 omits[name] = None |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
285 omitted = omits.has_key |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
286 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
287 unq = urllib.unquote |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
288 for i in range(len(qsparts)): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
289 name = unq(split(qsparts[i], '=', 1)[0]) |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
290 if omitted(name): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
291 qsparts[i] = '' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
292 name = split(name, ':', 1)[0] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
293 if omitted(name): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
294 qsparts[i] = '' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
295 name = split(name, '.', 1)[0] |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
296 if omitted(name): |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
297 qsparts[i] = '' |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
298 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
299 qs = join(filter(None, qsparts), '&') |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
300 |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
301 # We alway append '?' since arguments will be appended to the URL |
|
7fe79c67aaa9
Adding ZTUtils to the dist
Richard Jones <richard@users.sourceforge.net>
parents:
diff
changeset
|
302 return '%s?%s' % (base, qs) |
