Merge pull request #3184 from alphagov/callback-template-data

Send template id and version with delivery status callback
This commit is contained in:
Katie Smith
2021-03-24 11:22:56 +00:00
committed by GitHub
3 changed files with 23 additions and 23 deletions

View File

@@ -26,6 +26,12 @@ def send_delivery_status_to_service(
"sent_at": status_update['notification_sent_at'], "sent_at": status_update['notification_sent_at'],
"notification_type": status_update['notification_type'] "notification_type": status_update['notification_type']
} }
# TODO: set the template_id and template_version keys when data dict is created once this change has
# been deployed long enough for all tasks to have those keys in status_update
if status_update.get("template_id"):
data["template_id"] = status_update['template_id']
data["template_version"] = status_update['template_version']
_send_data_to_service_callback_api( _send_data_to_service_callback_api(
self, self,
data, data,
@@ -121,6 +127,8 @@ def create_delivery_status_callback_data(notification, service_callback_api):
"notification_type": notification.notification_type, "notification_type": notification.notification_type,
"service_callback_api_url": service_callback_api.url, "service_callback_api_url": service_callback_api.url,
"service_callback_api_bearer_token": service_callback_api.bearer_token, "service_callback_api_bearer_token": service_callback_api.bearer_token,
"template_id": str(notification.template_id),
"template_version": notification.template_version,
} }
return encryption.encrypt(data) return encryption.encrypt(data)

View File

@@ -15,13 +15,16 @@ from notifications_utils.template import SMSMessageTemplate
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.orm.exc import NoResultFound
from app import db, encryption from app import db
from app.aws import s3 from app.aws import s3
from app.celery.letters_pdf_tasks import get_pdf_for_templated_letter from app.celery.letters_pdf_tasks import get_pdf_for_templated_letter
from app.celery.reporting_tasks import ( from app.celery.reporting_tasks import (
create_nightly_notification_status_for_day, create_nightly_notification_status_for_day,
) )
from app.celery.service_callback_tasks import send_delivery_status_to_service from app.celery.service_callback_tasks import (
create_delivery_status_callback_data,
send_delivery_status_to_service,
)
from app.celery.tasks import process_row, record_daily_sorted_counts from app.celery.tasks import process_row, record_daily_sorted_counts
from app.config import QueueNames from app.config import QueueNames
from app.dao.annual_billing_dao import ( from app.dao.annual_billing_dao import (
@@ -72,7 +75,7 @@ from app.models import (
Service, Service,
User, User,
) )
from app.utils import DATETIME_FORMAT, get_london_midnight_in_utc from app.utils import get_london_midnight_in_utc
@click.group(name='command', help='Additional commands') @click.group(name='command', help='Additional commands')
@@ -322,19 +325,7 @@ def replay_service_callbacks(file_name, service_id):
raise Exception("Some notifications for the given references were not found") raise Exception("Some notifications for the given references were not found")
for n in notifications: for n in notifications:
data = { encrypted_status_update = create_delivery_status_callback_data(n, callback_api)
"notification_id": str(n.id),
"notification_client_reference": n.client_reference,
"notification_to": n.to,
"notification_status": n.status,
"notification_created_at": n.created_at.strftime(DATETIME_FORMAT),
"notification_updated_at": n.updated_at.strftime(DATETIME_FORMAT),
"notification_sent_at": n.sent_at.strftime(DATETIME_FORMAT),
"notification_type": n.notification_type,
"service_callback_api_url": callback_api.url,
"service_callback_api_bearer_token": callback_api.bearer_token,
}
encrypted_status_update = encryption.encrypt(data)
send_delivery_status_to_service.apply_async([str(n.id), encrypted_status_update], send_delivery_status_to_service.apply_async([str(n.id), encrypted_status_update],
queue=QueueNames.CALLBACKS) queue=QueueNames.CALLBACKS)

View File

@@ -20,8 +20,7 @@ from tests.app.db import (
) )
@pytest.mark.parametrize("notification_type", @pytest.mark.parametrize("notification_type", ["email", "sms"])
["email", "letter", "sms"])
def test_send_delivery_status_to_service_post_https_request_to_service_with_encrypted_data( def test_send_delivery_status_to_service_post_https_request_to_service_with_encrypted_data(
notify_db_session, notification_type): notify_db_session, notification_type):
@@ -49,7 +48,9 @@ def test_send_delivery_status_to_service_post_https_request_to_service_with_encr
"created_at": datestr.strftime(DATETIME_FORMAT), "created_at": datestr.strftime(DATETIME_FORMAT),
"completed_at": datestr.strftime(DATETIME_FORMAT), "completed_at": datestr.strftime(DATETIME_FORMAT),
"sent_at": datestr.strftime(DATETIME_FORMAT), "sent_at": datestr.strftime(DATETIME_FORMAT),
"notification_type": notification_type "notification_type": notification_type,
"template_id": str(template.id),
"template_version": 1
} }
assert request_mock.call_count == 1 assert request_mock.call_count == 1
@@ -90,8 +91,7 @@ def test_send_complaint_to_service_posts_https_request_to_service_with_encrypted
assert request_mock.request_history[0].headers["Authorization"] == "Bearer {}".format(callback_api.bearer_token) assert request_mock.request_history[0].headers["Authorization"] == "Bearer {}".format(callback_api.bearer_token)
@pytest.mark.parametrize("notification_type", @pytest.mark.parametrize("notification_type", ["email", "sms"])
["email", "letter", "sms"])
def test__send_data_to_service_callback_api_retries_if_request_returns_500_with_encrypted_data( def test__send_data_to_service_callback_api_retries_if_request_returns_500_with_encrypted_data(
notify_db_session, mocker, notification_type notify_db_session, mocker, notification_type
): ):
@@ -115,8 +115,7 @@ def test__send_data_to_service_callback_api_retries_if_request_returns_500_with_
assert mocked.call_args[1]['queue'] == 'service-callbacks-retry' assert mocked.call_args[1]['queue'] == 'service-callbacks-retry'
@pytest.mark.parametrize("notification_type", @pytest.mark.parametrize("notification_type", ["email", "sms"])
["email", "letter", "sms"])
def test__send_data_to_service_callback_api_does_not_retry_if_request_returns_404_with_encrypted_data( def test__send_data_to_service_callback_api_does_not_retry_if_request_returns_404_with_encrypted_data(
notify_db_session, notify_db_session,
mocker, mocker,
@@ -185,6 +184,8 @@ def _set_up_data_for_status_update(callback_api, notification):
"notification_type": notification.notification_type, "notification_type": notification.notification_type,
"service_callback_api_url": callback_api.url, "service_callback_api_url": callback_api.url,
"service_callback_api_bearer_token": callback_api.bearer_token, "service_callback_api_bearer_token": callback_api.bearer_token,
"template_id": str(notification.template_id),
"template_version": notification.template_version,
} }
encrypted_status_update = encryption.encrypt(data) encrypted_status_update = encryption.encrypt(data)
return encrypted_status_update return encrypted_status_update