Skip to content

Commit

Permalink
fix(timestamps): generate timestamps correctly and remove the depreca…
Browse files Browse the repository at this point in the history
…ted pytz
  • Loading branch information
uptickmetachu committed May 23, 2024
1 parent 4126c4c commit 1e0b397
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 9 deletions.
4 changes: 2 additions & 2 deletions backend/bot/scheduler/scheduler.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import zoneinfo
import config
import datetime
import slack_sdk
Expand All @@ -14,7 +15,6 @@
store_slack_user_list_db,
)
from iblog import logger
from pytz import timezone
from typing import List


Expand All @@ -26,7 +26,7 @@ class TaskScheduler:
def __init__(self):
self.scheduler = BackgroundScheduler(
jobstores=jobstores,
timezone=timezone(application_timezone),
timezone=zoneinfo.ZoneInfo(application_timezone),
)

def list_jobs(self) -> List[Job]:
Expand Down
17 changes: 11 additions & 6 deletions backend/bot/shared/tools.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import config
import zoneinfo
import ipaddress
import itertools
import random
import string

from datetime import datetime
from iblog import logger
from pytz import timezone
from typing import Any, List


Expand All @@ -19,18 +19,23 @@
application_timezone = config.active.options.get("timezone")


def fetch_timestamp(short: bool = False):
def fetch_timestamp(short: bool = False, timezone: str | None = None) -> str:
"""Return a localized, formatted timestamp using datetime.now()"""
now = datetime.now()
localized = timezone(application_timezone).localize(now)
localized = datetime.now(
zoneinfo.ZoneInfo(timezone or application_timezone)
)
if short:
return localized.strftime(timestamp_fmt_short)
return localized.strftime(timestamp_fmt)


def fetch_timestamp_from_time_obj(t: datetime):
def fetch_timestamp_from_time_obj(
t: datetime, timezone: str | None = None
) -> str:
"""Return a localized, formatted timestamp using datetime.datetime class"""
return timezone(application_timezone).localize(t).strftime(timestamp_fmt)
return t.astimezone(
zoneinfo.ZoneInfo(timezone or application_timezone)
).strftime(timestamp_fmt)


def find_index_in_list(lst: List, key: Any, value: Any):
Expand Down
1 change: 0 additions & 1 deletion backend/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ pytest-mock==3.14.0
pytest-sqlalchemy-mock==0.1.5
python-dotenv==1.0.1
python-json-logger==2.0.7
pytz==2024.1
PyYAML==6.0.1
requests==2.31.0
requests-mock==1.11.0
Expand Down
44 changes: 44 additions & 0 deletions backend/tests/test_tools.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import datetime

from bot.shared.tools import (
fetch_timestamp,
fetch_timestamp_from_time_obj,
timestamp_fmt,
timestamp_fmt_short,
)


class TestTimeHelpers:
def test_fetch_timestamp_generates_the_correct_timestamp(self):
utc_timestamp = fetch_timestamp(timezone="UTC")
melbourne_timestamp = fetch_timestamp(timezone="Australia/Melbourne")

parsed_melbourne = datetime.datetime.strptime(
utc_timestamp[:13], "%Y-%m-%dT%H"
)
parsed_utc = datetime.datetime.strptime(
melbourne_timestamp[:13], "%Y-%m-%dT%H"
)

assert (
parsed_melbourne.hour != parsed_utc.hour
), "The timestamps should have different hours when using differnt timezones"

def test_fetch_timestamp_short(self):
short_timestamp = fetch_timestamp(short=True, timezone="UTC")

assert datetime.datetime.strptime(
short_timestamp, timestamp_fmt_short
), "Should be able to reparse the short format"

def test_fetch_timestamp_from_time_obj(self):
now = datetime.datetime.now(datetime.UTC)

now_as_est = fetch_timestamp_from_time_obj(
now, timezone="Australia/Melbourne"
)

now_as_melbourne_datetime = datetime.datetime.strptime(
now_as_est, timestamp_fmt
)
assert now_as_melbourne_datetime.hour != now.hour

0 comments on commit 1e0b397

Please sign in to comment.