annotate roundup/cgi/ZTUtils/Batch.py @ 5973:fe334430ca07

issue2550919 - Anti-bot signup using 4 second delay Took the code by erik forsberg and massaged it into the core. So this is no longer needed in the tracker. Updated devel and responsive trackers to remove timestamp.py and update input field name. Docs, changes and tests complete. Hopefully these tracker changes won't cause an issue for other tests.
author John Rouillard <rouilj@ieee.org>
date Sat, 09 Nov 2019 00:30:37 -0500
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/