annotate roundup/cgi/ZTUtils/Batch.py @ 8540:e8d1da6e3571

bug: fix traceback in roundup-admin init with bad config values initialize accepts setting values for config.ini file settings. If they are not valid, you got a python traceback. ConfigurationError exceptions are now trapped. The admin.py's usageError_feedback method is used to inform the user. Also the feedback message now starts with a newline making it easier to read by separating it from command that caused the issue.
author John Rouillard <rouilj@ieee.org>
date Mon, 23 Mar 2026 13:18:41 -0400
parents 35ea9b1efc14
children
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):
5087
39af8a0f3446 Applied patch attached to issue2550723. Problem in index page
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
20 return Batch(parent._sequence, parent.size,
1049
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
5087
39af8a0f3446 Applied patch attached to issue2550723. Problem in index page
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
28 return Batch(parent._sequence, parent.size,
1049
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
5087
39af8a0f3446 Applied patch attached to issue2550723. Problem in index page
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
63
39af8a0f3446 Applied patch attached to issue2550723. Problem in index page
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
64 Note: "_size" is the "actual" size used to perform batch calulcations,
39af8a0f3446 Applied patch attached to issue2550723. Problem in index page
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
65 while "size" is the "representative" size. (ie. a "special value" of
39af8a0f3446 Applied patch attached to issue2550723. Problem in index page
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
66 "size" used by the templates may translate to a different value for
39af8a0f3446 Applied patch attached to issue2550723. Problem in index page
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
67 "_size" which is used internally for batch calculations).
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 '''
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 start = start + 1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 start,end,sz = opt(start,end,size,orphan,sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 self._sequence = sequence
5087
39af8a0f3446 Applied patch attached to issue2550723. Problem in index page
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
75 self.size = size
39af8a0f3446 Applied patch attached to issue2550723. Problem in index page
John Rouillard <rouilj@ieee.org>
parents: 4570
diff changeset
76 self._size = sz
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 self.start = start
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 self.end = end
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 self.orphan = orphan
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 self.overlap = overlap
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 self.first = max(start - 1, 0)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 self.length = self.end - self.first
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 if self.first == 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 self.previous = None
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 def __getitem__(self, index):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 if index < 0:
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5087
diff changeset
89 if index + self.end < self.first: raise IndexError(index)
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 return self._sequence[index + self.end]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91
5378
35ea9b1efc14 Python 3 preparation: "raise" syntax.
Joseph Myers <jsm@polyomino.org.uk>
parents: 5087
diff changeset
92 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
93 return self._sequence[index + self.first]
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 def __len__(self):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 return self.length
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 def opt(start,end,size,orphan,sequence):
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 if size < 1:
4532
6b8abdc4bb22 issue2550678: Allow pagesize=-1 which returns all results.
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 2005
diff changeset
100 if size == 0:
6b8abdc4bb22 issue2550678: Allow pagesize=-1 which returns all results.
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 2005
diff changeset
101 size=len(sequence)
6b8abdc4bb22 issue2550678: Allow pagesize=-1 which returns all results.
Bernhard Reiter <Bernhard.Reiter@intevation.de>
parents: 2005
diff changeset
102 elif start > 0 and end > 0 and end >= start:
1049
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 size=end+1-start
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 else: size=7
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 if start > 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108 try: sequence[start-1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 except IndexError: start=len(sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 if end > 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 if end < start: end=start
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 end=start+size-1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 try: sequence[end+orphan-1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 except IndexError: end=len(sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 elif end > 0:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 try: sequence[end-1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 except IndexError: end=len(sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 start=end+1-size
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 if start - 1 < orphan: start=1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 else:
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 start=1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 end=start+size-1
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 try: sequence[end+orphan-1]
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 except IndexError: end=len(sequence)
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 return start,end,size

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