annotate roundup/date.py @ 3696:790363e96852

Sorting/grouping by multiple properties. - Implement sorting/grouping by multiple properties for the web interface. I'm now using @sort0/@sortdir0,@sort1/@sortdir1,... and @group0/@groupdir0,... when generating URLs from a search template. These are converted to a list internally. When saving URLs (e.g. when storing queries) I'm using @sort=prop1,prop2,... and @group=... with optional '-' prepended to individual props. This means saved URLs are backward compatible with existing trackers (and yes, this was a design goal). I need the clumsy version with @sort0,@sort1 etc, because I'm currently using several selectors and checkboxes (as the classic template does, too). I don't think there is a way around that in HTML? - Updated (hopefully all) documentation to reflect the new URL format and the consequences in the web-interface. - I've set the number of sort/group properties in the classic template to two -- this can easily be reverted by changing n_sort to 1. Richard, would you look over these changes? I've set a tag before and (will set) after commit, so that it would be easy to merge out. Don't be too scared about the size of the change, most is documentation, the guts are in cgi/templating.py and small changes in the classic template.
author Ralf Schlatterbeck <schlatterbeck@users.sourceforge.net>
date Wed, 30 Aug 2006 20:28:26 +0000
parents df7bff6f8a2f
children 06d7816976bc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
1 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
2 # Copyright (c) 2001 Bizar Software Pty Ltd (http://www.bizarsoftware.com.au/)
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
3 # This module is free software, and you may redistribute it and/or modify
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
4 # under the same terms as Python, so long as this copyright message and
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
5 # disclaimer are retained in their original form.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
6 #
214
18134bffab37 stupid typo
Richard Jones <richard@users.sourceforge.net>
parents: 213
diff changeset
7 # IN NO EVENT SHALL BIZAR SOFTWARE PTY LTD BE LIABLE TO ANY PARTY FOR
213
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
8 # DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
9 # OUT OF THE USE OF THIS CODE, EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
10 # POSSIBILITY OF SUCH DAMAGE.
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
11 #
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
12 # BIZAR SOFTWARE PTY LTD SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
13 # BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
14 # FOR A PARTICULAR PURPOSE. THE CODE PROVIDED HEREUNDER IS ON AN "AS IS"
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
15 # BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
d45384bc6420 Added the copyright/license notice to (nearly) all files...
Richard Jones <richard@users.sourceforge.net>
parents: 206
diff changeset
16 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
17 #
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
18 # $Id: date.py,v 1.87 2006-05-06 16:43:29 a1s Exp $
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 248
diff changeset
19
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
20 """Date, time and time interval handling.
406
bdc2ea127ae9 Added module docstrings to all modules.
Jürgen Hermann <jhermann@users.sourceforge.net>
parents: 248
diff changeset
21 """
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
22 __docformat__ = 'restructuredtext'
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
23
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
24 import calendar
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
25 import datetime
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
26 import time
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
27 import re
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28
2702
eb4e7b8d52a2 handle Py2.3+ datetime objects as Date specs [SF#971300]
Richard Jones <richard@users.sourceforge.net>
parents: 2539
diff changeset
29 try:
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
30 import pytz
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
31 except ImportError:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
32 pytz = None
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
33
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
34 from roundup import i18n
2702
eb4e7b8d52a2 handle Py2.3+ datetime objects as Date specs [SF#971300]
Richard Jones <richard@users.sourceforge.net>
parents: 2539
diff changeset
35
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
36 def _add_granularity(src, order, value = 1):
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
37 '''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
38 parameter
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
39 '''
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
40 for gran in order:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
41 if src[gran]:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
42 src[gran] = int(src[gran]) + value
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
43 break
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
44
3456
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
45 # no, I don't know why we must anchor the date RE when we only ever use it
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
46 # in a match()
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
47 date_re = re.compile(r'''^
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
48 ((?P<y>\d\d\d\d)([/-](?P<m>\d\d?)([/-](?P<d>\d\d?))?)? # yyyy[-mm[-dd]]
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
49 |(?P<a>\d\d?)[/-](?P<b>\d\d?))? # or mm-dd
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
50 (?P<n>\.)? # .
3611
86d568dbab55 allow single digit seconds in date spec [SF#1447141]
Richard Jones <richard@users.sourceforge.net>
parents: 3586
diff changeset
51 (((?P<H>\d?\d):(?P<M>\d\d))?(:(?P<S>\d\d?(\.\d+)?))?)? # hh:mm:ss
3586
f47bddab5a49 date spec wasn't allowing week intervals
Richard Jones <richard@users.sourceforge.net>
parents: 3456
diff changeset
52 (?P<o>[\d\smywd\-+]+)? # offset
3456
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
53 $''', re.VERBOSE)
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
54 serialised_date_re = re.compile(r'''
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
55 (\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d?(\.\d+)?)
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
56 ''', re.VERBOSE)
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
57
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
58 _timedelta0 = datetime.timedelta(0)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
59
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
60 # load UTC tzinfo
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
61 if pytz:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
62 UTC = pytz.utc
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
63 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
64 # fallback implementation from Python Library Reference
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
65
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
66 class _UTC(datetime.tzinfo):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
67
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
68 """Universal Coordinated Time zoneinfo"""
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
69
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
70 def utcoffset(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
71 return _timedelta0
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
72
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
73 def tzname(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
74 return "UTC"
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
75
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
76 def dst(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
77 return _timedelta0
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
78
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
79 def __repr__(self):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
80 return "<UTC>"
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
81
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
82 # pytz adjustments interface
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
83 # Note: pytz verifies that dt is naive datetime for localize()
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
84 # and not naive datetime for normalize().
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
85 # In this implementation, we don't care.
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
86
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
87 def normalize(self, dt, is_dst=False):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
88 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
89
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
90 def localize(self, dt, is_dst=False):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
91 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
92
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
93 UTC = _UTC()
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
94
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
95 # integral hours offsets were available in Roundup versions prior to 1.1.3
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
96 # and still are supported as a fallback if pytz module is not installed
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
97 class SimpleTimezone(datetime.tzinfo):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
98
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
99 """Simple zoneinfo with fixed numeric offset and no daylight savings"""
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
100
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
101 def __init__(self, offset=0, name=None):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
102 super(SimpleTimezone, self).__init__()
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
103 self.offset = offset
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
104 if name:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
105 self.name = name
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
106 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
107 self.name = "Etc/GMT%+d" % self.offset
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
108
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
109 def utcoffset(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
110 return datetime.timedelta(hours=self.offset)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
111
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
112 def tzname(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
113 return self.name
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
114
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
115 def dst(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
116 return _timedelta0
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
117
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
118 def __repr__(self):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
119 return "<%s: %s>" % (self.__class__.__name__, self.name)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
120
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
121 # pytz adjustments interface
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
122
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
123 def normalize(self, dt):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
124 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
125
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
126 def localize(self, dt, is_dst=False):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
127 return dt.replace(tzinfo=self)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
128
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
129 # simple timezones with fixed offset
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
130 _tzoffsets = dict(GMT=0, UCT=0, EST=5, MST=7, HST=10)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
131
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
132 def get_timezone(tz):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
133 # if tz is None, return None (will result in naive datetimes)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
134 # XXX should we return UTC for None?
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
135 if tz is None:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
136 return None
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
137 # try integer offset first for backward compatibility
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
138 try:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
139 utcoffset = int(tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
140 except (TypeError, ValueError):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
141 pass
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
142 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
143 if utcoffset == 0:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
144 return UTC
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
145 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
146 return SimpleTimezone(utcoffset)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
147 # tz is a timezone name
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
148 if pytz:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
149 return pytz.timezone(tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
150 elif tz == "UTC":
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
151 return UTC
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
152 elif tz in _tzoffsets:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
153 return SimpleTimezone(_tzoffsets[tz], tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
154 else:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
155 raise KeyError, tz
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
156
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
157 def _utc_to_local(y,m,d,H,M,S,tz):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
158 TZ = get_timezone(tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
159 frac = S - int(S)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
160 dt = datetime.datetime(y, m, d, H, M, int(S), tzinfo=UTC)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
161 y,m,d,H,M,S = dt.astimezone(TZ).timetuple()[:6]
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
162 S = S + frac
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
163 return (y,m,d,H,M,S)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
164
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
165 def _local_to_utc(y,m,d,H,M,S,tz):
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
166 TZ = get_timezone(tz)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
167 dt = datetime.datetime(y,m,d,H,M,int(S))
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
168 y,m,d,H,M,S = TZ.localize(dt).utctimetuple()[:6]
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
169 return (y,m,d,H,M,S)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
170
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 class Date:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172 '''
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173 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
174 international standard format (yyyy-mm-dd) joined to the time
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 (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
176 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
177 "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
178 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
179 format with the time always given in GMT. The full date format is
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
180 always exactly 19 characters long.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182 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
183 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
184 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
185 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
186 care of these conversions. In the following examples, suppose that yyyy
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187 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
188 of the month; and suppose that the user is on Eastern Standard Time.
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
189 Examples::
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 "2000-04-17" means <Date 2000-04-17.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192 "01-25" means <Date yyyy-01-25.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 "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
194 "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
195 "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
196 "14:25" means <Date yyyy-mm-dd.19:25:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 "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
198 "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
199 "2003-06" means <Date 2003-06-01.00:00:00>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 "." means "right now"
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 The Date class should understand simple date expressions of the form
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203 stamp + interval and stamp - interval. When adding or subtracting
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 intervals involving months or years, the components are handled
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 separately. For example, when evaluating "2000-06-25 + 1m 10d", we
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 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
207 2000-08-04 (rather than trying to decide whether 1m 10d means 38 or 40
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
208 or 41 days). Example usage::
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 >>> Date(".")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211 <Date 2000-06-26.00:34:02>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 >>> _.local(-5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 "2000-06-25.19:34:02"
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 >>> Date(". + 2d")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 <Date 2000-06-28.00:34:02>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 >>> Date("1997-04-17", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 <Date 1997-04-17.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 >>> Date("01-25", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 <Date 2000-01-25.00:00:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220 >>> Date("08-13.22:13", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221 <Date 2000-08-14.03:13:00>
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222 >>> Date("14:25", -5)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 <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
224
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
225 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
226 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
227 method, and is accepted as an argument on instatiation.
2188
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
228
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
229 The date class handles basic arithmetic::
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
230
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
231 >>> d1=Date('.')
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
232 >>> d1
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
233 <Date 2004-04-06.22:04:20.766830>
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
234 >>> d2=Date('2003-07-01')
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
235 >>> d2
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
236 <Date 2003-07-01.00:00:0.000000>
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
237 >>> d1-d2
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
238 <Interval + 280d 22:04:20>
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
239 >>> i1=_
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
240 >>> d2+i1
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
241 <Date 2004-04-06.22:04:20.000000>
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
242 >>> d1-i1
e170d3f917ad add more doc to date.py
Richard Jones <richard@users.sourceforge.net>
parents: 2102
diff changeset
243 <Date 2003-07-01.00:00:0.000000>
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 '''
2262
a13ec40cf8f5 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2250
diff changeset
245
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
246 def __init__(self, spec='.', offset=0, add_granularity=0, translator=i18n):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247 """Construct a date given a specification and a time zone offset.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
249 'spec'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
250 is a full date or a partial form, with an optional added or
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
251 subtracted interval. Or a date 9-tuple.
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
252 'offset'
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
253 is the local time zone offset from GMT in hours.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
254 'translator'
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
255 is i18n module or one of gettext translation classes.
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
256 It must have attributes 'gettext' and 'ngettext',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
257 serving as translation functions.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258 """
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
259 self.setTranslator(translator)
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
260 if type(spec) == type(''):
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
261 self.set(spec, offset=offset, add_granularity=add_granularity)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
262 return
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
263 elif isinstance(spec, datetime.datetime):
2702
eb4e7b8d52a2 handle Py2.3+ datetime objects as Date specs [SF#971300]
Richard Jones <richard@users.sourceforge.net>
parents: 2539
diff changeset
264 # Python 2.3+ datetime object
eb4e7b8d52a2 handle Py2.3+ datetime objects as Date specs [SF#971300]
Richard Jones <richard@users.sourceforge.net>
parents: 2539
diff changeset
265 y,m,d,H,M,S,x,x,x = spec.timetuple()
3231
4a5893bfd70d merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3210
diff changeset
266 if y < 1970: raise ValueError, 'year must be > 1970'
2702
eb4e7b8d52a2 handle Py2.3+ datetime objects as Date specs [SF#971300]
Richard Jones <richard@users.sourceforge.net>
parents: 2539
diff changeset
267 S += spec.microsecond/1000000.
eb4e7b8d52a2 handle Py2.3+ datetime objects as Date specs [SF#971300]
Richard Jones <richard@users.sourceforge.net>
parents: 2539
diff changeset
268 spec = (y,m,d,H,M,S,x,x,x)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
269 elif hasattr(spec, 'tuple'):
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
270 spec = spec.tuple()
2539
92510df07670 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2416
diff changeset
271 elif isinstance(spec, Date):
92510df07670 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 2416
diff changeset
272 spec = spec.get_tuple()
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
273 try:
75
fa5aea4c212e Fixed offset handling (shoulda read the spec a little better)
Richard Jones <richard@users.sourceforge.net>
parents: 47
diff changeset
274 y,m,d,H,M,S,x,x,x = spec
3231
4a5893bfd70d merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3210
diff changeset
275 if y < 1970: raise ValueError, 'year must be > 1970'
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
276 frac = S - int(S)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 self.year, self.month, self.day, self.hour, self.minute, \
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
278 self.second = _local_to_utc(y, m, d, H, M, S, offset)
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
279 # we lost the fractional part
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
280 self.second = self.second + frac
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
281 except:
3210
ea29d69f7415 fix error message formatting in Date.__init__;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3151
diff changeset
282 raise ValueError, 'Unknown spec %r' % (spec,)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283
3456
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
284 def set(self, spec, offset=0, date_re=date_re,
9c080e19f307 tighten up Date parsing to not allow 'M/D/YY' (or 'D/M/YY) [SF#1290550]
Richard Jones <richard@users.sourceforge.net>
parents: 3349
diff changeset
285 serialised_re=serialised_date_re, add_granularity=0):
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
286 ''' 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
287 '''
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
288
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
289 m = serialised_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
290 if m is not None:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
291 # we're serialised - easy!
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
292 g = m.groups()
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
293 (self.year, self.month, self.day, self.hour, self.minute) = \
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
294 map(int, g[:5])
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
295 self.second = float(g[5])
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
296 return
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
297
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
298 # 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
299 m = date_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
300 if m is None:
3151
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3028
diff changeset
301 raise ValueError, self._('Not a date spec: '
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3028
diff changeset
302 '"yyyy-mm-dd", "mm-dd", "HH:MM", "HH:MM:SS" or '
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3028
diff changeset
303 '"yyyy-mm-dd.HH:MM:SS.SSS"')
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
304
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
305 info = m.groupdict()
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
306
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
307 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
308 _add_granularity(info, 'SMHdmyab')
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
309
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
310 # get the current date as our default
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
311 ts = time.time()
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
312 frac = ts - int(ts)
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
313 y,m,d,H,M,S,x,x,x = time.gmtime(ts)
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
314 # gmtime loses the fractional seconds
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
315 S = S + frac
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
316
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
317 # whether we need to convert to UTC
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
318 adjust = False
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
319
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
320 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
321 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
322 y = int(info['y'])
3231
4a5893bfd70d merge from maint-0-8
Richard Jones <richard@users.sourceforge.net>
parents: 3210
diff changeset
323 if y < 1970: raise ValueError, 'year must be > 1970'
1599
cc96bf971b33 extended date syntax to make range searches even more useful
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1597
diff changeset
324 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
325 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
326 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
327 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
328 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
329 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
330 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
331 d = int(info['b'])
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
332 H = 0
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
333 M = S = 0
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
334 adjust = True
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
335
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
336 # override hour, minute, second parts
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
337 if info['H'] is not None and info['M'] is not None:
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
338 H = int(info['H'])
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
339 M = int(info['M'])
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
340 S = 0
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
341 if info['S'] is not None:
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
342 S = float(info['S'])
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
343 adjust = True
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
344
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
345 if add_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
346 S = S - 1
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
347
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
348 # now handle the adjustment of hour
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
349 frac = S - int(S)
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
350 ts = calendar.timegm((y,m,d,H,M,S,0,0,0))
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
351 y, m, d, H, M, S, x, x, x = time.gmtime(ts)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
352 if adjust:
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
353 y, m, d, H, M, S = _local_to_utc(y, m, d, H, M, S, offset)
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
354 self.year, self.month, self.day, self.hour, self.minute, \
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
355 self.second = y, m, d, H, M, S
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
356 # we lost the fractional part along the way
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
357 self.second = self.second + frac
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
358
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
359 if info.get('o', None):
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
360 try:
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
361 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
362 except ValueError:
3151
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3028
diff changeset
363 raise ValueError, self._('%r not a date / time spec '
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3028
diff changeset
364 '"yyyy-mm-dd", "mm-dd", "HH:MM", "HH:MM:SS" or '
6feac4fcf883 Various bug fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 3028
diff changeset
365 '"yyyy-mm-dd.HH:MM:SS.SSS"')%(spec,)
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
366
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
367 def addInterval(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
368 ''' Add the interval to this date, returning the date tuple
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
369 '''
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
370 # 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
371 sign = interval.sign
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
372 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
373 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
374 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
375 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
376 minute = self.minute + sign * interval.minute
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
377 # Intervals work on whole seconds
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
378 second = int(self.second) + sign * interval.second
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
379
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
380 # now cope with under- and over-flow
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
381 # first do the time
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
382 while (second < 0 or second > 59 or minute < 0 or minute > 59 or
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
383 hour < 0 or hour > 23):
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
384 if second < 0: minute -= 1; second += 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
385 elif second > 59: minute += 1; second -= 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
386 if minute < 0: hour -= 1; minute += 60
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
387 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
388 if hour < 0: day -= 1; hour += 24
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
389 elif hour > 23: day += 1; hour -= 24
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
390
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
391 # 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
392 while month < 1 or month > 12:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
393 if month < 1: year -= 1; month += 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
394 if month > 12: year += 1; month -= 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
395
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
396 # now do the days, now that we know what month we're in
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
397 def get_mdays(year, month):
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
398 if month == 2 and calendar.isleap(year): return 29
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
399 else: return calendar.mdays[month]
1941
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
400
bcc65c5b86e6 fixed date arithmetic to not allow day-of-month == 0 [SF#853306]
Richard Jones <richard@users.sourceforge.net>
parents: 1930
diff changeset
401 while month < 1 or month > 12 or day < 1 or day > get_mdays(year,month):
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
402 # now to day under/over
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
403 if day < 1:
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
404 # When going backwards, decrement month, then increment days
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
405 month -= 1
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
406 day += get_mdays(year,month)
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
407 elif day > get_mdays(year,month):
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
408 # When going forwards, decrement days, then increment month
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
409 day -= get_mdays(year,month)
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
410 month += 1
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
411
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
412 # 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
413 while month < 1 or month > 12:
1885
deba54ed724f Date arithmetic fixes.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1600
diff changeset
414 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
415 if month > 12: year += 1; month -= 12
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
416
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
417 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
418
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
419 def differenceDate(self, other):
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
420 "Return the difference between this date and another date"
2189
d39068bc6ef9 implement differenceDate ;)
Richard Jones <richard@users.sourceforge.net>
parents: 2188
diff changeset
421 return self - other
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
422
861
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
423 def applyInterval(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
424 ''' 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
425 '''
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
426 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
427 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
428
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
429 def __add__(self, interval):
68cef2bb929d fixed the date module so that Date(". - 2d") works
Richard Jones <richard@users.sourceforge.net>
parents: 720
diff changeset
430 """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
431 """
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
432 return Date(self.addInterval(interval), translator=self.translator)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
433
1103
db787cef1385 handled some XXXs
Richard Jones <richard@users.sourceforge.net>
parents: 1094
diff changeset
434 # deviates from spec to allow subtraction of dates as well
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
435 def __sub__(self, other):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
436 """ Subtract:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
437 1. an interval from this date to produce another date.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
438 2. a date from this date to produce an interval.
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
439 """
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
440 if isinstance(other, Interval):
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
441 other = Interval(other.get_tuple())
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
442 other.sign *= -1
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
443 return self.__add__(other)
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
444
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
445 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
446
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
447 return self.dateDelta(other)
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
448
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
449 def dateDelta(self, other):
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
450 """ Produce an Interval of the difference between this date
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
451 and another date. Only returns days:hours:minutes:seconds.
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
452 """
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
453 # Returning intervals larger than a day is almost
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
454 # 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
455 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
456 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
457 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
458 other.hour, other.minute, other.second, 0, 0, 0))
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
459 # intervals work in whole seconds
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
460 diff = int(a - b)
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
461 if diff > 0:
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
462 sign = 1
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
463 else:
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
464 sign = -1
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
465 diff = -diff
641
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
466 S = diff%60
cfa460943d4d Oops, there's 24 hours in a day...
Richard Jones <richard@users.sourceforge.net>
parents: 640
diff changeset
467 M = (diff/60)%60
1894
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
468 H = (diff/(60*60))%24
41ad8b781232 Date - Date works again.
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 1885
diff changeset
469 d = diff/(24*60*60)
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
470 return Interval((0, 0, d, H, M, S), sign=sign,
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
471 translator=self.translator)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
472
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
473 def __cmp__(self, other, int_seconds=0):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
474 """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
475 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
476 return 1
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
477 for attr in ('year', 'month', 'day', 'hour', 'minute'):
890
a568596dbea7 Unit tests and a few fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 861
diff changeset
478 if not hasattr(other, attr):
a568596dbea7 Unit tests and a few fixes.
Richard Jones <richard@users.sourceforge.net>
parents: 861
diff changeset
479 return 1
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
480 r = cmp(getattr(self, attr), getattr(other, attr))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
481 if r: return r
2102
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
482 if not hasattr(other, 'second'):
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
483 return 1
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
484 if int_seconds:
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
485 return cmp(int(self.second), int(other.second))
666402433998 Fix some tests.
Richard Jones <richard@users.sourceforge.net>
parents: 2100
diff changeset
486 return cmp(self.second, other.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
487
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
488 def __str__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
489 """Return this date as a string in the yyyy-mm-dd.hh:mm:ss format."""
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
490 return self.formal()
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
491
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
492 def formal(self, sep='.', sec='%02d'):
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
493 f = '%%4d-%%02d-%%02d%s%%02d:%%02d:%s'%(sep, sec)
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
494 return f%(self.year, self.month, self.day, self.hour, self.minute,
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
495 self.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
496
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
497 def pretty(self, format='%d %B %Y'):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
498 ''' 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
499
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
500 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
501 format, then the day number will be removed from output.
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
502 '''
3028
de242e68c69b fix py2.4 strftime() API change bug [SF#1087746]
Richard Jones <richard@users.sourceforge.net>
parents: 2981
diff changeset
503 # Python2.4 strftime() enforces the non-zero-ness of the day-of-year
de242e68c69b fix py2.4 strftime() API change bug [SF#1087746]
Richard Jones <richard@users.sourceforge.net>
parents: 2981
diff changeset
504 # component of the time tuple, so we need to figure it out
de242e68c69b fix py2.4 strftime() API change bug [SF#1087746]
Richard Jones <richard@users.sourceforge.net>
parents: 2981
diff changeset
505 t = (self.year, self.month, self.day, self.hour, self.minute,
de242e68c69b fix py2.4 strftime() API change bug [SF#1087746]
Richard Jones <richard@users.sourceforge.net>
parents: 2981
diff changeset
506 int(self.second), 0, 0, 0)
de242e68c69b fix py2.4 strftime() API change bug [SF#1087746]
Richard Jones <richard@users.sourceforge.net>
parents: 2981
diff changeset
507 t = calendar.timegm(t)
de242e68c69b fix py2.4 strftime() API change bug [SF#1087746]
Richard Jones <richard@users.sourceforge.net>
parents: 2981
diff changeset
508 t = time.gmtime(t)
de242e68c69b fix py2.4 strftime() API change bug [SF#1087746]
Richard Jones <richard@users.sourceforge.net>
parents: 2981
diff changeset
509 str = time.strftime(format, t)
de242e68c69b fix py2.4 strftime() API change bug [SF#1087746]
Richard Jones <richard@users.sourceforge.net>
parents: 2981
diff changeset
510
1272
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
511 # handle zero day by removing it
cae50587fb96 expose the Date.pretty method to templating
Richard Jones <richard@users.sourceforge.net>
parents: 1268
diff changeset
512 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
513 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
514 return str
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
515
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
516 def __repr__(self):
3612
afda59d5d546 prevent generation of new single-digit seconds dates [SF#1429390]
Richard Jones <richard@users.sourceforge.net>
parents: 3611
diff changeset
517 return '<Date %s>'%self.formal(sec='%06.3f')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
518
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
519 def local(self, offset):
1318
46a1951fdb14 fix Date.local()
Richard Jones <richard@users.sourceforge.net>
parents: 1272
diff changeset
520 """ 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
521 """
3619
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
522 y, m, d, H, M, S = _utc_to_local(self.year, self.month, self.day,
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
523 self.hour, self.minute, self.second, offset)
df7bff6f8a2f full timezone support (based on patch [SF#1465296])
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3612
diff changeset
524 return Date((y, m, d, H, M, S, 0, 0, 0), translator=self.translator)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
525
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
526 def __deepcopy__(self, memo):
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
527 return Date((self.year, self.month, self.day, self.hour,
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
528 self.minute, self.second, 0, 0, 0), translator=self.translator)
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
529
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
530 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
531 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
532 self.second, 0, 0, 0)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
533
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
534 def serialise(self):
3612
afda59d5d546 prevent generation of new single-digit seconds dates [SF#1429390]
Richard Jones <richard@users.sourceforge.net>
parents: 3611
diff changeset
535 return '%4d%02d%02d%02d%02d%06.3f'%(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
536 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
537
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
538 def timestamp(self):
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
539 ''' return a UNIX timestamp for this date '''
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
540 frac = self.second - int(self.second)
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
541 ts = calendar.timegm((self.year, self.month, self.day, self.hour,
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
542 self.minute, self.second, 0, 0, 0))
2098
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
543 # we lose the fractional part
18addf2a8596 Implemented proper datatypes in mysql and postgresql backends...
Richard Jones <richard@users.sourceforge.net>
parents: 2005
diff changeset
544 return ts + frac
1946
c538a64b94a7 Refactored CGI file serving so that FileClass contents are...
Richard Jones <richard@users.sourceforge.net>
parents: 1941
diff changeset
545
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
546 def setTranslator(self, translator):
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
547 """Replace the translation engine
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
548
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
549 'translator'
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
550 is i18n module or one of gettext translation classes.
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
551 It must have attributes 'gettext' and 'ngettext',
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
552 serving as translation functions.
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
553 """
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
554 self.translator = translator
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
555 self._ = translator.gettext
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
556 self.ngettext = translator.ngettext
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
557
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
558 class Interval:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
559 '''
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
560 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
561 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
562 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
563 may not).
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
564
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
565 "3y" means three years
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
566 "2y 1m" means two years and one month
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
567 "1m 25d" means one month and 25 days
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
568 "2w 3d" means two weeks and three days
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
569 "1d 2:50" means one day, two hours, and 50 minutes
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
570 "14:00" means 14 hours
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
571 "0:04:33" means four minutes and 33 seconds
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
572
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
573 Example usage:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
574 >>> Interval(" 3w 1 d 2:00")
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
575 <Interval + 22d 2:00>
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
576 >>> Date(". + 2d") + Interval("- 3w")
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
577 <Date 2000-06-07.00:34:02>
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
578 >>> Interval('1:59:59') + Interval('00:00:01')
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
579 <Interval + 2:00>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
580 >>> Interval('2:00') + Interval('- 00:00:01')
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
581 <Interval + 1:59:59>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
582 >>> Interval('1y')/2
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
583 <Interval + 6m>
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
584 >>> Interval('1:00')/2
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
585 <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
586 >>> 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
587 <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
588 >>> 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
589 <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
590
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
591 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
592 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
593 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
594 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
595 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
596
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
597 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
598 seconds, minutes, hours, years, months, days
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
599
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
600 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
601 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
602 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
603
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
604 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
605 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
606 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
607
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
608 TODO: more examples, showing the order of addition operation
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
609 '''
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
610 def __init__(self, spec, sign=1, allowdate=1, add_granularity=0,
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
611 translator=i18n
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
612 ):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
613 """Construct an interval given a specification."""
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
614 self.setTranslator(translator)
3349
9c65e32514aa types module delenda est
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 3231
diff changeset
615 if isinstance(spec, (int, float, long)):
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
616 self.from_seconds(spec)
3349
9c65e32514aa types module delenda est
Anthony Baxter <anthonybaxter@users.sourceforge.net>
parents: 3231
diff changeset
617 elif isinstance(spec, basestring):
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
618 self.set(spec, allowdate=allowdate, add_granularity=add_granularity)
2729
797725ec50c5 date.Interval() now accepts an Interval as a spec [SF#1041266]
Richard Jones <richard@users.sourceforge.net>
parents: 2702
diff changeset
619 elif isinstance(spec, Interval):
797725ec50c5 date.Interval() now accepts an Interval as a spec [SF#1041266]
Richard Jones <richard@users.sourceforge.net>
parents: 2702
diff changeset
620 (self.sign, self.year, self.month, self.day, self.hour,
797725ec50c5 date.Interval() now accepts an Interval as a spec [SF#1041266]
Richard Jones <richard@users.sourceforge.net>
parents: 2702
diff changeset
621 self.minute, self.second) = spec.get_tuple()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
622 else:
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
623 if len(spec) == 7:
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
624 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
625 self.minute, self.second = spec
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
626 self.second = int(self.second)
1094
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
627 else:
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
628 # old, buggy spec form
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
629 self.sign = sign
854d45f8b745 fixes to tests and Interval unmarshalling
Richard Jones <richard@users.sourceforge.net>
parents: 1090
diff changeset
630 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
631 self.second = spec
2100
62ed6505cbec MySQL migration of old backend database to new, typed database complete.
Richard Jones <richard@users.sourceforge.net>
parents: 2098
diff changeset
632 self.second = int(self.second)
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
633
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
634 def __deepcopy__(self, memo):
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
635 return Interval((self.sign, self.year, self.month, self.day,
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
636 self.hour, self.minute, self.second), translator=self.translator)
2359
8611bf29baec deepcopy was broken for date stuff
Richard Jones <richard@users.sourceforge.net>
parents: 2339
diff changeset
637
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
638 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
639 \s*(?P<s>[-+])? # + or -
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
640 \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
641 \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
642 \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
643 \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
644 \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
645 \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
646 (\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
647 \.? # .
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
648 (\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
649 )?''', 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
650 (?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
651 (?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
652 add_granularity=0):
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
653 ''' 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
654 '''
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
655 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
656 self.minute = self.second = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
657 self.sign = 1
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
658 m = serialised_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
659 if not m:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
660 m = interval_re.match(spec)
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
661 if not m:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
662 raise ValueError, self._('Not an interval spec:'
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
663 ' [+-] [#y] [#m] [#w] [#d] [[[H]H:MM]:SS] [date spec]')
1542
3faabaeab6aa fixed date unserialisation for *dbm backends
Richard Jones <richard@users.sourceforge.net>
parents: 1537
diff changeset
664 else:
3faabaeab6aa fixed date unserialisation for *dbm backends
Richard Jones <richard@users.sourceforge.net>
parents: 1537
diff changeset
665 allowdate = 0
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
666
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
667 # 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
668 info = m.groupdict()
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
669 if add_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
670 _add_granularity(info, 'SMHdwmy', (info['s']=='-' and -1 or 1))
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
671
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
672 valid = 0
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
673 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
674 '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
675 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
676 valid = 1
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
677 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
678
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
679 # 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
680 if not valid and not info['D']:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
681 raise ValueError, self._('Not an interval spec:'
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
682 ' [+-] [#y] [#m] [#w] [#d] [[[H]H:MM]:SS]')
1535
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
683
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
684 if self.week:
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
685 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
686
26f29449c494 fixed detection of bad date specs [SF#691439]
Richard Jones <richard@users.sourceforge.net>
parents: 1509
diff changeset
687 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
688 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
689
1537
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
690 # 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
691 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
692 now = Date('.')
0e36c9b23aa6 more lenient date input and addition Interval input support [SF#677764]
Richard Jones <richard@users.sourceforge.net>
parents: 1535
diff changeset
693 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
694 # 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
695 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
696 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
697 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
698 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
699 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
700
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
701 def __cmp__(self, other):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
702 """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
703 if other is None:
1505
c101d2ff5a20 fix to [SF#691071], really this time
Richard Jones <richard@users.sourceforge.net>
parents: 1499
diff changeset
704 # 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
705 return 1
1494
66cc5c2819dd oops, Interval sorting ignored sign
Richard Jones <richard@users.sourceforge.net>
parents: 1487
diff changeset
706 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
707 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
708 if r:
66cc5c2819dd oops, Interval sorting ignored sign
Richard Jones <richard@users.sourceforge.net>
parents: 1487
diff changeset
709 return r
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
710 return 0
964
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
711
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
712 def __str__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
713 """Return this interval as a string."""
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
714 l = []
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
715 if self.year: l.append('%sy'%self.year)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
716 if self.month: l.append('%sm'%self.month)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
717 if self.day: l.append('%sd'%self.day)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
718 if self.second:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
719 l.append('%d:%02d:%02d'%(self.hour, self.minute, self.second))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
720 elif self.hour or self.minute:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
721 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
722 if l:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
723 l.insert(0, {1:'+', -1:'-'}[self.sign])
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
724 else:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
725 l.append('00:00')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
726 return ' '.join(l)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
727
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
728 def __add__(self, other):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
729 if isinstance(other, Date):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
730 # the other is a Date - produce a Date
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
731 return Date(other.addInterval(self), translator=self.translator)
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
732 elif isinstance(other, Interval):
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
733 # add the other Interval to this one
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
734 a = self.get_tuple()
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
735 as = a[0]
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
736 b = other.get_tuple()
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
737 bs = b[0]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
738 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
739 i.insert(0, 1)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
740 i = fixTimeOverflow(i)
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
741 return Interval(i, translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
742 # 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
743 raise TypeError, "Can't add %r"%other
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
744
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
745 def __sub__(self, other):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
746 if isinstance(other, Date):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
747 # the other is a Date - produce a Date
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
748 interval = Interval(self.get_tuple())
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
749 interval.sign *= -1
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
750 return Date(other.addInterval(interval),
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
751 translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
752 elif isinstance(other, Interval):
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
753 # add the other Interval to this one
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
754 a = self.get_tuple()
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
755 as = a[0]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
756 b = other.get_tuple()
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
757 bs = b[0]
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
758 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
759 i.insert(0, 1)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
760 i = fixTimeOverflow(i)
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
761 return Interval(i, translator=self.translator)
1268
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
762 # 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
763 raise TypeError, "Can't add %r"%other
b34adc9bcaf2 implemented the missing Interval.__add__
Richard Jones <richard@users.sourceforge.net>
parents: 1266
diff changeset
764
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
765 def __div__(self, other):
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
766 """ Divide this interval by an int value.
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
767
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
768 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
769 calculation as days/time, so raise an error in that situation.
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
770 """
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
771 try:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
772 other = float(other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
773 except TypeError:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
774 raise ValueError, "Can only divide Intervals by numbers"
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
775
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
776 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
777 self.hour, self.minute, self.second)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
778 if y or m:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
779 if d or H or M or S:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
780 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
781 months = self.year*12 + self.month
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
782 months *= self.sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
783
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
784 months = int(months/other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
785
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
786 sign = months<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
787 m = months%12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
788 y = months / 12
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
789 return Interval((sign, y, m, 0, 0, 0, 0),
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
790 translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
791
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
792 else:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
793 # handle a day/time division
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
794 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
795 seconds *= self.sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
796
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
797 seconds = int(seconds/other)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
798
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
799 sign = seconds<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
800 seconds *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
801 S = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
802 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
803 M = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
804 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
805 H = seconds%24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
806 d = seconds / 24
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
807 return Interval((sign, 0, 0, d, H, M, S),
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
808 translator=self.translator)
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
809
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
810 def __repr__(self):
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
811 return '<Interval %s>'%self.__str__()
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
812
487
2f4c37d28108 I18N'ification
Richard Jones <richard@users.sourceforge.net>
parents: 406
diff changeset
813 def pretty(self):
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
814 ''' print up the date date using one of these nice formats..
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
815 '''
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
816 _quarters = self.minute / 15
720
5e0a75bfdd90 reverting to dates for intervals > 2 months sucks
Richard Jones <richard@users.sourceforge.net>
parents: 641
diff changeset
817 if self.year:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
818 s = self.ngettext("%(number)s year", "%(number)s years",
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
819 self.year) % {'number': self.year}
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
820 elif self.month or self.day > 28:
2416
Richard Jones <richard@users.sourceforge.net>
parents: 2402
diff changeset
821 _months = max(1, int(((self.month * 30) + self.day) / 30))
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
822 s = self.ngettext("%(number)s month", "%(number)s months",
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
823 _months) % {'number': _months}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
824 elif self.day > 7:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
825 _weeks = int(self.day / 7)
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
826 s = self.ngettext("%(number)s week", "%(number)s weeks",
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
827 _weeks) % {'number': _weeks}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
828 elif self.day > 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
829 # Note: singular form is not used
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
830 s = self.ngettext('%(number)s day', '%(number)s days',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
831 self.day) % {'number': self.day}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
832 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
833 if self.sign > 0:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
834 return self._('tomorrow')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
835 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
836 return self._('yesterday')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
837 elif self.hour > 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
838 # Note: singular form is not used
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
839 s = self.ngettext('%(number)s hour', '%(number)s hours',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
840 self.hour) % {'number': self.hour}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
841 elif self.hour == 1:
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
842 if self.minute < 15:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
843 s = self._('an hour')
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
844 elif _quarters == 2:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
845 s = self._('1 1/2 hours')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
846 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
847 s = self.ngettext('1 %(number)s/4 hours',
2416
Richard Jones <richard@users.sourceforge.net>
parents: 2402
diff changeset
848 '1 %(number)s/4 hours', _quarters)%{'number': _quarters}
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
849 elif self.minute < 1:
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
850 if self.sign > 0:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
851 return self._('in a moment')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
852 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
853 return self._('just now')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
854 elif self.minute == 1:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
855 # Note: used in expressions "in 1 minute" or "1 minute ago"
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
856 s = self._('1 minute')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
857 elif self.minute < 15:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
858 # Note: used in expressions "in 2 minutes" or "2 minutes ago"
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
859 s = self.ngettext('%(number)s minute', '%(number)s minutes',
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
860 self.minute) % {'number': self.minute}
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
861 elif _quarters == 2:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
862 s = self._('1/2 an hour')
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
863 else:
2416
Richard Jones <richard@users.sourceforge.net>
parents: 2402
diff changeset
864 s = self.ngettext('%(number)s/4 hour', '%(number)s/4 hours',
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
865 _quarters) % {'number': _quarters}
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
866 # XXX this is internationally broken
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
867 if self.sign < 0:
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
868 s = self._('%s ago') % s
1413
4ae9d725bec4 make future intervals obvious too
Richard Jones <richard@users.sourceforge.net>
parents: 1412
diff changeset
869 else:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
870 s = self._('in %s') % s
640
7dd13fd5d8ea fixed some problems in date calculations
Richard Jones <richard@users.sourceforge.net>
parents: 585
diff changeset
871 return s
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
872
47
34491d9b91a0 Storing only marshallable data in the db - no nasty pickled class references.
Richard Jones <richard@users.sourceforge.net>
parents: 26
diff changeset
873 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
874 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
875 self.minute, self.second)
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
876
832d1209aaa2 Preparing to turn back on link/unlink journal events.
Richard Jones <richard@users.sourceforge.net>
parents: 890
diff changeset
877 def serialise(self):
1261
85d71588a1cf fixed bug in Interval serialisation
Richard Jones <richard@users.sourceforge.net>
parents: 1192
diff changeset
878 sign = self.sign > 0 and '+' or '-'
85d71588a1cf fixed bug in Interval serialisation
Richard Jones <richard@users.sourceforge.net>
parents: 1192
diff changeset
879 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
880 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
881
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
882 def as_seconds(self):
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
883 '''Calculate the Interval as a number of seconds.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
884
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
885 Months are counted as 30 days, years as 365 days. Returns a Long
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
886 int.
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
887 '''
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
888 n = self.year * 365L
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
889 n = n + self.month * 30
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
890 n = n + self.day
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
891 n = n * 24
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
892 n = n + self.hour
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
893 n = n * 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
894 n = n + self.minute
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
895 n = n * 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
896 n = n + self.second
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
897 return n * self.sign
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
898
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
899 def from_seconds(self, val):
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
900 '''Figure my second, minute, hour and day values using a seconds
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
901 value.
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
902 '''
2981
ad04cb95e2b0 fix Interval.from_seconds() with float argument
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2729
diff changeset
903 val = int(val)
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
904 if val < 0:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
905 self.sign = -1
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
906 val = -val
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
907 else:
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
908 self.sign = 1
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
909 self.second = val % 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
910 val = val / 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
911 self.minute = val % 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
912 val = val / 60
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
913 self.hour = val % 24
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
914 val = val / 24
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
915 self.day = val
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
916 self.month = self.year = 0
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
917
2388
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
918 def setTranslator(self, translator):
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
919 """Replace the translation engine
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
920
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
921 'translator'
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
922 is i18n module or one of gettext translation classes.
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
923 It must have attributes 'gettext' and 'ngettext',
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
924 serving as translation functions.
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
925 """
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
926 self.translator = translator
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
927 self._ = translator.gettext
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
928 self.ngettext = translator.ngettext
8a9af227a557 Date and Interval objects allow to change translator after instance creation...
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2359
diff changeset
929
2212
75e46660345c stop Interval from displaying an empty string [SF#934022]
Richard Jones <richard@users.sourceforge.net>
parents: 2189
diff changeset
930
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
931 def fixTimeOverflow(time):
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
932 """ Handle the overflow in the time portion (H, M, S) of "time":
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
933 (sign, y,m,d,H,M,S)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
934
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
935 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
936 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
937 to, generally.
1930
71056b09f2bf Add tests for Interval.pretty().
Johannes Gijsbers <jlgijsbers@users.sourceforge.net>
parents: 1894
diff changeset
938 """
1487
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
939 # 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
940 # 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
941 # XXX overflow...
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
942
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
943 sign, y, m, d, H, M, S = time
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
944 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
945 if seconds:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
946 sign = seconds<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
947 seconds *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
948 S = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
949 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
950 M = seconds%60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
951 seconds /= 60
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
952 H = seconds%24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
953 d = seconds / 24
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
954 else:
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
955 months = y*12 + m
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
956 sign = months<0 and -1 or 1
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
957 months *= sign
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
958 m = months%12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
959 y = months/12
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
960
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
961 return (sign, y, m, d, H, M, S)
37a1906f4454 fixed Interval maths [SF#665357]
Richard Jones <richard@users.sourceforge.net>
parents: 1463
diff changeset
962
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
963 class Range:
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
964 """Represents range between two values
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
965 Ranges can be created using one of theese two alternative syntaxes:
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
966
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
967 1. Native english syntax::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
968
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
969 [[From] <value>][ To <value>]
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
970
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
971 Keywords "From" and "To" are case insensitive. Keyword "From" is
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
972 optional.
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
973
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
974 2. "Geek" syntax::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
975
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
976 [<value>][; <value>]
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
977
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
978 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
979
2005
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
980 Examples (consider local time is Sat Mar 8 22:07:48 EET 2003)::
fc52d57c6c3e documentation cleanup
Richard Jones <richard@users.sourceforge.net>
parents: 1946
diff changeset
981
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
982 >>> 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
983 <Range from 2003-02-12.00:00:00 to 2003-04-02.00:00:00>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
984
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
985 >>> Range("18:00 TO +2m")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
986 <Range from 2003-03-08.18:00:00 to 2003-05-08.20:07:48>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
987
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
988 >>> Range("12:00")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
989 <Range from 2003-03-08.12:00:00 to None>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
990
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
991 >>> Range("tO +3d")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
992 <Range from None to 2003-03-11.20:07:48>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
993
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
994 >>> 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
995 <Range from 2002-11-10.00:00:00 to 2002-12-12.00:00:00>
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
996
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
997 >>> Range("; 20:00 +1d")
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
998 <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
999
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1000 """
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1001 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
1002 """Initializes Range of type <Type> from given <spec> string.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1003
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1004 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
1005 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
1006 +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
1007
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1008 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
1009 class instance.
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1010
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1011 """
1509
1d4ebe2a88fc hope this will make Range class a little bit clearer
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1505
diff changeset
1012 self.range_type = Type
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1013 re_range = r'(?:^|from(.+?))(?:to(.+?)$|$)'
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1014 re_geek_range = r'(?:^|(.+?));(?:(.+?)$|$)'
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1015 # Check which syntax to use
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1016 if spec.find(';') == -1:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1017 # Native english
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1018 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
1019 else:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1020 # Geek
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1021 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
1022 if mch_range:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1023 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
1024 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
1025 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
1026 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
1027 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
1028 else:
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1029 if allow_granularity:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1030 self.from_value = Type(spec, **params)
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1031 self.to_value = Type(spec, add_granularity=1, **params)
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1032 else:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1033 raise ValueError, "Invalid range"
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1034
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1035 def __str__(self):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1036 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
1037
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1038 def __repr__(self):
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1039 return "<Range %s>" % self.__str__()
2339
6ba57546d212 fix i18n - mainly plural forms in Interval.pretty()
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 2262
diff changeset
1040
1499
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1041 def test_range():
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1042 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
1043 "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
1044 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
1045 for rspec in rspecs:
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1046 print '>>> Range("%s")' % rspec
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1047 print `Range(rspec, Date)`
8ee69708da0c added support for searching on ranges of dates
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1494
diff changeset
1048 print
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1049 for rspec in rispecs:
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1050 print '>>> Range("%s")' % rspec
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1051 print `Range(rspec, Interval)`
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1052 print
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1053
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1054 def test():
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1055 intervals = (" 3w 1 d 2:00", " + 2d", "3w")
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1056 for interval in intervals:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1057 print '>>> Interval("%s")'%interval
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1058 print `Interval(interval)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1059
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1060 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
1061 "08-13.22:13", "14:25", '2002-12')
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1062 for date in dates:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1063 print '>>> Date("%s")'%date
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1064 print `Date(date)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1065
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1066 sums = ((". + 2d", "3w"), (".", " 3w 1 d 2:00"))
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1067 for date, interval in sums:
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1068 print '>>> Date("%s") + Interval("%s")'%(date, interval)
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1069 print `Date(date) + Interval(interval)`
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1070
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1071 if __name__ == '__main__':
1597
4d55f90d4af1 granularity based ranges
Andrey Lebedev <kedder@users.sourceforge.net>
parents: 1542
diff changeset
1072 test()
25
4cf1daf2f2eb More Grande Splite
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
1073
3210
ea29d69f7415 fix error message formatting in Date.__init__;
Alexander Smishlajev <a1s@users.sourceforge.net>
parents: 3151
diff changeset
1074 # vim: set filetype=python sts=4 sw=4 et si :

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