annotate roundup/date.py @ 2365:3a80831ecebe

If the target platform is win32, create .bat files... ...instead of *nix shell scripts. Target platform is set to "win32" if main command is 'bdist_wininst' or if the command is 'bdist' and it has the list of formats (from command line or config file) and the first item on that list is wininst. Otherwise target platform is set to current (build) platform.
author Alexander Smishlajev <a1s@users.sourceforge.net>
date Wed, 26 May 2004 10:00:53 +0000
parents 8611bf29baec
children 8a9af227a557
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
1 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
2 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
3 # This module is free software, and you may redistribute it and/or modify
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
4 # under the same terms as Python, so long as this copyright message and
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
5 # disclaimer are retained in their original form.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
6 #
214
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
7 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
8 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
9 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
10 # POSSIBILITY OF SUCH DAMAGE.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
11 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
12 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
13 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
14 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
15 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
17 #
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
18 # $Id: date.py,v 1.70 2004-05-23 10:23:28 richard Exp $
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 248
diff changeset
19
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
20 """Date, time and time interval handling.
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 248
diff changeset
21 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
22 __docformat__ = 'restructuredtext'
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
24 import time, re, calendar, types
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
25 from types import *
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
26 import i18n
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
28 def _add_granularity(src, order, value = 1):
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
29 '''Increment first non-None value in src dictionary ordered by 'order'
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
30 parameter
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
31 '''
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
32 for gran in order:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
33 if src[gran]:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
34 src[gran] = int(src[gran]) + value
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
35 break
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
36
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 class Date:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 '''
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
39 As strings, date-and-time stamps are specified with the date in
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 international standard format (yyyy-mm-dd) joined to the time
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
41 (hh:mm:ss) by a period ("."). Dates in this form can be easily compared
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
42 and are fairly readable when printed. An example of a valid stamp is
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43 "2000-06-24.13:03:59". We'll call this the "full date format". When
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 Timestamp objects are printed as strings, they appear in the full date
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 format with the time always given in GMT. The full date format is
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
46 always exactly 19 characters long.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 For user input, some partial forms are also permitted: the whole time
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 or just the seconds may be omitted; and the whole date may be omitted
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 or just the year may be omitted. If the time is given, the time is
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 interpreted in the user's local time zone. The Date constructor takes
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 care of these conversions. In the following examples, suppose that yyyy
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 is the current year, mm is the current month, and dd is the current day
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 of the month; and suppose that the user is on Eastern Standard Time.
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
55 Examples::
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 "2000-04-17" means <Date 2000-04-17.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 "01-25" means <Date yyyy-01-25.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 "2000-04-17.03:45" means <Date 2000-04-17.08:45:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 "08-13.22:13" means <Date yyyy-08-14.03:13:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 "11-07.09:32:43" means <Date yyyy-11-07.14:32:43>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 "14:25" means <Date yyyy-mm-dd.19:25:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 "8:47:11" means <Date yyyy-mm-dd.13:47:11>
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
64 "2003" means <Date 2003-01-01.00:00:00>
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
65 "2003-06" means <Date 2003-06-01.00:00:00>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 "." means "right now"
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 The Date class should understand simple date expressions of the form
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 stamp + interval and stamp - interval. When adding or subtracting
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 intervals involving months or years, the components are handled
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 separately. For example, when evaluating "2000-06-25 + 1m 10d", we
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 first add one month to get 2000-07-25, then add 10 days to get
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 2000-08-04 (rather than trying to decide whether 1m 10d means 38 or 40
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
74 or 41 days). Example usage::
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 >>> Date(".")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 <Date 2000-06-26.00:34:02>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 >>> _.local(-5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 "2000-06-25.19:34:02"
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 >>> Date(". + 2d")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 <Date 2000-06-28.00:34:02>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 >>> Date("1997-04-17", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 <Date 1997-04-17.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 >>> Date("01-25", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 <Date 2000-01-25.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 >>> Date("08-13.22:13", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 <Date 2000-08-14.03:13:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 >>> Date("14:25", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 <Date 2000-06-25.19:25:00>
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
90
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
91 The date format 'yyyymmddHHMMSS' (year, month, day, hour,
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
92 minute, second) is the serialisation format returned by the serialise()
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
93 method, and is accepted as an argument on instatiation.
2188
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
94
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
95 The date class handles basic arithmetic::
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
96
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
97 >>> d1=Date('.')
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
98 >>> d1
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
99 <Date 2004-04-06.22:04:20.766830>
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
100 >>> d2=Date('2003-07-01')
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
101 >>> d2
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
102 <Date 2003-07-01.00:00:0.000000>
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
103 >>> d1-d2
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
104 <Interval + 280d 22:04:20>
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
105 >>> i1=_
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
106 >>> d2+i1
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
107 <Date 2004-04-06.22:04:20.000000>
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
108 >>> d1-i1
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
109 <Date 2003-07-01.00:00:0.000000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110 '''
2262
a13ec40cf8f5 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2250
diff changeset
111
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
112 def __init__(self, spec='.', offset=0, add_granularity=0, translator=i18n):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113 """Construct a date given a specification and a time zone offset.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
115 'spec'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
116 is a full date or a partial form, with an optional added or
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
117 subtracted interval. Or a date 9-tuple.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
118 'offset'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
119 is the local time zone offset from GMT in hours.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
120 'translator'
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
121 is i18n module or one of gettext translation classes.
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
122 It must have attributes 'gettext' and 'ngettext',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
123 serving as translation functions.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 """
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
125 self._ = translator.gettext
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
126 self.ngettext = translator.ngettext
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
127 if type(spec) == type(''):
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
128 self.set(spec, offset=offset, add_granularity=add_granularity)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
129 return
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
130 elif hasattr(spec, 'tuple'):
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
131 spec = spec.tuple()
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
132 try:
75
fa5aea4c212e Fixed offset handling (shoulda read the spec a little better)
Richard Jones <richard@users.sourceforge.net>
parents: 47
diff changeset
133 y,m,d,H,M,S,x,x,x = spec
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
134 frac = S - int(S)
75
fa5aea4c212e Fixed offset handling (shoulda read the spec a little better)
Richard Jones <richard@users.sourceforge.net>
parents: 47
diff changeset
135 ts = calendar.timegm((y,m,d,H+offset,M,S,0,0,0))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 self.year, self.month, self.day, self.hour, self.minute, \
75
fa5aea4c212e Fixed offset handling (shoulda read the spec a little better)
Richard Jones <richard@users.sourceforge.net>
parents: 47
diff changeset
137 self.second, x, x, x = time.gmtime(ts)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
138 # we lost the fractional part
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
139 self.second = self.second + frac
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
140 except:
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
141 raise ValueError, 'Unknown spec %r'%spec
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
143 usagespec='[yyyy]-[mm]-[dd].[H]H:MM[:SS.SSS][offset]'
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
144 def set(self, spec, offset=0, date_re=re.compile(r'''
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
145 ((?P<y>\d\d\d\d)([/-](?P<m>\d\d?)([/-](?P<d>\d\d?))?)? # yyyy[-mm[-dd]]
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
146 |(?P<a>\d\d?)[/-](?P<b>\d\d?))? # or mm-dd
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
147 (?P<n>\.)? # .
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
148 (((?P<H>\d?\d):(?P<M>\d\d))?(:(?P<S>\d\d(\.\d+)?))?)? # hh:mm:ss
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
149 (?P<o>.+)? # offset
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
150 ''', re.VERBOSE), serialised_re=re.compile(r'''
2250
1f243574af52 fixed sqlite journal ordering issue
Richard Jones <richard@users.sourceforge.net>
parents: 2212
diff changeset
151 (\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d?(\.\d+)?)
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
152 ''', re.VERBOSE), add_granularity=0):
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
153 ''' set the date to the value in spec
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
154 '''
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
155
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
156 m = serialised_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
157 if m is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
158 # we're serialised - easy!
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
159 g = m.groups()
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
160 (self.year, self.month, self.day, self.hour, self.minute) = \
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
161 map(int, g[:5])
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
162 self.second = float(g[5])
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
163 return
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
164
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
165 # not serialised data, try usual format
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
166 m = date_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
167 if m is None:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
168 raise ValueError, self._('Not a date spec: %s') % self.usagespec
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
169
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
170 info = m.groupdict()
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
171
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
172 if add_granularity:
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
173 _add_granularity(info, 'SMHdmyab')
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
174
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
175 # get the current date as our default
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
176 ts = time.time()
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
177 frac = ts - int(ts)
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
178 y,m,d,H,M,S,x,x,x = time.gmtime(ts)
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
179 # gmtime loses the fractional seconds
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
180 S = S + frac
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
181
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
182 if info['y'] is not None or info['a'] is not None:
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
183 if info['y'] is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
184 y = int(info['y'])
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
185 m,d = (1,1)
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
186 if info['m'] is not None:
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
187 m = int(info['m'])
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
188 if info['d'] is not None:
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
189 d = int(info['d'])
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
190 if info['a'] is not None:
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
191 m = int(info['a'])
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
192 d = int(info['b'])
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
193 H = -offset
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
194 M = S = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
195
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
196 # override hour, minute, second parts
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
197 if info['H'] is not None and info['M'] is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
198 H = int(info['H']) - offset
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
199 M = int(info['M'])
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
200 S = 0
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
201 if info['S'] is not None:
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
202 S = float(info['S'])
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
203
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
204 if add_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
205 S = S - 1
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
206
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
207 # now handle the adjustment of hour
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
208 frac = S - int(S)
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
209 ts = calendar.timegm((y,m,d,H,M,S,0,0,0))
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
210 self.year, self.month, self.day, self.hour, self.minute, \
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
211 self.second, x, x, x = time.gmtime(ts)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
212 # we lost the fractional part along the way
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
213 self.second = self.second + frac
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
214
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
215 if info.get('o', None):
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
216 try:
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
217 self.applyInterval(Interval(info['o'], allowdate=0))
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
218 except ValueError:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
219 raise ValueError, self._('%r not a date spec (%s)')%(spec,
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
220 self.usagespec)
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
221
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
222 def addInterval(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
223 ''' Add the interval to this date, returning the date tuple
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 '''
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
225 # do the basic calc
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
226 sign = interval.sign
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
227 year = self.year + sign * interval.year
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
228 month = self.month + sign * interval.month
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
229 day = self.day + sign * interval.day
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
230 hour = self.hour + sign * interval.hour
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
231 minute = self.minute + sign * interval.minute
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
232 # Intervals work on whole seconds
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
233 second = int(self.second) + sign * interval.second
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
234
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
235 # now cope with under- and over-flow
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
236 # first do the time
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
237 while (second < 0 or second > 59 or minute < 0 or minute > 59 or
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
238 hour < 0 or hour > 23):
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
239 if second < 0: minute -= 1; second += 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
240 elif second > 59: minute += 1; second -= 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
241 if minute < 0: hour -= 1; minute += 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
242 elif minute > 59: hour += 1; minute -= 60
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
243 if hour < 0: day -= 1; hour += 24
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
244 elif hour > 23: day += 1; hour -= 24
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
245
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
246 # fix up the month so we're within range
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
247 while month < 1 or month > 12:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
248 if month < 1: year -= 1; month += 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
249 if month > 12: year += 1; month -= 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
250
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
251 # now do the days, now that we know what month we're in
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
252 def get_mdays(year, month):
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
253 if month == 2 and calendar.isleap(year): return 29
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
254 else: return calendar.mdays[month]
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
255
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
256 while month < 1 or month > 12 or day < 1 or day > get_mdays(year,month):
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
257 # now to day under/over
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
258 if day < 1:
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
259 # When going backwards, decrement month, then increment days
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
260 month -= 1
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
261 day += get_mdays(year,month)
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
262 elif day > get_mdays(year,month):
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
263 # When going forwards, decrement days, then increment month
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
264 day -= get_mdays(year,month)
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
265 month += 1
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
266
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
267 # possibly fix up the month so we're within range
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
268 while month < 1 or month > 12:
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
269 if month < 1: year -= 1; month += 12 ; day += 31
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
270 if month > 12: year += 1; month -= 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
271
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
272 return (year, month, day, hour, minute, second, 0, 0, 0)
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
273
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
274 def differenceDate(self, other):
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
275 "Return the difference between this date and another date"
2189
d39068bc6ef9 implement differenceDate ;)
Richard Jones <richard@users.sourceforge.net>
parents: 2188
diff changeset
276 return self - other
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
277
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
278 def applyInterval(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
279 ''' Apply the interval to this date
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
280 '''
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
281 self.year, self.month, self.day, self.hour, self.minute, \
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
282 self.second, x, x, x = self.addInterval(interval)
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
283
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
284 def __add__(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
285 """Add an interval to this date to produce another date.
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
286 """
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
287 return Date(self.addInterval(interval))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1094
diff changeset
289 # deviates from spec to allow subtraction of dates as well
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290 def __sub__(self, other):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291 """ Subtract:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292 1. an interval from this date to produce another date.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
293 2. a date from this date to produce an interval.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
294 """
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
295 if isinstance(other, Interval):
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
296 other = Interval(other.get_tuple())
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
297 other.sign *= -1
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
298 return self.__add__(other)
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
299
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
300 assert isinstance(other, Date), 'May only subtract Dates or Intervals'
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
301
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
302 return self.dateDelta(other)
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
303
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
304 def dateDelta(self, other):
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
305 """ Produce an Interval of the difference between this date
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
306 and another date. Only returns days:hours:minutes:seconds.
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
307 """
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
308 # Returning intervals larger than a day is almost
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
309 # impossible - months, years, weeks, are all so imprecise.
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
310 a = calendar.timegm((self.year, self.month, self.day, self.hour,
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
311 self.minute, self.second, 0, 0, 0))
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
312 b = calendar.timegm((other.year, other.month, other.day,
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
313 other.hour, other.minute, other.second, 0, 0, 0))
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
314 # intervals work in whole seconds
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
315 diff = int(a - b)
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
316 if diff > 0:
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
317 sign = 1
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
318 else:
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
319 sign = -1
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
320 diff = -diff
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
321 S = diff%60
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
322 M = (diff/60)%60
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
323 H = (diff/(60*60))%24
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
324 d = diff/(24*60*60)
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
325 return Interval((0, 0, d, H, M, S), sign=sign)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
326
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
327 def __cmp__(self, other, int_seconds=0):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328 """Compare this date to another date."""
543
22e0edf7da6e lots of date/interval related changes: more relaxed date format for input
Richard Jones <richard@users.sourceforge.net>
parents: 501
diff changeset
329 if other is None:
22e0edf7da6e lots of date/interval related changes: more relaxed date format for input
Richard Jones <richard@users.sourceforge.net>
parents: 501
diff changeset
330 return 1
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
331 for attr in ('year', 'month', 'day', 'hour', 'minute'):
890
a568596dbea7 Unit tests and a few fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 861
diff changeset
332 if not hasattr(other, attr):
a568596dbea7 Unit tests and a few fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 861
diff changeset
333 return 1
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
334 r = cmp(getattr(self, attr), getattr(other, attr))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
335 if r: return r
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
336 if not hasattr(other, 'second'):
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
337 return 1
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
338 if int_seconds:
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
339 return cmp(int(self.second), int(other.second))
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
340 return cmp(self.second, other.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
341
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
342 def __str__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
343 """Return this date as a string in the yyyy-mm-dd.hh:mm:ss format."""
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
344 return self.formal()
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
345
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
346 def formal(self, sep='.', sec='%02d'):
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
347 f = '%%4d-%%02d-%%02d%s%%02d:%%02d:%s'%(sep, sec)
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
348 return f%(self.year, self.month, self.day, self.hour, self.minute,
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
349 self.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
350
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
351 def pretty(self, format='%d %B %Y'):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
352 ''' print up the date date using a pretty format...
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
353
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
354 Note that if the day is zero, and the day appears first in the
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
355 format, then the day number will be removed from output.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
356 '''
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
357 str = time.strftime(format, (self.year, self.month, self.day,
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
358 self.hour, self.minute, self.second, 0, 0, 0))
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
359 # handle zero day by removing it
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
360 if format.startswith('%d') and str[0] == '0':
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
361 return ' ' + str[1:]
585
c08fb4921eda %e is a UNIXism and not documented for Python
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 543
diff changeset
362 return str
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
363
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
364 def __repr__(self):
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
365 return '<Date %s>'%self.formal(sec='%f')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
366
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
367 def local(self, offset):
1318
46a1951fdb14 fix Date.local()
Richard Jones <richard@users.sourceforge.net>
parents: 1272
diff changeset
368 """ Return this date as yyyy-mm-dd.hh:mm:ss in a local time zone.
46a1951fdb14 fix Date.local()
Richard Jones <richard@users.sourceforge.net>
parents: 1272
diff changeset
369 """
46a1951fdb14 fix Date.local()
Richard Jones <richard@users.sourceforge.net>
parents: 1272
diff changeset
370 return Date((self.year, self.month, self.day, self.hour + offset,
46a1951fdb14 fix Date.local()
Richard Jones <richard@users.sourceforge.net>
parents: 1272
diff changeset
371 self.minute, self.second, 0, 0, 0))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
372
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
373 def __deepcopy__(self, memo):
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
374 return Date((self.year, self.month, self.day, self.hour,
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
375 self.minute, self.second, 0, 0, 0))
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
376
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
377 def get_tuple(self):
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
378 return (self.year, self.month, self.day, self.hour, self.minute,
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
379 self.second, 0, 0, 0)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
380
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
381 def serialise(self):
2250
1f243574af52 fixed sqlite journal ordering issue
Richard Jones <richard@users.sourceforge.net>
parents: 2212
diff changeset
382 return '%4d%02d%02d%02d%02d%f'%(self.year, self.month,
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
383 self.day, self.hour, self.minute, self.second)
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
384
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
385 def timestamp(self):
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
386 ''' return a UNIX timestamp for this date '''
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
387 frac = self.second - int(self.second)
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
388 ts = calendar.timegm((self.year, self.month, self.day, self.hour,
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
389 self.minute, self.second, 0, 0, 0))
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
390 # we lose the fractional part
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
391 return ts + frac
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
392
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
393 class Interval:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
394 '''
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
395 Date intervals are specified using the suffixes "y", "m", and "d". The
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
396 suffix "w" (for "week") means 7 days. Time intervals are specified in
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
397 hh:mm:ss format (the seconds may be omitted, but the hours and minutes
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
398 may not).
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
399
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
400 "3y" means three years
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
401 "2y 1m" means two years and one month
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
402 "1m 25d" means one month and 25 days
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
403 "2w 3d" means two weeks and three days
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
404 "1d 2:50" means one day, two hours, and 50 minutes
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
405 "14:00" means 14 hours
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
406 "0:04:33" means four minutes and 33 seconds
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
407
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
408 Example usage:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
409 >>> Interval(" 3w 1 d 2:00")
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
410 <Interval + 22d 2:00>
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
411 >>> Date(". + 2d") + Interval("- 3w")
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
412 <Date 2000-06-07.00:34:02>
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
413 >>> Interval('1:59:59') + Interval('00:00:01')
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
414 <Interval + 2:00>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
415 >>> Interval('2:00') + Interval('- 00:00:01')
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
416 <Interval + 1:59:59>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
417 >>> Interval('1y')/2
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
418 <Interval + 6m>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
419 >>> Interval('1:00')/2
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
420 <Interval + 0:30>
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
421 >>> Interval('2003-03-18')
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
422 <Interval + [number of days between now and 2003-03-18]>
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
423 >>> Interval('-4d 2003-03-18')
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
424 <Interval + [number of days between now and 2003-03-14]>
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
425
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
426 Interval arithmetic is handled in a couple of special ways, trying
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
427 to cater for the most common cases. Fundamentally, Intervals which
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
428 have both date and time parts will result in strange results in
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
429 arithmetic - because of the impossibility of handling day->month->year
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
430 over- and under-flows. Intervals may also be divided by some number.
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
431
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
432 Intervals are added to Dates in order of:
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
433 seconds, minutes, hours, years, months, days
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
434
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
435 Calculations involving months (eg '+2m') have no effect on days - only
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
436 days (or over/underflow from hours/mins/secs) will do that, and
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
437 days-per-month and leap years are accounted for. Leap seconds are not.
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
438
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
439 The interval format 'syyyymmddHHMMSS' (sign, year, month, day, hour,
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
440 minute, second) is the serialisation format returned by the serialise()
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
441 method, and is accepted as an argument on instatiation.
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
442
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
443 TODO: more examples, showing the order of addition operation
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
444 '''
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
445 def __init__(self, spec, sign=1, allowdate=1, add_granularity=0,
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
446 translator=i18n
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
447 ):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
448 """Construct an interval given a specification."""
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
449 self._ = translator.gettext
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
450 self.ngettext = translator.ngettext
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
451 if type(spec) in (IntType, FloatType, LongType):
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
452 self.from_seconds(spec)
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
453 elif type(spec) in (StringType, UnicodeType):
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
454 self.set(spec, allowdate=allowdate, add_granularity=add_granularity)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
455 else:
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
456 if len(spec) == 7:
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
457 self.sign, self.year, self.month, self.day, self.hour, \
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
458 self.minute, self.second = spec
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
459 self.second = int(self.second)
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
460 else:
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
461 # old, buggy spec form
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
462 self.sign = sign
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
463 self.year, self.month, self.day, self.hour, self.minute, \
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
464 self.second = spec
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
465 self.second = int(self.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
466
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
467 def __deepcopy__(self, memo):
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
468 return Interval((self.sign, self.year, self.month, self.day,
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
469 self.hour, self.minute, self.second))
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
470
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
471 def set(self, spec, allowdate=1, interval_re=re.compile('''
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
472 \s*(?P<s>[-+])? # + or -
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
473 \s*((?P<y>\d+\s*)y)? # year
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
474 \s*((?P<m>\d+\s*)m)? # month
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
475 \s*((?P<w>\d+\s*)w)? # week
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
476 \s*((?P<d>\d+\s*)d)? # day
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
477 \s*(((?P<H>\d+):(?P<M>\d+))?(:(?P<S>\d+))?)? # time
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
478 \s*(?P<D>
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
479 (\d\d\d\d[/-])?(\d\d?)?[/-](\d\d?)? # [yyyy-]mm-dd
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
480 \.? # .
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
481 (\d?\d:\d\d)?(:\d\d)? # hh:mm:ss
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
482 )?''', re.VERBOSE), serialised_re=re.compile('''
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
483 (?P<s>[+-])?1?(?P<y>([ ]{3}\d|\d{4}))(?P<m>\d{2})(?P<d>\d{2})
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
484 (?P<H>\d{2})(?P<M>\d{2})(?P<S>\d{2})''', re.VERBOSE),
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
485 add_granularity=0):
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
486 ''' set the date to the value in spec
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
487 '''
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
488 self.year = self.month = self.week = self.day = self.hour = \
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
489 self.minute = self.second = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
490 self.sign = 1
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
491 m = serialised_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
492 if not m:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
493 m = interval_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
494 if not m:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
495 raise ValueError, self._('Not an interval spec:'
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
496 ' [+-] [#y] [#m] [#w] [#d] [[[H]H:MM]:SS] [date spec]')
1542
3faabaeab6aa fixed date unserialisation for *dbm backends
Richard Jones <richard@users.sourceforge.net>
parents: 1537
diff changeset
497 else:
3faabaeab6aa fixed date unserialisation for *dbm backends
Richard Jones <richard@users.sourceforge.net>
parents: 1537
diff changeset
498 allowdate = 0
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
499
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
500 # pull out all the info specified
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
501 info = m.groupdict()
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
502 if add_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
503 _add_granularity(info, 'SMHdwmy', (info['s']=='-' and -1 or 1))
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
504
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
505 valid = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
506 for group, attr in {'y':'year', 'm':'month', 'w':'week', 'd':'day',
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
507 'H':'hour', 'M':'minute', 'S':'second'}.items():
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
508 if info.get(group, None) is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
509 valid = 1
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
510 setattr(self, attr, int(info[group]))
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
511
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
512 # make sure it's valid
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
513 if not valid and not info['D']:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
514 raise ValueError, self._('Not an interval spec:'
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
515 ' [+-] [#y] [#m] [#w] [#d] [[[H]H:MM]:SS]')
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
516
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
517 if self.week:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
518 self.day = self.day + self.week*7
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
519
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
520 if info['s'] is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
521 self.sign = {'+':1, '-':-1}[info['s']]
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
522
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
523 # use a date spec if one is given
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
524 if allowdate and info['D'] is not None:
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
525 now = Date('.')
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
526 date = Date(info['D'])
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
527 # if no time part was specified, nuke it in the "now" date
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
528 if not date.hour or date.minute or date.second:
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
529 now.hour = now.minute = now.second = 0
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
530 if date != now:
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
531 y = now - (date + self)
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
532 self.__init__(y.get_tuple())
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
533
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
534 def __cmp__(self, other):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
535 """Compare this interval to another interval."""
543
22e0edf7da6e lots of date/interval related changes: more relaxed date format for input
Richard Jones <richard@users.sourceforge.net>
parents: 501
diff changeset
536 if other is None:
1505
c101d2ff5a20 fix to [SF#691071], really this time
Richard Jones <richard@users.sourceforge.net>
parents: 1499
diff changeset
537 # we are always larger than None
543
22e0edf7da6e lots of date/interval related changes: more relaxed date format for input
Richard Jones <richard@users.sourceforge.net>
parents: 501
diff changeset
538 return 1
1494
66cc5c2819dd oops, Interval sorting ignored sign
Richard Jones <richard@users.sourceforge.net>
parents: 1487
diff changeset
539 for attr in 'sign year month day hour minute second'.split():
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
540 r = cmp(getattr(self, attr), getattr(other, attr))
1494
66cc5c2819dd oops, Interval sorting ignored sign
Richard Jones <richard@users.sourceforge.net>
parents: 1487
diff changeset
541 if r:
66cc5c2819dd oops, Interval sorting ignored sign
Richard Jones <richard@users.sourceforge.net>
parents: 1487
diff changeset
542 return r
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
543 return 0
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
544
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
545 def __str__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
546 """Return this interval as a string."""
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
547 l = []
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
548 if self.year: l.append('%sy'%self.year)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
549 if self.month: l.append('%sm'%self.month)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
550 if self.day: l.append('%sd'%self.day)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
551 if self.second:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
552 l.append('%d:%02d:%02d'%(self.hour, self.minute, self.second))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
553 elif self.hour or self.minute:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
554 l.append('%d:%02d'%(self.hour, self.minute))
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
555 if l:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
556 l.insert(0, {1:'+', -1:'-'}[self.sign])
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
557 else:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
558 l.append('00:00')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
559 return ' '.join(l)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
560
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
561 def __add__(self, other):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
562 if isinstance(other, Date):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
563 # the other is a Date - produce a Date
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
564 return Date(other.addInterval(self))
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
565 elif isinstance(other, Interval):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
566 # add the other Interval to this one
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
567 a = self.get_tuple()
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
568 as = a[0]
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
569 b = other.get_tuple()
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
570 bs = b[0]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
571 i = [as*x + bs*y for x,y in zip(a[1:],b[1:])]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
572 i.insert(0, 1)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
573 i = fixTimeOverflow(i)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
574 return Interval(i)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
575 # nope, no idea what to do with this other...
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
576 raise TypeError, "Can't add %r"%other
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
577
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
578 def __sub__(self, other):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
579 if isinstance(other, Date):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
580 # the other is a Date - produce a Date
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
581 interval = Interval(self.get_tuple())
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
582 interval.sign *= -1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
583 return Date(other.addInterval(interval))
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
584 elif isinstance(other, Interval):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
585 # add the other Interval to this one
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
586 a = self.get_tuple()
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
587 as = a[0]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
588 b = other.get_tuple()
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
589 bs = b[0]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
590 i = [as*x - bs*y for x,y in zip(a[1:],b[1:])]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
591 i.insert(0, 1)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
592 i = fixTimeOverflow(i)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
593 return Interval(i)
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
594 # nope, no idea what to do with this other...
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
595 raise TypeError, "Can't add %r"%other
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
596
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
597 def __div__(self, other):
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
598 """ Divide this interval by an int value.
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
599
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
600 Can't divide years and months sensibly in the _same_
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
601 calculation as days/time, so raise an error in that situation.
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
602 """
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
603 try:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
604 other = float(other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
605 except TypeError:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
606 raise ValueError, "Can only divide Intervals by numbers"
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
607
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
608 y, m, d, H, M, S = (self.year, self.month, self.day,
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
609 self.hour, self.minute, self.second)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
610 if y or m:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
611 if d or H or M or S:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
612 raise ValueError, "Can't divide Interval with date and time"
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
613 months = self.year*12 + self.month
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
614 months *= self.sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
615
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
616 months = int(months/other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
617
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
618 sign = months<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
619 m = months%12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
620 y = months / 12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
621 return Interval((sign, y, m, 0, 0, 0, 0))
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
622
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
623 else:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
624 # handle a day/time division
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
625 seconds = S + M*60 + H*60*60 + d*60*60*24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
626 seconds *= self.sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
627
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
628 seconds = int(seconds/other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
629
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
630 sign = seconds<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
631 seconds *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
632 S = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
633 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
634 M = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
635 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
636 H = seconds%24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
637 d = seconds / 24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
638 return Interval((sign, 0, 0, d, H, M, S))
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
639
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
640 def __repr__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
641 return '<Interval %s>'%self.__str__()
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
642
487
2f4c37d28108 I18N'ification
Richard Jones <richard@users.sourceforge.net>
parents: 406
diff changeset
643 def pretty(self):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
644 ''' print up the date date using one of these nice formats..
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
645 '''
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
646 _quarters = self.minute / 15
720
5e0a75bfdd90 reverting to dates for intervals > 2 months sucks
Richard Jones <richard@users.sourceforge.net>
parents: 641
diff changeset
647 if self.year:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
648 s = self.ngettext("%(number)s year", "%(number)s years",
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
649 self.year) % {'number': self.year}
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
650 elif self.month or self.day > 28:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
651 _months = int(((self.month * 30) + self.day) / 30)
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
652 s = self.ngettext("%(number)s month", "%(number)s months",
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
653 _months) % {'number': _months}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
654 elif self.day > 7:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
655 _weeks = int(self.day / 7)
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
656 s = self.ngettext("%(number)s week", "%(number)s weeks",
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
657 _weeks) % {'number': _weeks}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
658 elif self.day > 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
659 # Note: singular form is not used
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
660 s = self.ngettext('%(number)s day', '%(number)s days',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
661 self.day) % {'number': self.day}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
662 elif self.day == 1 or self.hour > 12:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
663 if self.sign > 0:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
664 return self._('tomorrow')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
665 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
666 return self._('yesterday')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
667 elif self.hour > 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
668 # Note: singular form is not used
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
669 s = self.ngettext('%(number)s hour', '%(number)s hours',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
670 self.hour) % {'number': self.hour}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
671 elif self.hour == 1:
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
672 if self.minute < 15:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
673 s = self._('an hour')
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
674 elif _quarters == 2:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
675 s = self._('1 1/2 hours')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
676 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
677 s = self.ngettext('1 %(number)s/4 hours',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
678 '1 %(number)s/4 hours', _quarters) % {'number': _quarters}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
679 elif self.minute < 1:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
680 if self.sign > 0:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
681 return self._('in a moment')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
682 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
683 return self._('just now')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
684 elif self.minute == 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
685 # Note: used in expressions "in 1 minute" or "1 minute ago"
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
686 s = self._('1 minute')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
687 elif self.minute < 15:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
688 # Note: used in expressions "in 2 minutes" or "2 minutes ago"
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
689 s = self.ngettext('%(number)s minute', '%(number)s minutes',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
690 self.minute) % {'number': self.minute}
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
691 elif _quarters == 2:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
692 s = self._('1/2 an hour')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
693 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
694 s = self.ngettext('%(number)s/4 hours', '%(number)s/4 hours',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
695 _quarters) % {'number': _quarters}
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
696 # XXX this is internationally broken
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
697 if self.sign < 0:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
698 s = self._('%s ago') % s
1413
4ae9d725bec4 make future intervals obvious too
Richard Jones <richard@users.sourceforge.net>
parents: 1412
diff changeset
699 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
700 s = self._('in %s') % s
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
701 return s
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
702
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
703 def get_tuple(self):
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
704 return (self.sign, self.year, self.month, self.day, self.hour,
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
705 self.minute, self.second)
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
706
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
707 def serialise(self):
1261
85d71588a1cf fixed bug in Interval serialisation
Richard Jones <richard@users.sourceforge.net>
parents: 1192
diff changeset
708 sign = self.sign > 0 and '+' or '-'
85d71588a1cf fixed bug in Interval serialisation
Richard Jones <richard@users.sourceforge.net>
parents: 1192
diff changeset
709 return '%s%04d%02d%02d%02d%02d%02d'%(sign, self.year, self.month,
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
710 self.day, self.hour, self.minute, self.second)
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
711
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
712 def as_seconds(self):
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
713 '''Calculate the Interval as a number of seconds.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
714
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
715 Months are counted as 30 days, years as 365 days. Returns a Long
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
716 int.
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
717 '''
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
718 n = self.year * 365L
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
719 n = n + self.month * 30
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
720 n = n + self.day
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
721 n = n * 24
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
722 n = n + self.hour
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
723 n = n * 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
724 n = n + self.minute
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
725 n = n * 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
726 n = n + self.second
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
727 return n * self.sign
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
728
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
729 def from_seconds(self, val):
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
730 '''Figure my second, minute, hour and day values using a seconds
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
731 value.
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
732 '''
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
733 if val < 0:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
734 self.sign = -1
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
735 val = -val
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
736 else:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
737 self.sign = 1
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
738 self.second = val % 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
739 val = val / 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
740 self.minute = val % 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
741 val = val / 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
742 self.hour = val % 24
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
743 val = val / 24
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
744 self.day = val
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
745 self.month = self.year = 0
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
746
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
747
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
748 def fixTimeOverflow(time):
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
749 """ Handle the overflow in the time portion (H, M, S) of "time":
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
750 (sign, y,m,d,H,M,S)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
751
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
752 Overflow and underflow will at most affect the _days_ portion of
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
753 the date. We do not overflow days to months as we don't know _how_
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
754 to, generally.
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
755 """
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
756 # XXX we could conceivably use this function for handling regular dates
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
757 # XXX too - we just need to interrogate the month/year for the day
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
758 # XXX overflow...
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
759
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
760 sign, y, m, d, H, M, S = time
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
761 seconds = sign * (S + M*60 + H*60*60 + d*60*60*24)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
762 if seconds:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
763 sign = seconds<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
764 seconds *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
765 S = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
766 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
767 M = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
768 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
769 H = seconds%24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
770 d = seconds / 24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
771 else:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
772 months = y*12 + m
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
773 sign = months<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
774 months *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
775 m = months%12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
776 y = months/12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
777
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
778 return (sign, y, m, d, H, M, S)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
779
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
780 class Range:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
781 """Represents range between two values
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
782 Ranges can be created using one of theese two alternative syntaxes:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
783
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
784 1. Native english syntax::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
785
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
786 [[From] <value>][ To <value>]
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
787
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
788 Keywords "From" and "To" are case insensitive. Keyword "From" is
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
789 optional.
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
790
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
791 2. "Geek" syntax::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
792
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
793 [<value>][; <value>]
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
794
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
795 Either first or second <value> can be omitted in both syntaxes.
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
796
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
797 Examples (consider local time is Sat Mar 8 22:07:48 EET 2003)::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
798
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
799 >>> Range("from 2-12 to 4-2")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
800 <Range from 2003-02-12.00:00:00 to 2003-04-02.00:00:00>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
801
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
802 >>> Range("18:00 TO +2m")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
803 <Range from 2003-03-08.18:00:00 to 2003-05-08.20:07:48>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
804
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
805 >>> Range("12:00")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
806 <Range from 2003-03-08.12:00:00 to None>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
807
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
808 >>> Range("tO +3d")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
809 <Range from None to 2003-03-11.20:07:48>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
810
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
811 >>> Range("2002-11-10; 2002-12-12")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
812 <Range from 2002-11-10.00:00:00 to 2002-12-12.00:00:00>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
813
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
814 >>> Range("; 20:00 +1d")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
815 <Range from None to 2003-03-09.20:00:00>
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
816
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
817 """
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
818 def __init__(self, spec, Type, allow_granularity=1, **params):
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
819 """Initializes Range of type <Type> from given <spec> string.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
820
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
821 Sets two properties - from_value and to_value. None assigned to any of
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
822 this properties means "infinitum" (-infinitum to from_value and
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
823 +infinitum to to_value)
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
824
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
825 The Type parameter here should be class itself (e.g. Date), not a
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
826 class instance.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
827
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
828 """
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
829 self.range_type = Type
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
830 re_range = r'(?:^|from(.+?))(?:to(.+?)$|$)'
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
831 re_geek_range = r'(?:^|(.+?));(?:(.+?)$|$)'
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
832 # Check which syntax to use
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
833 if spec.find(';') == -1:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
834 # Native english
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
835 mch_range = re.search(re_range, spec.strip(), re.IGNORECASE)
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
836 else:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
837 # Geek
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
838 mch_range = re.search(re_geek_range, spec.strip())
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
839 if mch_range:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
840 self.from_value, self.to_value = mch_range.groups()
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
841 if self.from_value:
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
842 self.from_value = Type(self.from_value.strip(), **params)
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
843 if self.to_value:
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
844 self.to_value = Type(self.to_value.strip(), **params)
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
845 else:
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
846 if allow_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
847 self.from_value = Type(spec, **params)
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
848 self.to_value = Type(spec, add_granularity=1, **params)
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
849 else:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
850 raise ValueError, "Invalid range"
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
851
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
852 def __str__(self):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
853 return "from %s to %s" % (self.from_value, self.to_value)
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
854
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
855 def __repr__(self):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
856 return "<Range %s>" % self.__str__()
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
857
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
858 def test_range():
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
859 rspecs = ("from 2-12 to 4-2", "from 18:00 TO +2m", "12:00;", "tO +3d",
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
860 "2002-11-10; 2002-12-12", "; 20:00 +1d", '2002-10-12')
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
861 rispecs = ('from -1w 2d 4:32 to 4d', '-2w 1d')
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
862 for rspec in rspecs:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
863 print '>>> Range("%s")' % rspec
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
864 print `Range(rspec, Date)`
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
865 print
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
866 for rspec in rispecs:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
867 print '>>> Range("%s")' % rspec
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
868 print `Range(rspec, Interval)`
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
869 print
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
870
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
871 def test():
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
872 intervals = (" 3w 1 d 2:00", " + 2d", "3w")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
873 for interval in intervals:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
874 print '>>> Interval("%s")'%interval
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
875 print `Interval(interval)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
876
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
877 dates = (".", "2000-06-25.19:34:02", ". + 2d", "1997-04-17", "01-25",
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
878 "08-13.22:13", "14:25", '2002-12')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
879 for date in dates:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
880 print '>>> Date("%s")'%date
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
881 print `Date(date)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
882
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
883 sums = ((". + 2d", "3w"), (".", " 3w 1 d 2:00"))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
884 for date, interval in sums:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
885 print '>>> Date("%s") + Interval("%s")'%(date, interval)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
886 print `Date(date) + Interval(interval)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
887
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
888 if __name__ == '__main__':
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
889 test()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
890
127
0791d13baea7 Added vim command to all source so that we don't get no steenkin' tabs :)
Richard Jones <richard@users.sourceforge.net>
parents: 75
diff changeset
891 # vim: set filetype=python ts=4 sw=4 et si

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