From 5c2469b24e94f0ed5063a7f2abb636176eaadc1b Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Tue, 29 Sep 2020 13:17:12 +0100 Subject: [PATCH] Refactor to use shared date comparison function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This means we don’t have to repeatedly do timezone conversions or string to datetime conversions in our business logic. --- app/main/views/two_factor.py | 4 ++-- app/models/job.py | 19 ++++++++----------- app/utils.py | 8 ++++---- tests/app/test_utils.py | 7 ++++--- 4 files changed, 18 insertions(+), 20 deletions(-) diff --git a/app/main/views/two_factor.py b/app/main/views/two_factor.py index e9140e8aa..1d64f1b1b 100644 --- a/app/main/views/two_factor.py +++ b/app/main/views/two_factor.py @@ -16,7 +16,7 @@ from app import user_api_client from app.main import main from app.main.forms import TwoFactorForm from app.models.user import User -from app.utils import is_less_than_90_days_ago, redirect_to_sign_in +from app.utils import is_less_than_days_ago, redirect_to_sign_in @main.route('/two-factor-email-sent', methods=['GET']) @@ -70,7 +70,7 @@ def two_factor(): form = TwoFactorForm(_check_code) if form.validate_on_submit(): - if is_less_than_90_days_ago(user.email_access_validated_at): + if is_less_than_days_ago(user.email_access_validated_at, 90): return log_in_user(user_id) else: user_api_client.send_verify_code(user.id, 'email', None, request.args.get('next')) diff --git a/app/models/job.py b/app/models/job.py index 5ff3f4f82..adda565d5 100644 --- a/app/models/job.py +++ b/app/models/job.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta +from datetime import timedelta import pytz from notifications_utils.letter_timings import ( @@ -6,17 +6,18 @@ from notifications_utils.letter_timings import ( get_letter_timings, letter_can_be_cancelled, ) -from notifications_utils.timezones import ( - local_timezone, - utc_string_to_aware_gmt_datetime, -) +from notifications_utils.timezones import utc_string_to_aware_gmt_datetime from werkzeug.utils import cached_property from app.models import JSONModel, ModelList from app.notify_client.job_api_client import job_api_client from app.notify_client.notification_api_client import notification_api_client from app.notify_client.service_api_client import service_api_client -from app.utils import get_letter_printing_statement, set_status_filters +from app.utils import ( + get_letter_printing_statement, + is_less_than_days_ago, + set_status_filters, +) class Job(JSONModel): @@ -123,11 +124,7 @@ class Job(JSONModel): # must have been created recently enough to not have any # notifications yet return True - return ( - datetime.utcnow().astimezone(local_timezone) - utc_string_to_aware_gmt_datetime( - self.processing_started - ) - ).days < 1 + return is_less_than_days_ago(self.processing_started, 1) @property def template_id(self): diff --git a/app/utils.py b/app/utils.py index 850fa66fd..47728f759 100644 --- a/app/utils.py +++ b/app/utils.py @@ -820,10 +820,10 @@ def format_thousands(value): return value -def is_less_than_90_days_ago(date_from_db): - return (datetime.utcnow() - datetime.strptime( - date_from_db, "%Y-%m-%dT%H:%M:%S.%fZ" - )).days < 90 +def is_less_than_days_ago(date_from_db, number_of_days): + return ( + datetime.utcnow().astimezone(pytz.utc) - parser.parse(date_from_db).astimezone(pytz.utc) + ).days < number_of_days def hide_from_search_engines(f): diff --git a/tests/app/test_utils.py b/tests/app/test_utils.py index 7f7eb7671..abf1591c3 100644 --- a/tests/app/test_utils.py +++ b/tests/app/test_utils.py @@ -20,7 +20,7 @@ from app.utils import ( get_letter_validation_error, get_logo_cdn_domain, get_sample_template, - is_less_than_90_days_ago, + is_less_than_days_ago, merge_jsonlike, printing_today_or_tomorrow, round_to_significant_figures, @@ -597,10 +597,11 @@ def test_get_letter_validation_error_for_known_errors( @pytest.mark.parametrize("date_from_db, expected_result", [ ('2019-11-17T11:35:21.726132Z', True), ('2019-11-16T11:35:21.726132Z', False), + ('2019-11-16T11:35:21+0000', False), ]) @freeze_time('2020-02-14T12:00:00') -def test_is_less_than_90_days_ago(date_from_db, expected_result): - assert is_less_than_90_days_ago(date_from_db) == expected_result +def test_is_less_than_days_ago(date_from_db, expected_result): + assert is_less_than_days_ago(date_from_db, 90) == expected_result @pytest.mark.parametrize("template_type", ["sms", "letter", "email"])