Refactor to use shared date comparison function

This means we don’t have to repeatedly do timezone conversions or string
to datetime conversions in our business logic.
This commit is contained in:
Chris Hill-Scott
2020-09-29 13:17:12 +01:00
parent 86ec9430a2
commit 5c2469b24e
4 changed files with 18 additions and 20 deletions

View File

@@ -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'))

View File

@@ -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):

View File

@@ -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):

View File

@@ -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"])