From 74c9ca2bf68218f5d3c77ba655bc16a54cbf4d88 Mon Sep 17 00:00:00 2001 From: Pea Tyczynska Date: Thu, 5 Aug 2021 18:32:06 +0100 Subject: [PATCH 1/3] Fetch all broadcast messages that are or were transmitted Regardless of channel. Do not include: - broadcasts older than 25.05.2021 - stubbed broadcasts - broadcasts that were not transmitted. So only broadcasting, cancelled and completed make the list; --- app/dao/broadcast_message_dao.py | 11 +++++ tests/app/dao/test_broadcast_message_dao.py | 55 +++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/app/dao/broadcast_message_dao.py b/app/dao/broadcast_message_dao.py index 8adb9b681..003582deb 100644 --- a/app/dao/broadcast_message_dao.py +++ b/app/dao/broadcast_message_dao.py @@ -1,4 +1,6 @@ import uuid +from datetime import datetime +from sqlalchemy import desc from app import db from app.dao.dao_utils import autocommit @@ -9,6 +11,7 @@ from app.models import ( BroadcastProviderMessage, BroadcastProviderMessageNumber, BroadcastProviderMessageStatus, + BroadcastStatusType ) @@ -29,6 +32,14 @@ def dao_get_broadcast_messages_for_service(service_id): ).order_by(BroadcastMessage.created_at) +def dao_get_all_broadcast_messages(): + return BroadcastMessage.query.filter( + BroadcastMessage.starts_at >= datetime(2021, 5, 25, 0, 0, 0), + BroadcastMessage.stubbed == False, # noqa + BroadcastMessage.status.in_(BroadcastStatusType.LIVE_STATUSES) + ).order_by(desc(BroadcastMessage.starts_at)).all() + + def get_earlier_events_for_broadcast_event(broadcast_event_id): """ This is used to build up the references list. diff --git a/tests/app/dao/test_broadcast_message_dao.py b/tests/app/dao/test_broadcast_message_dao.py index 1b0738a0f..8b5a947e0 100644 --- a/tests/app/dao/test_broadcast_message_dao.py +++ b/tests/app/dao/test_broadcast_message_dao.py @@ -1,13 +1,18 @@ from datetime import datetime +from flask import current_app from app.dao.broadcast_message_dao import ( create_broadcast_provider_message, + dao_get_all_broadcast_messages, get_earlier_events_for_broadcast_event, ) +from app.dao.broadcast_service_dao import insert_or_update_service_broadcast_settings from app.models import BROADCAST_TYPE, BroadcastEventMessageType + from tests.app.db import ( create_broadcast_event, create_broadcast_message, + create_service, create_template, ) @@ -65,3 +70,53 @@ def test_create_broadcast_provider_message_creates_in_correct_state(sample_broad assert broadcast_provider_message.broadcast_event_id == broadcast_event.id assert broadcast_provider_message.created_at is not None assert broadcast_provider_message.updated_at is None + + +def test_dao_get_all_broadcast_messages(sample_broadcast_service): + template_1 = create_template(sample_broadcast_service, BROADCAST_TYPE) + # older message, should appear second in list + broadcast_message_1 = create_broadcast_message( + template_1, + starts_at=datetime(2021, 6, 15, 12, 0, 0), + status='cancelled') + + service_2 = create_service( + service_name="broadcast service 2", + service_permissions=[BROADCAST_TYPE] + ) + insert_or_update_service_broadcast_settings(service_2, channel="severe") + + template_2 = create_template(service_2, BROADCAST_TYPE) + # newer message, should appear first in list + broadcast_message_2 = create_broadcast_message( + template_2, + stubbed=False, + status='broadcasting', + starts_at=datetime(2021, 6, 20, 12, 0, 0), + ) + + # broadcast_message_stubbed + create_broadcast_message( + template_2, + stubbed=True, + status='broadcasting', + starts_at=datetime(2021, 6, 15, 12, 0, 0), + ) + # broadcast_message_old + create_broadcast_message( + template_2, + stubbed=False, + status='completed', + starts_at=datetime(2021, 5, 20, 12, 0, 0), + ) + # broadcast_message_rejected + create_broadcast_message( + template_2, + stubbed=False, + status='rejected', + starts_at=datetime(2021, 6, 15, 12, 0, 0), + ) + + broadcast_messages = dao_get_all_broadcast_messages() + assert len(broadcast_messages) == 2 + assert broadcast_messages == [broadcast_message_2, broadcast_message_1] From 0f7f219a558e9e0e4679f2101e489ffe3bea770c Mon Sep 17 00:00:00 2001 From: Pea Tyczynska Date: Fri, 6 Aug 2021 17:37:57 +0100 Subject: [PATCH 2/3] dao_get_all_broadcast_messages returns just fields govuk alerts need --- app/dao/broadcast_message_dao.py | 18 ++++++++++++++++-- app/v2/govuk_alerts/get_broadcasts.py | 4 +++- tests/app/dao/test_broadcast_message_dao.py | 12 ++++++++++-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/app/dao/broadcast_message_dao.py b/app/dao/broadcast_message_dao.py index 003582deb..55d6829bf 100644 --- a/app/dao/broadcast_message_dao.py +++ b/app/dao/broadcast_message_dao.py @@ -11,7 +11,8 @@ from app.models import ( BroadcastProviderMessage, BroadcastProviderMessageNumber, BroadcastProviderMessageStatus, - BroadcastStatusType + BroadcastStatusType, + ServiceBroadcastSettings ) @@ -33,7 +34,20 @@ def dao_get_broadcast_messages_for_service(service_id): def dao_get_all_broadcast_messages(): - return BroadcastMessage.query.filter( + return db.session.query( + BroadcastMessage.id, + BroadcastMessage.reference, + ServiceBroadcastSettings.channel, + BroadcastMessage.content, + BroadcastMessage.areas, + BroadcastMessage.status, + BroadcastMessage.starts_at, + BroadcastMessage.finishes_at, + BroadcastMessage.approved_at, + BroadcastMessage.cancelled_at, + ).join( + ServiceBroadcastSettings, ServiceBroadcastSettings.service_id == BroadcastMessage.service_id + ).filter( BroadcastMessage.starts_at >= datetime(2021, 5, 25, 0, 0, 0), BroadcastMessage.stubbed == False, # noqa BroadcastMessage.status.in_(BroadcastStatusType.LIVE_STATUSES) diff --git a/app/v2/govuk_alerts/get_broadcasts.py b/app/v2/govuk_alerts/get_broadcasts.py index 290b01d8d..c307a6c8c 100644 --- a/app/v2/govuk_alerts/get_broadcasts.py +++ b/app/v2/govuk_alerts/get_broadcasts.py @@ -1,8 +1,10 @@ from flask import jsonify +from app.dao.broadcast_message_dao import dao_get_all_broadcast_messages from app.v2.govuk_alerts import v2_govuk_alerts_blueprint @v2_govuk_alerts_blueprint.route('') def get_broadcasts(): - return jsonify({}) + all_broadcasts = dao_get_all_broadcast_messages() + return jsonify(all_broadcasts) diff --git a/tests/app/dao/test_broadcast_message_dao.py b/tests/app/dao/test_broadcast_message_dao.py index 8b5a947e0..afbe4c879 100644 --- a/tests/app/dao/test_broadcast_message_dao.py +++ b/tests/app/dao/test_broadcast_message_dao.py @@ -1,5 +1,4 @@ from datetime import datetime -from flask import current_app from app.dao.broadcast_message_dao import ( create_broadcast_provider_message, @@ -119,4 +118,13 @@ def test_dao_get_all_broadcast_messages(sample_broadcast_service): broadcast_messages = dao_get_all_broadcast_messages() assert len(broadcast_messages) == 2 - assert broadcast_messages == [broadcast_message_2, broadcast_message_1] + assert broadcast_messages == [ + ( + broadcast_message_2.id, None, 'severe', 'Dear Sir/Madam, Hello. Yours Truly, The Government.', + {'areas': [], 'simple_polygons': []}, 'broadcasting', datetime(2021, 6, 20, 12, 0), + None, None, None), + ( + broadcast_message_1.id, None, 'severe', 'Dear Sir/Madam, Hello. Yours Truly, The Government.', + {'areas': [], 'simple_polygons': []}, 'cancelled', datetime(2021, 6, 15, 12, 0), + None, None, None) + ] From 9d2f8347b26c471a4a6f401cabd48c63414a6a29 Mon Sep 17 00:00:00 2001 From: Pea Tyczynska Date: Fri, 6 Aug 2021 18:06:49 +0100 Subject: [PATCH 3/3] get_broadcasts returns a list of broadcasts for gov.uk/alerts --- app/dao/broadcast_message_dao.py | 3 +- app/v2/govuk_alerts/get_broadcasts.py | 17 +++++++- tests/app/dao/test_broadcast_message_dao.py | 5 ++- tests/app/v2/govuk_alerts/__init__.py | 0 .../v2/govuk_alerts/test_get_broadcasts.py | 39 +++++++++++++++++++ 5 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 tests/app/v2/govuk_alerts/__init__.py create mode 100644 tests/app/v2/govuk_alerts/test_get_broadcasts.py diff --git a/app/dao/broadcast_message_dao.py b/app/dao/broadcast_message_dao.py index 55d6829bf..5903f7fbe 100644 --- a/app/dao/broadcast_message_dao.py +++ b/app/dao/broadcast_message_dao.py @@ -1,5 +1,6 @@ import uuid from datetime import datetime + from sqlalchemy import desc from app import db @@ -12,7 +13,7 @@ from app.models import ( BroadcastProviderMessageNumber, BroadcastProviderMessageStatus, BroadcastStatusType, - ServiceBroadcastSettings + ServiceBroadcastSettings, ) diff --git a/app/v2/govuk_alerts/get_broadcasts.py b/app/v2/govuk_alerts/get_broadcasts.py index c307a6c8c..acf6da04a 100644 --- a/app/v2/govuk_alerts/get_broadcasts.py +++ b/app/v2/govuk_alerts/get_broadcasts.py @@ -1,10 +1,23 @@ from flask import jsonify from app.dao.broadcast_message_dao import dao_get_all_broadcast_messages +from app.utils import get_dt_string_or_none from app.v2.govuk_alerts import v2_govuk_alerts_blueprint @v2_govuk_alerts_blueprint.route('') def get_broadcasts(): - all_broadcasts = dao_get_all_broadcast_messages() - return jsonify(all_broadcasts) + broadcasts = dao_get_all_broadcast_messages() + broadcasts_dict = {"alerts": [{ + "id": broadcast.id, + "reference": broadcast.reference, + "channel": broadcast.channel, + "content": broadcast.content, + "areas": broadcast.areas, + "status": broadcast.status, + "starts_at": get_dt_string_or_none(broadcast.starts_at), + "finishes_at": get_dt_string_or_none(broadcast.finishes_at), + "approved_at": get_dt_string_or_none(broadcast.approved_at), + "cancelled_at": get_dt_string_or_none(broadcast.cancelled_at), + } for broadcast in broadcasts]} + return jsonify(broadcasts_dict), 200 diff --git a/tests/app/dao/test_broadcast_message_dao.py b/tests/app/dao/test_broadcast_message_dao.py index afbe4c879..fe4b4ebfa 100644 --- a/tests/app/dao/test_broadcast_message_dao.py +++ b/tests/app/dao/test_broadcast_message_dao.py @@ -5,9 +5,10 @@ from app.dao.broadcast_message_dao import ( dao_get_all_broadcast_messages, get_earlier_events_for_broadcast_event, ) -from app.dao.broadcast_service_dao import insert_or_update_service_broadcast_settings +from app.dao.broadcast_service_dao import ( + insert_or_update_service_broadcast_settings, +) from app.models import BROADCAST_TYPE, BroadcastEventMessageType - from tests.app.db import ( create_broadcast_event, create_broadcast_message, diff --git a/tests/app/v2/govuk_alerts/__init__.py b/tests/app/v2/govuk_alerts/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/app/v2/govuk_alerts/test_get_broadcasts.py b/tests/app/v2/govuk_alerts/test_get_broadcasts.py new file mode 100644 index 000000000..d0f62efdf --- /dev/null +++ b/tests/app/v2/govuk_alerts/test_get_broadcasts.py @@ -0,0 +1,39 @@ +from datetime import datetime + +from flask import current_app, json + +from app.models import BROADCAST_TYPE +from tests import create_internal_authorization_header +from tests.app.db import create_broadcast_message, create_template + + +def test_get_all_broadcasts_returns_list_of_broadcasts_and_200( + client, sample_broadcast_service +): + template_1 = create_template(sample_broadcast_service, BROADCAST_TYPE) + + broadcast_message_1 = create_broadcast_message( + template_1, + starts_at=datetime(2021, 6, 15, 12, 0, 0), + status='cancelled') + + broadcast_message_2 = create_broadcast_message( + template_1, + starts_at=datetime(2021, 6, 22, 12, 0, 0), + status='broadcasting') + + jwt_client_id = current_app.config['GOVUK_ALERTS_CLIENT_ID'] + header = create_internal_authorization_header(jwt_client_id) + + response = client.get('/v2/govuk-alerts', headers=[header]) + + json_response = json.loads(response.get_data(as_text=True)) + + assert response.status_code == 200 + assert len(json_response['alerts']) == 2 + + assert json_response['alerts'][0]['id'] == str(broadcast_message_2.id) + assert json_response['alerts'][0]['starts_at'] == '2021-06-22T12:00:00.000000Z' + assert json_response['alerts'][0]['finishes_at'] is None + assert json_response['alerts'][1]['id'] == str(broadcast_message_1.id) + assert json_response['alerts'][1]['starts_at'] == '2021-06-15T12:00:00.000000Z'