5
5
from datetime import date
6
6
from datetime import datetime
7
7
8
+ import six
9
+
8
10
import pytz
9
11
from bika .lims import logger
12
+ from bika .lims .api import APIError
10
13
from DateTime import DateTime
14
+ from DateTime .DateTime import DateError
15
+ from DateTime .DateTime import SyntaxError
16
+ from DateTime .DateTime import TimeError
17
+
18
+
19
+ def is_str (obj ):
20
+ """Check if the given object is a string
21
+
22
+ :param obj: arbitrary object
23
+ :returns: True when the object is a string
24
+ """
25
+ return isinstance (obj , six .string_types )
11
26
12
27
13
28
def is_d (dt ):
@@ -43,6 +58,9 @@ def is_date(dt):
43
58
:param dt: date to check
44
59
:returns: True when the object is either a datetime or DateTime
45
60
"""
61
+ if is_str (dt ):
62
+ DT = to_DT (dt )
63
+ return is_date (DT )
46
64
if is_d (dt ):
47
65
return True
48
66
if is_dt (dt ):
@@ -64,7 +82,10 @@ def is_timezone_naive(dt):
64
82
return dt .timezoneNaive ()
65
83
elif is_dt (dt ):
66
84
return dt .tzinfo is None
67
- raise TypeError ("Expected a date, got '%r'" % type (dt ))
85
+ elif is_str (dt ):
86
+ DT = to_DT (dt )
87
+ return is_timezone_naive (DT )
88
+ raise APIError ("Expected a date type, got '%r'" % type (dt ))
68
89
69
90
70
91
def is_timezone_aware (dt ):
@@ -84,12 +105,18 @@ def to_DT(dt):
84
105
"""
85
106
if is_DT (dt ):
86
107
return dt
108
+ elif is_str (dt ):
109
+ try :
110
+ return DateTime (dt )
111
+ except (DateError , TimeError , SyntaxError , IndexError ):
112
+ return None
87
113
elif is_dt (dt ):
88
114
return DateTime (dt .isoformat ())
89
115
elif is_d (dt ):
90
116
dt = datetime (dt .year , dt .month , dt .day )
91
117
return DateTime (dt .isoformat ())
92
- raise TypeError ("Expected datetime, got '%r'" % type (dt ))
118
+ else :
119
+ return None
93
120
94
121
95
122
def to_dt (dt ):
@@ -100,11 +127,15 @@ def to_dt(dt):
100
127
"""
101
128
if is_DT (dt ):
102
129
return dt .asdatetime ()
130
+ elif is_str (dt ):
131
+ DT = to_DT (dt )
132
+ return to_dt (DT )
103
133
elif is_dt (dt ):
104
134
return dt
105
135
elif is_d (dt ):
106
136
return datetime (dt .year , dt .month , dt .day )
107
- raise TypeError ("Expected DateTime, got '%r'" % type (dt ))
137
+ else :
138
+ return None
108
139
109
140
110
141
def is_valid_timezone (timezone ):
@@ -155,14 +186,16 @@ def to_zone(dt, timezone):
155
186
:param timezone: timezone
156
187
:returns: date converted to timezone
157
188
"""
158
- if is_dt (dt ):
189
+ if is_dt (dt ) or is_d (dt ):
190
+ dt = to_dt (dt )
159
191
zone = pytz .timezone (timezone )
160
192
if is_timezone_aware (dt ):
161
193
return dt .astimezone (zone )
162
194
return zone .localize (dt )
163
- if is_DT (dt ):
195
+ elif is_DT (dt ):
164
196
# NOTE: This shifts the time according to the TZ offset
165
197
return dt .toZone (timezone )
198
+ raise TypeError ("Expected a date, got '%r'" % type (dt ))
166
199
167
200
168
201
def to_timestamp (dt ):
@@ -176,6 +209,9 @@ def to_timestamp(dt):
176
209
timestamp = dt .timeTime ()
177
210
elif is_dt (dt ):
178
211
timestamp = time .mktime (dt .timetuple ())
212
+ elif is_str (dt ):
213
+ DT = to_DT (dt )
214
+ return to_timestamp (DT )
179
215
return timestamp
180
216
181
217
@@ -185,7 +221,6 @@ def from_timestamp(timestamp):
185
221
:param timestamp: POSIX timestamp
186
222
:returns: datetime object
187
223
"""
188
-
189
224
return datetime .utcfromtimestamp (timestamp )
190
225
191
226
@@ -196,4 +231,7 @@ def to_iso_format(dt):
196
231
return dt .isoformat ()
197
232
elif is_DT (dt ):
198
233
return dt .ISO ()
234
+ elif is_str (dt ):
235
+ DT = to_DT (dt )
236
+ return to_iso_format (DT )
199
237
return None
0 commit comments