diff --git a/app/notify_client/job_api_client.py b/app/notify_client/job_api_client.py index ac1cdfd9b..bd4400177 100644 --- a/app/notify_client/job_api_client.py +++ b/app/notify_client/job_api_client.py @@ -1,5 +1,9 @@ +import datetime +from zoneinfo import ZoneInfo + from app.extensions import redis_client from app.notify_client import NotifyAdminAPIClient, _attach_current_user, cache +from app.utils.csv import get_user_preferred_timezone class JobApiClient(NotifyAdminAPIClient): @@ -86,10 +90,26 @@ class JobApiClient(NotifyAdminAPIClient): def has_jobs(self, service_id): return bool(self.get_jobs(service_id)["data"]) + @classmethod + def convert_user_time_to_utc(cls, scheduled_for): + user_preferred_tz = get_user_preferred_timezone() + + user_date = datetime.datetime.fromisoformat(scheduled_for) + scheduled_for = ( + user_date.replace(tzinfo=ZoneInfo(user_preferred_tz)) + .astimezone(ZoneInfo("UTC")) + .strftime("%Y-%m-%dT%H:%M:%S") + ) + + return scheduled_for + def create_job(self, job_id, service_id, scheduled_for=None): data = {"id": job_id} + # make a datetime object in the user's preferred timezone + if scheduled_for: + scheduled_for = self.convert_user_time_to_utc(scheduled_for) data.update({"scheduled_for": scheduled_for}) data = _attach_current_user(data) diff --git a/app/utils/time.py b/app/utils/time.py index 9ae24b1bd..b658fba56 100644 --- a/app/utils/time.py +++ b/app/utils/time.py @@ -22,3 +22,9 @@ def is_less_than_days_ago(date_from_db, number_of_days): def parse_naive_dt(dt): return parser.parse(dt, ignoretz=True) + + +def hilite(message): + ansi_green = "\033[32m" + ansi_reset = "\033[0m" + return f"{ansi_green}{message}{ansi_reset}" diff --git a/tests/app/notify_client/test_job_client.py b/tests/app/notify_client/test_job_client.py index 7cec603c6..6f76b1786 100644 --- a/tests/app/notify_client/test_job_client.py +++ b/tests/app/notify_client/test_job_client.py @@ -32,16 +32,24 @@ def test_client_creates_job_data_correctly(mocker, fake_uuid): ) +def test_convert_user_time_to_utc(): + original_time = "2023-12-01T12:00:00" + utc_time = JobApiClient.convert_user_time_to_utc(original_time) + assert utc_time == "2023-12-01T17:00:00" + + def test_client_schedules_job(mocker, fake_uuid): mocker.patch("app.notify_client.current_user", id="1") mock_post = mocker.patch("app.notify_client.job_api_client.JobApiClient.post") - when = "2016-08-25T13:04:21.767198" + # The default timezone is US/Easter which is off by 4 hours in the summer from UTC + when_in_utc = "2016-08-25T17:04:21" + when = "2016-08-25T13:04:21" JobApiClient().create_job(fake_uuid, 1, scheduled_for=when) - assert mock_post.call_args[1]["data"]["scheduled_for"] == when + assert mock_post.call_args[1]["data"]["scheduled_for"] == when_in_utc def test_client_gets_job_by_service_and_job(mocker):