Skip to content

Commit 4a7216f

Browse files
committed
tweak code
1 parent a5df00b commit 4a7216f

File tree

2 files changed

+40
-12
lines changed

2 files changed

+40
-12
lines changed

news_events/etl/utils.py

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -134,26 +134,48 @@ def parse_date(text_date: str) -> datetime:
134134
return dt_utc
135135

136136

137+
def convert_to_utc(dt: datetime, known_tz: str) -> datetime:
138+
"""
139+
Convert a datetime object to UTC timezone. If its
140+
orignal timezone is not known, assume it is in US/Eastern.
141+
142+
Args:
143+
dt (datetime): The datetime object to convert
144+
known_tz (str): The timezone string if known
145+
146+
Returns:
147+
datetime: The datetime object in UTC timezone
148+
"""
149+
if not dt:
150+
return None
151+
if not known_tz:
152+
# Assume it is in US/Eastern where MIT is
153+
dt = dt.replace(tzinfo=ZoneInfo("US/Eastern"))
154+
return dt.astimezone(UTC)
155+
156+
137157
def parse_date_time_range(
138-
start_date_str, end_date_str, time_range_str: str
158+
start_date_str: str, end_date_str: str, time_range_str: str
139159
) -> tuple[datetime, datetime]:
140160
"""
141161
Attempt to parse the time range from the MITPE events API.
142162
The field might not actually contain a time or range.
143163
144164
Args:
165+
start_date_str (str): start date string
166+
end_date_str (str): end date string
145167
time_range (str): time range string
146168
147169
Returns:
148-
tuple: start and end times as strings
170+
tuple: start and end datetimes
149171
150172
"""
151173
start_time, start_ampm, end_time, end_ampm, tz = "", "", "", "", ""
152174
time_regex = re.compile(
153175
r"(\d{1,2})(:\d{2})?\s*(am|pm)?\s*-?\s*(\d{1,2})(:?\d{2})?\s*(am|pm)?\s*([A-Za-z]{2,3})?",
154176
re.IGNORECASE,
155177
)
156-
time_match = re.match(time_regex, time_range_str)
178+
time_match = re.match(time_regex, time_range_str or "")
157179
if time_match:
158180
start_time = f"{time_match.group(1)}{time_match.group(2) or ':00'}" or ""
159181
start_ampm = time_match.group(3) or ""
@@ -165,10 +187,6 @@ def parse_date_time_range(
165187
) or dateparser.parse(start_date_str)
166188
else:
167189
start_date = dateparser.parse(start_date_str)
168-
if start_date:
169-
if not tz:
170-
start_date = start_date.replace(tzinfo=ZoneInfo("US/Eastern"))
171-
start_date = start_date.astimezone(UTC)
172190
if end_date_str:
173191
end_date = dateparser.parse(
174192
f"{end_date_str} {end_time}{end_ampm or ''} {tz}"
@@ -177,10 +195,6 @@ def parse_date_time_range(
177195
end_date = dateparser.parse(
178196
f"{start_date_str} {end_time}{end_ampm or ""} {tz}"
179197
) or dateparser.parse(start_date_str)
180-
if end_date:
181-
if not tz:
182-
end_date = end_date.replace(tzinfo=ZoneInfo("US/Eastern"))
183-
end_date = end_date.astimezone(UTC)
184198
if not start_date:
185199
log.error("Failed to parse start date %s", start_date_str)
186-
return start_date, end_date
200+
return convert_to_utc(start_date, tz), convert_to_utc(end_date, tz)

news_events/etl/utils_test.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,20 @@ def test_get_request_json_error_raise(mocker):
123123
datetime(2024, 7, 15, 23, 30, 0, tzinfo=UTC),
124124
datetime(2024, 7, 16, 1, 30, 0, tzinfo=UTC),
125125
),
126+
(
127+
"Future date tbd",
128+
None,
129+
None,
130+
None,
131+
None,
132+
),
133+
(
134+
"2024-07-15",
135+
"2024-07-30",
136+
"Every afternoon after end of class",
137+
datetime(2024, 7, 15, 4, 0, 0, tzinfo=UTC),
138+
datetime(2024, 7, 30, 4, 0, 0, tzinfo=UTC),
139+
),
126140
],
127141
)
128142
def test_parse_date_time_range(

0 commit comments

Comments
 (0)