diff --git a/app/__init__.py b/app/__init__.py index 077d68ec2..71ff052cb 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -24,6 +24,7 @@ from app.clients.sms.mmg import MMGClient from app.clients.performance_platform.performance_platform_client import PerformancePlatformClient from app.encryption import Encryption +DATETIME_FORMAT_NO_TIMEZONE = "%Y-%m-%d %H:%M:%S.%f" DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" DATE_FORMAT = "%Y-%m-%d" diff --git a/app/models.py b/app/models.py index f8a2521a9..3a4b83f53 100644 --- a/app/models.py +++ b/app/models.py @@ -36,8 +36,8 @@ from app.encryption import ( from app import ( db, encryption, - DATETIME_FORMAT -) + DATETIME_FORMAT, + DATETIME_FORMAT_NO_TIMEZONE) from app.history_meta import Versioned @@ -166,7 +166,7 @@ class User(db.Model): 'mobile_number': self.mobile_number, 'organisations': [x.id for x in self.organisations if x.active], 'password_changed_at': ( - self.password_changed_at.strftime('%Y-%m-%d %H:%M:%S.%f') + self.password_changed_at.strftime(DATETIME_FORMAT_NO_TIMEZONE) if self.password_changed_at else None ), diff --git a/app/schemas.py b/app/schemas.py index e619bf2b6..8659834c5 100644 --- a/app/schemas.py +++ b/app/schemas.py @@ -22,7 +22,7 @@ from notifications_utils.recipients import ( validate_and_format_phone_number ) -from app import ma +from app import ma, DATETIME_FORMAT_NO_TIMEZONE from app import models from app.models import ServicePermission from app.dao.permissions_dao import permission_dao @@ -84,8 +84,8 @@ class BaseSchema(ma.ModelSchema): class UserSchema(BaseSchema): permissions = fields.Method("user_permissions", dump_only=True) - password_changed_at = field_for(models.User, 'password_changed_at', format='%Y-%m-%d %H:%M:%S.%f') - created_at = field_for(models.User, 'created_at', format='%Y-%m-%d %H:%M:%S.%f') + password_changed_at = field_for(models.User, 'password_changed_at', format=DATETIME_FORMAT_NO_TIMEZONE) + created_at = field_for(models.User, 'created_at', format=DATETIME_FORMAT_NO_TIMEZONE) auth_type = field_for(models.User, 'auth_type') def user_permissions(self, usr): @@ -210,7 +210,7 @@ class ServiceSchema(BaseSchema): organisation = field_for(models.Service, 'organisation') override_flag = False letter_contact_block = fields.Method(serialize="get_letter_contact") - go_live_at = field_for(models.Service, 'go_live_at', format='%Y-%m-%d %H:%M:%S.%f') + go_live_at = field_for(models.Service, 'go_live_at', format=DATETIME_FORMAT_NO_TIMEZONE) def get_letter_logo_filename(self, service): return service.letter_branding and service.letter_branding.filename @@ -345,7 +345,7 @@ class TemplateHistorySchema(BaseSchema): reply_to_text = fields.Method("get_reply_to_text", allow_none=True) created_by = fields.Nested(UserSchema, only=['id', 'name', 'email_address'], dump_only=True) - created_at = field_for(models.Template, 'created_at', format='%Y-%m-%d %H:%M:%S.%f') + created_at = field_for(models.Template, 'created_at', format=DATETIME_FORMAT_NO_TIMEZONE) def get_reply_to(self, template): return template.reply_to diff --git a/app/service/rest.py b/app/service/rest.py index e266911b4..80cfccd2c 100644 --- a/app/service/rest.py +++ b/app/service/rest.py @@ -12,7 +12,7 @@ from notifications_utils.timezones import convert_utc_to_bst from sqlalchemy.exc import IntegrityError from sqlalchemy.orm.exc import NoResultFound -from app import DATE_FORMAT +from app import DATE_FORMAT, DATETIME_FORMAT_NO_TIMEZONE from app.config import QueueNames from app.dao import fact_notification_status_dao, notifications_dao from app.dao.dao_utils import dao_rollback @@ -966,7 +966,7 @@ def get_returned_letters(service_id): # client reference can only be added on API letters 'client_reference': x.client_reference if x.api_key_id else None, 'reported_at': x.reported_at.strftime(DATE_FORMAT), - 'created_at': x.created_at.strftime("%Y-%m-%d %H:%M:%S"), + 'created_at': x.created_at.strftime(DATETIME_FORMAT_NO_TIMEZONE), # it doesn't make sense to show hidden/precompiled templates 'template_name': x.template_name if not x.hidden else None, 'template_id': x.template_id if not x.hidden else None, diff --git a/tests/app/service/test_rest.py b/tests/app/service/test_rest.py index 70159bd0a..bd4b945b3 100644 --- a/tests/app/service/test_rest.py +++ b/tests/app/service/test_rest.py @@ -3394,12 +3394,15 @@ def test_get_returned_letter_summary(admin_request, sample_service): @freeze_time('2019-12-11 13:30') def test_get_returned_letter(admin_request, sample_letter_template): - letter_1 = create_notification_history(template=sample_letter_template, client_reference='letter_1', - status=NOTIFICATION_RETURNED_LETTER, - created_at=datetime.utcnow() - timedelta(minutes=1), - created_by_id=sample_letter_template.service.users[0].id) + letter_from_previous_report = create_notification_history( + template=sample_letter_template, + client_reference='letter_from_previous_report', + status=NOTIFICATION_RETURNED_LETTER, + created_at=datetime.utcnow() - timedelta(minutes=1), + created_by_id=sample_letter_template.service.users[0].id + ) create_returned_letter(service=sample_letter_template.service, reported_at=datetime.utcnow() - timedelta(days=3), - notification_id=letter_1.id) + notification_id=letter_from_previous_report.id) job = create_job(template=sample_letter_template) letter_from_job = create_notification(template=sample_letter_template, client_reference='letter_from_job', @@ -3439,11 +3442,11 @@ def test_get_returned_letter(admin_request, sample_letter_template): create_returned_letter(service=sample_letter_template.service, reported_at=datetime.utcnow(), notification_id=uploaded_letter.id) - not_included_in_results = create_template(service=create_service(service_name='not included in results'), - template_type='letter') - letter_4 = create_notification_history(template=not_included_in_results, + not_included_in_results_template = create_template(service=create_service(service_name='not included in results'), + template_type='letter') + letter_4 = create_notification_history(template=not_included_in_results_template, status=NOTIFICATION_RETURNED_LETTER) - create_returned_letter(service=not_included_in_results.service, reported_at=datetime.utcnow(), + create_returned_letter(service=not_included_in_results_template.service, reported_at=datetime.utcnow(), notification_id=letter_4.id) response = admin_request.get('service.get_returned_letters', service_id=sample_letter_template.service_id, reported_at='2019-12-11') @@ -3452,7 +3455,7 @@ def test_get_returned_letter(admin_request, sample_letter_template): assert response[0]['notification_id'] == str(letter_from_job.id) assert not response[0]['client_reference'] assert response[0]['reported_at'] == '2019-12-11' - assert response[0]['created_at'] == '2019-12-10 13:30:00' + assert response[0]['created_at'] == '2019-12-10 13:30:00.000000' assert response[0]['template_name'] == sample_letter_template.name assert response[0]['template_id'] == str(sample_letter_template.id) assert response[0]['template_version'] == sample_letter_template.version @@ -3464,7 +3467,7 @@ def test_get_returned_letter(admin_request, sample_letter_template): assert response[1]['notification_id'] == str(one_off_letter.id) assert not response[1]['client_reference'] assert response[1]['reported_at'] == '2019-12-11' - assert response[1]['created_at'] == '2019-12-09 13:30:00' + assert response[1]['created_at'] == '2019-12-09 13:30:00.000000' assert response[1]['template_name'] == sample_letter_template.name assert response[1]['template_id'] == str(sample_letter_template.id) assert response[1]['template_version'] == sample_letter_template.version @@ -3476,7 +3479,7 @@ def test_get_returned_letter(admin_request, sample_letter_template): assert response[2]['notification_id'] == str(api_letter.id) assert response[2]['client_reference'] == 'api_letter' assert response[2]['reported_at'] == '2019-12-11' - assert response[2]['created_at'] == '2019-12-08 13:30:00' + assert response[2]['created_at'] == '2019-12-08 13:30:00.000000' assert response[2]['template_name'] == sample_letter_template.name assert response[2]['template_id'] == str(sample_letter_template.id) assert response[2]['template_version'] == sample_letter_template.version @@ -3488,7 +3491,7 @@ def test_get_returned_letter(admin_request, sample_letter_template): assert response[3]['notification_id'] == str(precompiled_letter.id) assert response[3]['client_reference'] == 'precompiled letter' assert response[3]['reported_at'] == '2019-12-11' - assert response[3]['created_at'] == '2019-12-07 13:30:00' + assert response[3]['created_at'] == '2019-12-07 13:30:00.000000' assert not response[3]['template_name'] assert not response[3]['template_id'] assert not response[3]['template_version'] @@ -3500,7 +3503,7 @@ def test_get_returned_letter(admin_request, sample_letter_template): assert response[4]['notification_id'] == str(uploaded_letter.id) assert not response[4]['client_reference'] assert response[4]['reported_at'] == '2019-12-11' - assert response[4]['created_at'] == '2019-12-06 13:30:00' + assert response[4]['created_at'] == '2019-12-06 13:30:00.000000' assert not response[4]['template_name'] assert not response[4]['template_id'] assert not response[4]['template_version']