From dc4db4951a481ccd0e033bd12f295ce651c6a8ad Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Thu, 8 Apr 2021 13:09:29 +0100 Subject: [PATCH] Add a separate page for rejected alerts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We don’t want to mix these up with alerts that actually went out. --- app/main/views/broadcast.py | 33 ++++++++++++++++++-- app/navigation.py | 4 +++ app/templates/main_nav.html | 1 + tests/app/main/views/test_broadcast.py | 42 +++++++++++++++++++++++--- tests/app/test_navigation.py | 3 ++ 5 files changed, 77 insertions(+), 6 deletions(-) diff --git a/app/main/views/broadcast.py b/app/main/views/broadcast.py index 35e77ffae..7299281e0 100644 --- a/app/main/views/broadcast.py +++ b/app/main/views/broadcast.py @@ -51,7 +51,6 @@ def broadcast_dashboard_previous(service_id): broadcasts=BroadcastMessages(service_id).with_status( 'cancelled', 'completed', - 'rejected', ), page_title='Previous alerts', empty_message='You do not have any previous alerts', @@ -59,6 +58,21 @@ def broadcast_dashboard_previous(service_id): ) +@main.route('/services//rejected-alerts') +@user_has_permissions() +@service_has_permission('broadcast') +def broadcast_dashboard_rejected(service_id): + return render_template( + 'views/broadcast/previous-broadcasts.html', + broadcasts=BroadcastMessages(service_id).with_status( + 'rejected', + ), + page_title='Rejected alerts', + empty_message='You do not have any rejected alerts', + view_broadcast_endpoint='.view_rejected_broadcast', + ) + + @main.route('/services//broadcast-dashboard.json') @user_has_permissions() @service_has_permission('broadcast') @@ -345,6 +359,10 @@ def preview_broadcast_message(service_id, broadcast_message_id): '/services//previous-alerts/', endpoint='view_previous_broadcast', ) +@main.route( + '/services//rejected-alerts/', + endpoint='view_rejected_broadcast', +) @user_has_permissions() @service_has_permission('broadcast') def view_broadcast(service_id, broadcast_message_id): @@ -356,7 +374,7 @@ def view_broadcast(service_id, broadcast_message_id): abort(404) if ( - broadcast_message.status in {'completed', 'cancelled', 'rejected'} + broadcast_message.status in {'completed', 'cancelled'} and request.endpoint != 'main.view_previous_broadcast' ): return redirect(url_for( @@ -375,9 +393,20 @@ def view_broadcast(service_id, broadcast_message_id): broadcast_message_id=broadcast_message.id, )) + if ( + broadcast_message.status in {'rejected'} + and request.endpoint != 'main.view_rejected_broadcast' + ): + return redirect(url_for( + '.view_rejected_broadcast', + service_id=current_service.id, + broadcast_message_id=broadcast_message.id, + )) + back_link_endpoint = { 'main.view_current_broadcast': '.broadcast_dashboard', 'main.view_previous_broadcast': '.broadcast_dashboard_previous', + 'main.view_rejected_broadcast': '.broadcast_dashboard_rejected', }[request.endpoint] return render_template( diff --git a/app/navigation.py b/app/navigation.py index a6145c95a..81fdf53cd 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -147,6 +147,10 @@ class MainNavigation(Navigation): 'broadcast_dashboard_previous', 'view_previous_broadcast', }, + 'rejected-broadcasts': { + 'broadcast_dashboard_rejected', + 'view_rejected_broadcast', + }, 'templates': { 'action_blocked', 'add_service_template', diff --git a/app/templates/main_nav.html b/app/templates/main_nav.html index f4d7c13a0..f7702cd10 100644 --- a/app/templates/main_nav.html +++ b/app/templates/main_nav.html @@ -7,6 +7,7 @@ {% if current_service.has_permission('broadcast') %}
  • Current alerts
  • Previous alerts
  • +
  • Rejected alerts
  • {% elif current_user.has_permissions('view_activity') %}
  • Dashboard
  • {% endif %} diff --git a/tests/app/main/views/test_broadcast.py b/tests/app/main/views/test_broadcast.py index 3272bb700..1e5046984 100644 --- a/tests/app/main/views/test_broadcast.py +++ b/tests/app/main/views/test_broadcast.py @@ -358,7 +358,7 @@ def test_broadcast_dashboard( @pytest.mark.parametrize('endpoint', ( - '.broadcast_dashboard', '.broadcast_dashboard_previous', + '.broadcast_dashboard', '.broadcast_dashboard_previous', '.broadcast_dashboard_rejected', )) def test_broadcast_dashboard_does_not_have_button_for_view_only_user( client_request, @@ -420,7 +420,6 @@ def test_previous_broadcasts_page( normalize_spaces(row.text) for row in page.select('.ajax-block-container')[0].select('.file-list') ] == [ - 'Example template This is a test Rejected today at 1:20am England Scotland', 'Example template This is a test Broadcast yesterday at 2:20pm England Scotland', 'Example template This is a test Broadcast yesterday at 2:20am England Scotland', ] @@ -435,6 +434,40 @@ def test_previous_broadcasts_page( ) +@freeze_time('2020-02-20 02:20') +def test_rejected_broadcasts_page( + client_request, + service_one, + mock_get_broadcast_messages, + mock_get_service_templates, +): + service_one['permissions'] += ['broadcast'] + page = client_request.get( + '.broadcast_dashboard_rejected', + service_id=SERVICE_ONE_ID, + ) + + assert normalize_spaces(page.select_one('main h1').text) == ( + 'Rejected alerts' + ) + assert len(page.select('.ajax-block-container')) == 1 + assert [ + normalize_spaces(row.text) + for row in page.select('.ajax-block-container')[0].select('.file-list') + ] == [ + 'Example template This is a test Rejected today at 1:20am England Scotland', + ] + + button = page.select_one( + '.js-stick-at-bottom-when-scrolling a.govuk-button.govuk-button--secondary' + ) + assert normalize_spaces(button.text) == 'New alert' + assert button['href'] == url_for( + 'main.new_broadcast', + service_id=SERVICE_ONE_ID, + ) + + def test_new_broadcast_page( client_request, service_one, @@ -1419,6 +1452,7 @@ def test_view_broadcast_message_page( @pytest.mark.parametrize('endpoint', ( '.view_current_broadcast', '.view_previous_broadcast', + '.view_rejected_broadcast', )) @pytest.mark.parametrize('status, expected_highlighted_navigation_item, expected_back_link_endpoint', ( ( @@ -1443,8 +1477,8 @@ def test_view_broadcast_message_page( ), ( 'rejected', - 'Previous alerts', - '.broadcast_dashboard_previous', + 'Rejected alerts', + '.broadcast_dashboard_rejected', ), )) @freeze_time('2020-02-22T22:22:22.000000') diff --git a/tests/app/test_navigation.py b/tests/app/test_navigation.py index 5e04f173e..2deba68b1 100644 --- a/tests/app/test_navigation.py +++ b/tests/app/test_navigation.py @@ -36,6 +36,7 @@ EXCLUDED_ENDPOINTS = tuple(map(Navigation.get_endpoint_with_blueprint, { 'broadcast', 'broadcast_dashboard', 'broadcast_dashboard_previous', + 'broadcast_dashboard_rejected', 'broadcast_dashboard_updates', 'broadcast_tour', 'callbacks', @@ -326,6 +327,7 @@ EXCLUDED_ENDPOINTS = tuple(map(Navigation.get_endpoint_with_blueprint, { 'view_previous_broadcast', 'view_provider', 'view_providers', + 'view_rejected_broadcast', 'view_template', 'view_template_version', 'view_template_versions', @@ -493,6 +495,7 @@ def test_navigation_for_services_with_broadcast_permission( ] == [ '/services/{}/current-alerts'.format(SERVICE_ONE_ID), '/services/{}/previous-alerts'.format(SERVICE_ONE_ID), + '/services/{}/rejected-alerts'.format(SERVICE_ONE_ID), '/services/{}/templates'.format(SERVICE_ONE_ID), '/services/{}/users'.format(SERVICE_ONE_ID), '/services/{}/service-settings'.format(SERVICE_ONE_ID),