annotate roundup/date.py @ 1896:b3f63a0615db maint-0.6

backport of Date arithmetic fixes from trunk
author Anthony Baxter <anthonybaxter@users.sourceforge.net>
date Tue, 04 Nov 2003 12:39:54 +0000
parents 2047425bf7e7
children 27b9292a2fe6
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.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
17 #
1896
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
18 # $Id: date.py,v 1.54.2.1 2003-11-04 12:39:54 anthonybaxter Exp $
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 248
diff changeset
19
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 248
diff changeset
20 __doc__ = """
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 248
diff changeset
21 Date, time and time interval handling.
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 248
diff changeset
22 """
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
501
e0944187229f missed an import _
Richard Jones <richard@users.sourceforge.net>
parents: 487
diff changeset
25 from i18n import _
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
27 def _add_granularity(src, order, value = 1):
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
28 '''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
29 parameter
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
30 '''
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
31 for gran in order:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
32 if src[gran]:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
33 src[gran] = int(src[gran]) + value
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
34 break
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
35
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 class Date:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 '''
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 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
39 international standard format (yyyy-mm-dd) joined to the time
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
40 (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
41 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
42 "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
43 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
44 format with the time always given in GMT. The full date format is
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 always exactly 19 characters long.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 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
48 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
49 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
50 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
51 care of these conversions. In the following examples, suppose that yyyy
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 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
53 of the month; and suppose that the user is on Eastern Standard Time.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 "2000-04-17" means <Date 2000-04-17.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 "01-25" means <Date yyyy-01-25.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 "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
58 "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
59 "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
60 "14:25" means <Date yyyy-mm-dd.19:25:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 "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
62 "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
63 "2003-06" means <Date 2003-06-01.00:00:00>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 "." means "right now"
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66 The Date class should understand simple date expressions of the form
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 stamp + interval and stamp - interval. When adding or subtracting
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 intervals involving months or years, the components are handled
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69 separately. For example, when evaluating "2000-06-25 + 1m 10d", we
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 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
71 2000-08-04 (rather than trying to decide whether 1m 10d means 38 or 40
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 or 41 days).
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 Example usage:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 >>> Date(".")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76 <Date 2000-06-26.00:34:02>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 >>> _.local(-5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 "2000-06-25.19:34:02"
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 >>> Date(". + 2d")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 <Date 2000-06-28.00:34:02>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 >>> Date("1997-04-17", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 <Date 1997-04-17.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 >>> Date("01-25", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 <Date 2000-01-25.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 >>> Date("08-13.22:13", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 <Date 2000-08-14.03:13:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 >>> Date("14:25", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 <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
89
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
90 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
91 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
92 method, and is accepted as an argument on instatiation.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 '''
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
94
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
95 def __init__(self, spec='.', offset=0, add_granularity=0):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 """Construct a date given a specification and a time zone offset.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 'spec' is a full date or a partial form, with an optional
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
99 added or subtracted interval. Or a date 9-tuple.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 'offset' is the local time zone offset from GMT in hours.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 """
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
102 if type(spec) == type(''):
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
103 self.set(spec, offset=offset, add_granularity=add_granularity)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 else:
75
fa5aea4c212e Fixed offset handling (shoulda read the spec a little better)
Richard Jones <richard@users.sourceforge.net>
parents: 47
diff changeset
105 y,m,d,H,M,S,x,x,x = spec
fa5aea4c212e Fixed offset handling (shoulda read the spec a little better)
Richard Jones <richard@users.sourceforge.net>
parents: 47
diff changeset
106 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
107 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
108 self.second, x, x, x = time.gmtime(ts)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
110 usagespec='[yyyy]-[mm]-[dd].[H]H:MM[:SS][offset]'
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
111 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
112 ((?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
113 |(?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
114 (?P<n>\.)? # .
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
115 (((?P<H>\d?\d):(?P<M>\d\d))?(:(?P<S>\d\d))?)? # hh:mm:ss
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
116 (?P<o>.+)? # offset
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
117 ''', re.VERBOSE), serialised_re=re.compile(r'''
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
118 (\d{4})(\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
119 ''', 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
120 ''' 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
121 '''
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
122
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
123 m = serialised_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
124 if m is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
125 # we're serialised - easy!
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
126 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
127 self.second = map(int, m.groups()[:6])
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
128 return
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
129
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
130 # 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
131 m = date_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
132 if m is None:
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
133 raise ValueError, _('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
134
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
135 info = m.groupdict()
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
136
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
137 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
138 _add_granularity(info, 'SMHdmyab')
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
139
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
140 # get the current date as our default
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
141 y,m,d,H,M,S,x,x,x = time.gmtime(time.time())
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
142
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
143 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
144 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
145 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
146 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
147 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
148 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
149 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
150 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
151 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
152 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
153 d = int(info['b'])
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
154 H = -offset
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
155 M = S = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
156
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
157 # override hour, minute, second parts
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
158 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
159 H = int(info['H']) - offset
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
160 M = int(info['M'])
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
161 S = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
162 if info['S'] is not None: S = int(info['S'])
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
163
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
164 if add_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
165 S = S - 1
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
166
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
167 # now handle the adjustment of hour
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
168 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
169 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
170 self.second, x, x, x = time.gmtime(ts)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
171
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
172 if info.get('o', None):
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
173 try:
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
174 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
175 except ValueError:
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
176 raise ValueError, _('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
177
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
178 def addInterval(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
179 ''' Add the interval to this date, returning the date tuple
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 '''
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
181 # 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
182 sign = interval.sign
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
183 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
184 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
185 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
186 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
187 minute = self.minute + sign * interval.minute
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
188 second = self.second + sign * interval.second
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
189
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
190 # now cope with under- and over-flow
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
191 # first do the time
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
192 while (second < 0 or second > 59 or minute < 0 or minute > 59 or
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
193 hour < 0 or hour > 59):
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
194 if second < 0: minute -= 1; second += 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
195 elif second > 59: minute += 1; second -= 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
196 if minute < 0: hour -= 1; minute += 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
197 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
198 if hour < 0: day -= 1; hour += 24
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
199 elif hour > 59: day += 1; hour -= 24
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
200
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
201 # 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
202 while month < 1 or month > 12:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
203 if month < 1: year -= 1; month += 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
204 if month > 12: year += 1; month -= 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
205
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
206 # now do the days, now that we know what month we're in
1896
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
207 def get_mdays(year,month):
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
208 if month == 2 and calendar.isleap(year): return 29
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
209 else: return calendar.mdays[month]
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
210
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
211 while month < 1 or month > 12 or day < 0 or day > get_mdays(year,month):
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
212 # now to day under/over
1896
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
213 if day < 0:
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
214 # When going backwards, decrement month, then increment days
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
215 month -= 1
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
216 day += get_mdays(year,month)
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
217 elif day > get_mdays(year,month):
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
218 # When going forwards, decrement days, then increment month
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
219 day -= get_mdays(year,month)
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
220 month += 1
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
221
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
222 # 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
223 while month < 1 or month > 12:
1896
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
224 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
225 if month > 12: year += 1; month -= 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
226
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
227 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
228
1896
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
229 def differenceDate(self, other):
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
230 "Return the difference between this date and another date"
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
231
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
232 def applyInterval(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
233 ''' 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
234 '''
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
235 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
236 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
237
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
238 def __add__(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
239 """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
240 """
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
241 return Date(self.addInterval(interval))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1094
diff changeset
243 # deviates from spec to allow subtraction of dates as well
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 def __sub__(self, other):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245 """ Subtract:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246 1. an interval from this date to produce another date.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247 2. a date from this date to produce an interval.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 """
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
249 if isinstance(other, Interval):
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
250 other = Interval(other.get_tuple())
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
251 other.sign *= -1
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
252 return self.__add__(other)
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
253
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
254 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
255
1896
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
256 return self.dateDelta(other)
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
257
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
258 def dateDelta(self, other):
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
259 """ Produce an Interval of the difference between this date
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
260 and another date. Only returns days:hours:minutes:seconds.
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
261 """
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
262 # Returning intervals larger than a day is almost
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
263 # 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
264 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
265 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
266 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
267 other.hour, other.minute, other.second, 0, 0, 0))
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
268 diff = a - b
1896
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
269 if diff > 0:
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
270 sign = 1
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
271 else:
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
272 sign = -1
1896
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
273 diff = -diff
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
274 S = diff%60
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
275 M = (diff/60)%60
1896
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
276 H = (diff/(60*60))%24
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
277 d = diff/(24*60*60)
b3f63a0615db backport of Date arithmetic fixes from trunk
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
278 return Interval((0, 0, d, H, M, S), sign=sign)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280 def __cmp__(self, other):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 """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
282 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
283 return 1
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284 for attr in ('year', 'month', 'day', 'hour', 'minute', 'second'):
890
a568596dbea7 Unit tests and a few fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 861
diff changeset
285 if not hasattr(other, attr):
a568596dbea7 Unit tests and a few fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 861
diff changeset
286 return 1
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 r = cmp(getattr(self, attr), getattr(other, attr))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288 if r: return r
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
289 return 0
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291 def __str__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292 """Return this date as a string in the yyyy-mm-dd.hh:mm:ss format."""
206
1eb862f4bf56 Changed date.Date to use regular string formatting instead of strftime.
Richard Jones <richard@users.sourceforge.net>
parents: 179
diff changeset
293 return '%4d-%02d-%02d.%02d:%02d:%02d'%(self.year, self.month, self.day,
1eb862f4bf56 Changed date.Date to use regular string formatting instead of strftime.
Richard Jones <richard@users.sourceforge.net>
parents: 179
diff changeset
294 self.hour, self.minute, self.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
296 def pretty(self, format='%d %B %Y'):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297 ''' 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
298
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
299 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
300 format, then the day number will be removed from output.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
301 '''
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
302 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
303 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
304 # handle zero day by removing it
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
305 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
306 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
307 return str
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
308
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
309 def __repr__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
310 return '<Date %s>'%self.__str__()
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
311
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
312 def local(self, offset):
1318
46a1951fdb14 fix Date.local()
Richard Jones <richard@users.sourceforge.net>
parents: 1272
diff changeset
313 """ 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
314 """
46a1951fdb14 fix Date.local()
Richard Jones <richard@users.sourceforge.net>
parents: 1272
diff changeset
315 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
316 self.minute, self.second, 0, 0, 0))
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
317
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
318 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
319 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
320 self.second, 0, 0, 0)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
321
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
322 def serialise(self):
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
323 return '%4d%02d%02d%02d%02d%02d'%(self.year, self.month,
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
324 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
325
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
326 class Interval:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
327 '''
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328 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
329 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
330 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
331 may not).
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
332
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
333 "3y" means three years
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
334 "2y 1m" means two years and one month
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
335 "1m 25d" means one month and 25 days
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
336 "2w 3d" means two weeks and three days
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
337 "1d 2:50" means one day, two hours, and 50 minutes
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
338 "14:00" means 14 hours
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
339 "0:04:33" means four minutes and 33 seconds
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
340
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
341 Example usage:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
342 >>> Interval(" 3w 1 d 2:00")
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
343 <Interval + 22d 2:00>
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
344 >>> Date(". + 2d") + Interval("- 3w")
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
345 <Date 2000-06-07.00:34:02>
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
346 >>> Interval('1:59:59') + Interval('00:00:01')
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
347 <Interval + 2:00>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
348 >>> Interval('2:00') + Interval('- 00:00:01')
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
349 <Interval + 1:59:59>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
350 >>> Interval('1y')/2
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
351 <Interval + 6m>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
352 >>> Interval('1:00')/2
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
353 <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
354 >>> 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
355 <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
356 >>> 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
357 <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
358
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
359 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
360 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
361 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
362 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
363 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
364
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
365 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
366 seconds, minutes, hours, years, months, days
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
367
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
368 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
369 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
370 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
371
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
372 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
373 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
374 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
375
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
376 TODO: more examples, showing the order of addition operation
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
377 '''
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
378 def __init__(self, spec, sign=1, allowdate=1, add_granularity=0):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
379 """Construct an interval given a specification."""
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
380 if type(spec) == type(''):
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
381 self.set(spec, allowdate=allowdate, add_granularity=add_granularity)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
382 else:
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
383 if len(spec) == 7:
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
384 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
385 self.minute, self.second = spec
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
386 else:
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
387 # old, buggy spec form
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
388 self.sign = sign
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
389 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
390 self.second = spec
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
391
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
392 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
393 \s*(?P<s>[-+])? # + or -
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
394 \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
395 \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
396 \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
397 \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
398 \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
399 \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
400 (\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
401 \.? # .
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
402 (\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
403 )?''', 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
404 (?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
405 (?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
406 add_granularity=0):
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
407 ''' 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
408 '''
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
409 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
410 self.minute = self.second = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
411 self.sign = 1
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
412 m = serialised_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
413 if not m:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
414 m = interval_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
415 if not m:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
416 raise ValueError, _('Not an interval spec: [+-] [#y] [#m] [#w] '
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
417 '[#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
418 else:
3faabaeab6aa fixed date unserialisation for *dbm backends
Richard Jones <richard@users.sourceforge.net>
parents: 1537
diff changeset
419 allowdate = 0
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
420
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
421 # 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
422 info = m.groupdict()
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
423 if add_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
424 _add_granularity(info, 'SMHdwmy', (info['s']=='-' and -1 or 1))
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
425
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
426 valid = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
427 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
428 '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
429 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
430 valid = 1
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
431 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
432
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
433 # 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
434 if not valid and not info['D']:
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
435 raise ValueError, _('Not an interval spec: [+-] [#y] [#m] [#w] '
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
436 '[#d] [[[H]H:MM]:SS]')
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
437
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
438 if self.week:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
439 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
440
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
441 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
442 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
443
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
444 # 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
445 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
446 now = Date('.')
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
447 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
448 # 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
449 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
450 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
451 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
452 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
453 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
454
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
455 def __cmp__(self, other):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
456 """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
457 if other is None:
1505
c101d2ff5a20 fix to [SF#691071], really this time
Richard Jones <richard@users.sourceforge.net>
parents: 1499
diff changeset
458 # 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
459 return 1
1494
66cc5c2819dd oops, Interval sorting ignored sign
Richard Jones <richard@users.sourceforge.net>
parents: 1487
diff changeset
460 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
461 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
462 if r:
66cc5c2819dd oops, Interval sorting ignored sign
Richard Jones <richard@users.sourceforge.net>
parents: 1487
diff changeset
463 return r
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
464 return 0
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
465
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
466 def __str__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
467 """Return this interval as a string."""
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
468 l = []
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
469 if self.year: l.append('%sy'%self.year)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
470 if self.month: l.append('%sm'%self.month)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
471 if self.day: l.append('%sd'%self.day)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
472 if self.second:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
473 l.append('%d:%02d:%02d'%(self.hour, self.minute, self.second))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
474 elif self.hour or self.minute:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
475 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
476 if l:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
477 l.insert(0, {1:'+', -1:'-'}[self.sign])
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
478 return ' '.join(l)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
479
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
480 def __add__(self, other):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
481 if isinstance(other, Date):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
482 # the other is a Date - produce a Date
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
483 return Date(other.addInterval(self))
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
484 elif isinstance(other, Interval):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
485 # add the other Interval to this one
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
486 a = self.get_tuple()
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
487 as = a[0]
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
488 b = other.get_tuple()
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
489 bs = b[0]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
490 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
491 i.insert(0, 1)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
492 i = fixTimeOverflow(i)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
493 return Interval(i)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
494 # 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
495 raise TypeError, "Can't add %r"%other
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
496
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
497 def __sub__(self, other):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
498 if isinstance(other, Date):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
499 # the other is a Date - produce a Date
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
500 interval = Interval(self.get_tuple())
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
501 interval.sign *= -1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
502 return Date(other.addInterval(interval))
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
503 elif isinstance(other, Interval):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
504 # add the other Interval to this one
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
505 a = self.get_tuple()
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
506 as = a[0]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
507 b = other.get_tuple()
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
508 bs = b[0]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
509 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
510 i.insert(0, 1)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
511 i = fixTimeOverflow(i)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
512 return Interval(i)
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
513 # 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
514 raise TypeError, "Can't add %r"%other
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
515
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
516 def __div__(self, other):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
517 ''' Divide this interval by an int value.
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
518
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
519 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
520 calculation as days/time, so raise an error in that situation.
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
521 '''
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
522 try:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
523 other = float(other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
524 except TypeError:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
525 raise ValueError, "Can only divide Intervals by numbers"
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
526
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
527 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
528 self.hour, self.minute, self.second)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
529 if y or m:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
530 if d or H or M or S:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
531 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
532 months = self.year*12 + self.month
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
533 months *= self.sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
534
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
535 months = int(months/other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
536
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
537 sign = months<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
538 m = months%12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
539 y = months / 12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
540 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
541
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
542 else:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
543 # handle a day/time division
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
544 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
545 seconds *= self.sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
546
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
547 seconds = int(seconds/other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
548
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
549 sign = seconds<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
550 seconds *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
551 S = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
552 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
553 M = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
554 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
555 H = seconds%24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
556 d = seconds / 24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
557 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
558
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
559 def __repr__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
560 return '<Interval %s>'%self.__str__()
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
561
487
2f4c37d28108 I18N'ification
Richard Jones <richard@users.sourceforge.net>
parents: 406
diff changeset
562 def pretty(self):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
563 ''' print up the date date using one of these nice formats..
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
564 '''
720
5e0a75bfdd90 reverting to dates for intervals > 2 months sucks
Richard Jones <richard@users.sourceforge.net>
parents: 641
diff changeset
565 if self.year:
5e0a75bfdd90 reverting to dates for intervals > 2 months sucks
Richard Jones <richard@users.sourceforge.net>
parents: 641
diff changeset
566 if self.year == 1:
5e0a75bfdd90 reverting to dates for intervals > 2 months sucks
Richard Jones <richard@users.sourceforge.net>
parents: 641
diff changeset
567 return _('1 year')
5e0a75bfdd90 reverting to dates for intervals > 2 months sucks
Richard Jones <richard@users.sourceforge.net>
parents: 641
diff changeset
568 else:
5e0a75bfdd90 reverting to dates for intervals > 2 months sucks
Richard Jones <richard@users.sourceforge.net>
parents: 641
diff changeset
569 return _('%(number)s years')%{'number': self.year}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
570 elif self.month or self.day > 13:
179
a44c70b25369 Extended the range of intervals that are pretty-printed...
Richard Jones <richard@users.sourceforge.net>
parents: 168
diff changeset
571 days = (self.month * 30) + self.day
a44c70b25369 Extended the range of intervals that are pretty-printed...
Richard Jones <richard@users.sourceforge.net>
parents: 168
diff changeset
572 if days > 28:
248
96cdd8ef0581 Added some more help to roundup-admin
Richard Jones <richard@users.sourceforge.net>
parents: 234
diff changeset
573 if int(days/30) > 1:
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
574 s = _('%(number)s months')%{'number': int(days/30)}
248
96cdd8ef0581 Added some more help to roundup-admin
Richard Jones <richard@users.sourceforge.net>
parents: 234
diff changeset
575 else:
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
576 s = _('1 month')
179
a44c70b25369 Extended the range of intervals that are pretty-printed...
Richard Jones <richard@users.sourceforge.net>
parents: 168
diff changeset
577 else:
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
578 s = _('%(number)s weeks')%{'number': int(days/7)}
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
579 elif self.day > 7:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
580 s = _('1 week')
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
581 elif self.day > 1:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
582 s = _('%(number)s days')%{'number': self.day}
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
583 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
584 if self.sign > 0:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
585 return _('tomorrow')
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
586 else:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
587 return _('yesterday')
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
588 elif self.hour > 1:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
589 s = _('%(number)s hours')%{'number': self.hour}
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
590 elif self.hour == 1:
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
591 if self.minute < 15:
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
592 s = _('an hour')
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
593 elif self.minute/15 == 2:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
594 s = _('1 1/2 hours')
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
595 else:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
596 s = _('1 %(number)s/4 hours')%{'number': self.minute/15}
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
597 elif self.minute < 1:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
598 if self.sign > 0:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
599 return _('in a moment')
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
600 else:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
601 return _('just now')
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
602 elif self.minute == 1:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
603 s = _('1 minute')
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
604 elif self.minute < 15:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
605 s = _('%(number)s minutes')%{'number': self.minute}
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
606 elif int(self.minute/15) == 2:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
607 s = _('1/2 an hour')
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
608 else:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
609 s = _('%(number)s/4 hour')%{'number': int(self.minute/15)}
1412
e5fb7d4bf251 add "ago" to intervals in the past [SF#679232]
Richard Jones <richard@users.sourceforge.net>
parents: 1339
diff changeset
610 if self.sign < 0:
e5fb7d4bf251 add "ago" to intervals in the past [SF#679232]
Richard Jones <richard@users.sourceforge.net>
parents: 1339
diff changeset
611 s = s + _(' ago')
1413
4ae9d725bec4 make future intervals obvious too
Richard Jones <richard@users.sourceforge.net>
parents: 1412
diff changeset
612 else:
1600
2047425bf7e7 [SF#724626]
Richard Jones <richard@users.sourceforge.net>
parents: 1599
diff changeset
613 s = _('in ') + s
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
614 return s
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
615
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
616 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
617 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
618 self.minute, self.second)
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
619
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
620 def serialise(self):
1261
85d71588a1cf fixed bug in Interval serialisation
Richard Jones <richard@users.sourceforge.net>
parents: 1192
diff changeset
621 sign = self.sign > 0 and '+' or '-'
85d71588a1cf fixed bug in Interval serialisation
Richard Jones <richard@users.sourceforge.net>
parents: 1192
diff changeset
622 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
623 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
624
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
625 def fixTimeOverflow(time):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
626 ''' Handle the overflow in the time portion (H, M, S) of "time":
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
627 (sign, y,m,d,H,M,S)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
628
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
629 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
630 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
631 to, generally.
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
632 '''
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
633 # 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
634 # 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
635 # XXX overflow...
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
636
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
637 sign, y, m, d, H, M, S = time
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
638 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
639 if seconds:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
640 sign = seconds<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
641 seconds *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
642 S = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
643 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
644 M = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
645 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
646 H = seconds%24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
647 d = seconds / 24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
648 else:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
649 months = y*12 + m
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
650 sign = months<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
651 months *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
652 m = months%12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
653 y = months/12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
654
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
655 return (sign, y, m, d, H, M, S)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
656
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
657 class Range:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
658 """
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
659 Represents range between two values
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
660 Ranges can be created using one of theese two alternative syntaxes:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
661
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
662 1. Native english syntax:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
663 [[From] <value>][ To <value>]
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
664 Keywords "From" and "To" are case insensitive. Keyword "From" is optional.
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
665
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
666 2. "Geek" syntax:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
667 [<value>][; <value>]
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
668
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
669 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
670
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
671 Examples (consider local time is Sat Mar 8 22:07:48 EET 2003):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
672 >>> 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
673 <Range from 2003-02-12.00:00:00 to 2003-04-02.00:00:00>
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
674
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
675 >>> Range("18:00 TO +2m")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
676 <Range from 2003-03-08.18:00:00 to 2003-05-08.20:07:48>
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
677
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
678 >>> Range("12:00")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
679 <Range from 2003-03-08.12:00:00 to None>
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
680
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
681 >>> Range("tO +3d")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
682 <Range from None to 2003-03-11.20:07:48>
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
683
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
684 >>> 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
685 <Range from 2002-11-10.00:00:00 to 2002-12-12.00:00:00>
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
686
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
687 >>> Range("; 20:00 +1d")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
688 <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
689
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
690 """
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
691 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
692 """Initializes Range of type <Type> from given <spec> string.
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
693
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
694 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
695 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
696 +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
697
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
698 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
699 class instance.
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
700
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
701 """
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
702 self.range_type = Type
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
703 re_range = r'(?:^|from(.+?))(?:to(.+?)$|$)'
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
704 re_geek_range = r'(?:^|(.+?));(?:(.+?)$|$)'
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
705 # Check which syntax to use
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
706 if spec.find(';') == -1:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
707 # Native english
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
708 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
709 else:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
710 # Geek
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
711 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
712 if mch_range:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
713 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
714 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
715 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
716 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
717 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
718 else:
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
719 if allow_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
720 self.from_value = Type(spec, **params)
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
721 self.to_value = Type(spec, add_granularity=1, **params)
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
722 else:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
723 raise ValueError, "Invalid range"
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
724
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
725 def __str__(self):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
726 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
727
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
728 def __repr__(self):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
729 return "<Range %s>" % self.__str__()
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
730
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
731 def test_range():
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
732 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
733 "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
734 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
735 for rspec in rspecs:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
736 print '>>> Range("%s")' % rspec
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
737 print `Range(rspec, Date)`
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
738 print
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
739 for rspec in rispecs:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
740 print '>>> Range("%s")' % rspec
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
741 print `Range(rspec, Interval)`
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
742 print
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
743
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
744 def test():
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
745 intervals = (" 3w 1 d 2:00", " + 2d", "3w")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
746 for interval in intervals:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
747 print '>>> Interval("%s")'%interval
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
748 print `Interval(interval)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
749
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
750 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
751 "08-13.22:13", "14:25", '2002-12')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
752 for date in dates:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
753 print '>>> Date("%s")'%date
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
754 print `Date(date)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
755
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
756 sums = ((". + 2d", "3w"), (".", " 3w 1 d 2:00"))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
757 for date, interval in sums:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
758 print '>>> Date("%s") + Interval("%s")'%(date, interval)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
759 print `Date(date) + Interval(interval)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
760
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
761 if __name__ == '__main__':
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
762 test()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
763
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
764 # vim: set filetype=python ts=4 sw=4 et si

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