From 4d3a4ef9af1486417505629adbae99a0a8a55ba1 Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Tue, 10 Jul 2018 10:01:40 +0100 Subject: [PATCH] Add form to let users switch basic view on and off MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds radio buttons to the ‘basic view’ page. This will let users choose whether basic view is on or off for their service. As before, this page will only be linked to if a service already has basic view, so this commit does not launch the new feature. --- app/main/forms.py | 14 +++++++ app/main/views/service_settings.py | 16 ++++++- .../service-settings/set-basic-view.html | 8 ++-- tests/app/main/views/test_service_settings.py | 42 +++++++++++++++++++ 4 files changed, 76 insertions(+), 4 deletions(-) diff --git a/app/main/forms.py b/app/main/forms.py index 43a30be3c..55faafbcc 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -677,6 +677,20 @@ class ServiceSwitchLettersForm(StripWhitespaceForm): ) +class ServiceBasicViewForm(StripWhitespaceForm): + + def __init__(self, enabled): + super().__init__(enabled='on' if enabled else 'off') + + enabled = RadioField( + 'Basic view', + choices=[ + ('on', 'On'), + ('off', 'Off'), + ], + ) + + class ServiceSetBranding(StripWhitespaceForm): def __init__(self, email_branding=[], *args, **kwargs): diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index cb6d1ed5f..1034004ef 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -34,6 +34,7 @@ from app.main.forms import ( OrganisationTypeForm, RenameServiceForm, RequestToGoLiveForm, + ServiceBasicViewForm, ServiceContactLinkForm, ServiceEditInboundNumberForm, ServiceInboundNumberForm, @@ -635,12 +636,25 @@ def service_set_auth_type(service_id): ) -@main.route("/services//service-settings/set-basic-view", methods=['GET']) +@main.route("/services//service-settings/set-basic-view", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_service') def service_set_basic_view(service_id): + form = ServiceBasicViewForm( + enabled='caseworking' in current_service['permissions'] + ) + if form.validate_on_submit(): + force_service_permission( + service_id, + 'caseworking', + on=(form.enabled.data == 'on'), + ) + return redirect( + url_for('.service_settings', service_id=service_id) + ) return render_template( 'views/service-settings/set-basic-view.html', + form=form, ) diff --git a/app/templates/views/service-settings/set-basic-view.html b/app/templates/views/service-settings/set-basic-view.html index 7f5c6fd68..1418b4c0a 100644 --- a/app/templates/views/service-settings/set-basic-view.html +++ b/app/templates/views/service-settings/set-basic-view.html @@ -1,5 +1,5 @@ {% extends "withnav_template.html" %} -{% from "components/textbox.html" import textbox %} +{% from "components/radios.html" import radios %} {% from "components/page-footer.html" import page_footer %} {% block service_page_title %} @@ -9,7 +9,7 @@ {% block maincolumn_content %}
-
+

Basic view

Basic view lets you restrict a team member to only: @@ -21,11 +21,13 @@

You’ll get to choose which team members have basic view.

+ {{ radios(form.enabled, hide_legend=True) }} {{ page_footer( + 'Save', back_link=url_for('.service_settings', service_id=current_service.id), back_link_text='Back to settings' ) }} -
+
{% endblock %} diff --git a/tests/app/main/views/test_service_settings.py b/tests/app/main/views/test_service_settings.py index c9662edbf..8d74dfda5 100644 --- a/tests/app/main/views/test_service_settings.py +++ b/tests/app/main/views/test_service_settings.py @@ -2390,14 +2390,56 @@ def test_invitation_pages( assert normalize_spaces(page.select('main p')[0].text) == expected_p +@pytest.mark.parametrize('permissions, expected_selected', [ + ('caseworking', 'on'), + ('', 'off'), +]) def test_see_basic_view_page( client_request, + service_one, + permissions, + expected_selected, ): + service_one['permissions'] = permissions page = client_request.get( "main.service_set_basic_view", service_id=SERVICE_ONE_ID ) assert page.h1.text.strip() == 'Basic view' + assert page.select_one('input[checked]')['value'] == expected_selected + + +@pytest.mark.parametrize('value, expected_updated_permissions', [ + ('on', {'email', 'caseworking', 'sms'}), + ('off', {'email', 'sms'}), +]) +def test_update_basic_view( + mocker, + client_request, + service_one, + value, + expected_updated_permissions, +): + mocked_update = mocker.patch( + 'app.service_api_client.update_service_with_properties', + return_value=service_one, + ) + client_request.post( + "main.service_set_basic_view", + service_id=SERVICE_ONE_ID, + _data={ + 'enabled': value, + }, + _expected_status=302, + _expected_redirect=url_for( + 'main.service_settings', + service_id=SERVICE_ONE_ID, + _external=True, + ), + ) + assert set( + mocked_update.call_args[0][1]['permissions'] + ) == expected_updated_permissions def test_service_settings_when_inbound_number_is_not_set(