annotate roundup/cgi/ZTUtils/Batch.py @ 4587:a2eb4fb3e6d8

New Chameleon templating engine, engine is now configurable. We now have two configurable templating engines, the old Zope TAL templates (called zopetal in the config) and the new Chameleon (called chameleon in the config). A new config-option "template_engine" under [main] can take these config-options, the default is zopetal. Thanks to Cheer Xiao for the idea of making this configurable *and* for the actual implementation! Cheer Xiao commit log: - The original TAL engine ported from Zope is thereafter referred to as "zopetal", in speech and in code - A new option "template_engine" under [main] introduced - Zopetal-specific code stripped from cgi/templating.py to form the new cgi/engine_zopetal.py - Interface to Chameleon in cgi/engine_chameleon.py - Engines are supposed to provide a Templates class that mimics the behavior of the old cgi.templating.Templates. The Templates class is preferably subclassed from cgi.templating.TemplatesBase. - New function cgi.templating.get_templates to get the appropriate engine's Templates instance according to the engine name
author Ralf Schlatterbeck <rsc@runtux.com>
date Thu, 23 Feb 2012 18:10:03 +0100
parents 6e3e4f24c753
children 39af8a0f3446
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1 ##############################################################################
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
2 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
3 # Copyright (c) 2001 Zope Corporation and Contributors. All Rights Reserved.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
4 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
5 # This software is subject to the provisions of the Zope Public License,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
6 # Version 2.0 (ZPL). A copy of the ZPL should accompany this distribution.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
7 # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
8 # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
9 # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
10 # FOR A PARTICULAR PURPOSE
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
11 #
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
12 ##############################################################################
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
13 __doc__='''Batch class, for iterating over a sequence in batches
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
14
4570
6e3e4f24c753 Remove keyword expansions from CVS. All regression tests passed afterwards.
Eric S. Raymond <esr@thyrsus.com>
parents: 4532
diff changeset
15 '''
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1120
diff changeset
16 __docformat__ = 'restructuredtext'
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
17
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
18 class LazyPrevBatch:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
19 def __of__(self, parent):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
20 return Batch(parent._sequence, parent._size,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
21 parent.first - parent._size + parent.overlap, 0,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
22 parent.orphan, parent.overlap)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
24 class LazyNextBatch:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 def __of__(self, parent):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26 try: parent._sequence[parent.end]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 except IndexError: return None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28 return Batch(parent._sequence, parent._size,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
29 parent.end - parent.overlap, 0,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
30 parent.orphan, parent.overlap)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 class LazySequenceLength:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 def __of__(self, parent):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 parent.sequence_length = l = len(parent._sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 return l
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 class Batch:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 """Create a sequence batch"""
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 __allow_access_to_unprotected_subobjects__ = 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 previous = LazyPrevBatch()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 next = LazyNextBatch()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 sequence_length = LazySequenceLength()
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 def __init__(self, sequence, size, start=0, end=0,
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 orphan=0, overlap=0):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 '''Encapsulate "sequence" in batches of "size".
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 Arguments: "start" and "end" are 0-based indexes into the
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 sequence. If the next batch would contain no more than
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 "orphan" elements, it is combined with the current batch.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 "overlap" is the number of elements shared by adjacent
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 batches. If "size" is not specified, it is computed from
4532
6b8abdc4bb22 issue2550678: Allow pagesize=-1 which returns all results.
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 2005
diff changeset
54 "start" and "end". If "size" is 0, it is the length of
6b8abdc4bb22 issue2550678: Allow pagesize=-1 which returns all results.
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 2005
diff changeset
55 the sequence. Failing that, it is 7.
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 Attributes: Note that the "start" attribute, unlike the
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 argument, is a 1-based index (I know, lame). "first" is the
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 0-based index. "length" is the actual number of elements in
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 the batch.
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 "sequence_length" is the length of the original, unbatched, sequence
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 start = start + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 start,end,sz = opt(start,end,size,orphan,sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 self._sequence = sequence
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 self.size = sz
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 self._size = size
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 self.start = start
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 self.end = end
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 self.orphan = orphan
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 self.overlap = overlap
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 self.first = max(start - 1, 0)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 self.length = self.end - self.first
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 if self.first == 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 self.previous = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 def __getitem__(self, index):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 if index < 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 if index + self.end < self.first: raise IndexError, index
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 return self._sequence[index + self.end]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 if index >= self.length: raise IndexError, index
1120
c26471971d18 Exposed the Batch mechanism through the top-level "utils" variable.
Richard Jones <richard@users.sourceforge.net>
parents: 1049
diff changeset
88 return self._sequence[index + self.first]
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 def __len__(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91 return self.length
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 def opt(start,end,size,orphan,sequence):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 if size < 1:
4532
6b8abdc4bb22 issue2550678: Allow pagesize=-1 which returns all results.
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 2005
diff changeset
95 if size == 0:
6b8abdc4bb22 issue2550678: Allow pagesize=-1 which returns all results.
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 2005
diff changeset
96 size=len(sequence)
6b8abdc4bb22 issue2550678: Allow pagesize=-1 which returns all results.
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 2005
diff changeset
97 elif start > 0 and end > 0 and end >= start:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 size=end+1-start
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 else: size=7
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 if start > 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 try: sequence[start-1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 except IndexError: start=len(sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 if end > 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 if end < start: end=start
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 end=start+size-1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 try: sequence[end+orphan-1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 except IndexError: end=len(sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 elif end > 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 try: sequence[end-1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 except IndexError: end=len(sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 start=end+1-size
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 if start - 1 < orphan: start=1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 start=1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 end=start+size-1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 try: sequence[end+orphan-1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 except IndexError: end=len(sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 return start,end,size

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