From 97aca503f714f8cc249819ac34da709a0b358948 Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Mon, 13 Jul 2020 08:56:57 +0100 Subject: [PATCH] No emails, texts or letters for broadcast services MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To make the interface as simple as possible we don’t want to mix up sending other types of communication where services have the broadcast permission. This commit removes the other permissions once a service has been given the broadcast permission by a platform admin user. --- app/main/views/service_settings.py | 29 ++++++++++++ app/navigation.py | 4 ++ .../test_service_setting_permissions.py | 44 +++++++++++++------ 3 files changed, 64 insertions(+), 13 deletions(-) diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index 9aa2257e8..6bebd361b 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -305,6 +305,35 @@ def service_set_permission(service_id, permission): ) +@main.route("/services//service-settings/permissions/broadcast", methods=["GET", "POST"]) +@user_is_platform_admin +def service_set_broadcast_permission(service_id): + + title = PLATFORM_ADMIN_SERVICE_PERMISSIONS['broadcast']['title'] + form = ServiceOnOffSettingForm( + name=title, + enabled=current_service.has_permission('broadcast') + ) + + if form.validate_on_submit(): + + if form.enabled.data: + current_service.force_permission('broadcast', on=True) + current_service.force_permission('email', on=False) + current_service.force_permission('sms', on=False) + current_service.force_permission('letter', on=False) + else: + current_service.force_permission('broadcast', on=False) + + return redirect(url_for(".service_settings", service_id=service_id)) + + return render_template( + 'views/service-settings/set-service-setting.html', + title=title, + form=form, + ) + + @main.route("/services//service-settings/archive", methods=['GET', 'POST']) @user_has_permissions('manage_service') def archive_service(service_id): diff --git a/app/navigation.py b/app/navigation.py index a2a5137cd..e099d3776 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -307,6 +307,7 @@ class HeaderNavigation(Navigation): 'service_switch_count_as_live', 'service_switch_live', 'service_set_permission', + 'service_set_broadcast_permission', 'service_verify_reply_to_address', 'service_verify_reply_to_address_updates', 'services_or_dashboard', @@ -635,6 +636,7 @@ class MainNavigation(Navigation): 'service_switch_count_as_live', 'service_switch_live', 'service_set_permission', + 'service_set_broadcast_permission', 'services_or_dashboard', 'show_accounts_or_dashboard', 'sign_in', @@ -933,6 +935,7 @@ class CaseworkNavigation(Navigation): 'service_switch_count_as_live', 'service_switch_live', 'service_set_permission', + 'service_set_broadcast_permission', 'service_verify_reply_to_address', 'service_verify_reply_to_address_updates', 'services_or_dashboard', @@ -1237,6 +1240,7 @@ class OrgNavigation(Navigation): 'service_switch_count_as_live', 'service_switch_live', 'service_set_permission', + 'service_set_broadcast_permission', 'service_verify_reply_to_address', 'service_verify_reply_to_address_updates', 'services_or_dashboard', diff --git a/tests/app/main/views/service_settings/test_service_setting_permissions.py b/tests/app/main/views/service_settings/test_service_setting_permissions.py index ece67d2a3..8c88d630b 100644 --- a/tests/app/main/views/service_settings/test_service_setting_permissions.py +++ b/tests/app/main/views/service_settings/test_service_setting_permissions.py @@ -1,4 +1,5 @@ import functools +from unittest.mock import call import pytest from flask import url_for @@ -38,15 +39,34 @@ def test_service_set_permission_requires_platform_admin( ) -@pytest.mark.parametrize('permission, form_data, on', [ - ('inbound_sms', 'True', True), - ('inbound_sms', 'False', False), - ('email_auth', 'True', True), - ('email_auth', 'False', False), - ('international_letters', 'True', True), - ('international_letters', 'False', False), - ('broadcast', 'True', True), - ('broadcast', 'False', False), +@pytest.mark.parametrize('permission, form_data, expected_calls', [ + ('inbound_sms', 'True', [ + call('inbound_sms', on=True), + ]), + ('inbound_sms', 'False', [ + call('inbound_sms', on=False), + ]), + ('email_auth', 'True', [ + call('email_auth', on=True), + ]), + ('email_auth', 'False', [ + call('email_auth', on=False), + ]), + ('international_letters', 'True', [ + call('international_letters', on=True), + ]), + ('international_letters', 'False', [ + call('international_letters', on=False), + ]), + ('broadcast', 'True', [ + call('broadcast', on=True), + call('email', on=False), + call('sms', on=False), + call('letter', on=False), + ]), + ('broadcast', 'False', [ + call('broadcast', on=False), + ]), ]) def test_service_set_permission( mocker, @@ -55,7 +75,7 @@ def test_service_set_permission( mock_get_inbound_number_for_service, permission, form_data, - on + expected_calls, ): force_permission = mocker.patch('app.models.service.Service.force_permission') response = platform_admin_client.post( @@ -64,9 +84,7 @@ def test_service_set_permission( ) assert response.status_code == 302 assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True) - force_permission.assert_called_with( - permission, on=on - ) + assert force_permission.call_args_list == expected_calls @pytest.mark.parametrize('service_fields, endpoint, kwargs, text', [