diff --git a/app/main/forms.py b/app/main/forms.py index 90171249f..3ec7e33a8 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -584,6 +584,17 @@ class ServiceLetterContactBlockForm(StripWhitespaceForm): ) +class ServiceSwitchLettersForm(StripWhitespaceForm): + + enabled = RadioField( + 'Send letters', + choices=[ + ('on', 'On'), + ('off', 'Off'), + ], + ) + + class ServiceBrandingOrg(StripWhitespaceForm): def __init__(self, organisations=[], *args, **kwargs): diff --git a/app/main/views/service_settings.py b/app/main/views/service_settings.py index e1f44d919..6ecf54c98 100644 --- a/app/main/views/service_settings.py +++ b/app/main/views/service_settings.py @@ -35,6 +35,7 @@ from app.main.forms import ( FreeSMSAllowance, ServiceEditInboundNumberForm, SMSPrefixForm, + ServiceSwitchLettersForm, ) from app import user_api_client, current_service, organisations_client, inbound_number_client, billing_api_client from notifications_utils.formatters import formatted_list @@ -502,12 +503,25 @@ def service_set_inbound_sms(service_id): ) -@main.route("/services//service-settings/set-letters", methods=['GET']) +@main.route("/services//service-settings/set-letters", methods=['GET', 'POST']) @login_required @user_has_permissions('manage_settings', admin_override=True) def service_set_letters(service_id): + form = ServiceSwitchLettersForm( + enabled='on' if 'letter' in current_service['permissions'] else 'off' + ) + if form.validate_on_submit(): + force_service_permission( + service_id, + 'letter', + on=(form.enabled.data == 'on'), + ) + return redirect( + url_for(".service_settings", service_id=service_id) + ) return render_template( 'views/service-settings/set-letters.html', + form=form, ) diff --git a/app/templates/views/pricing.html b/app/templates/views/pricing.html index aa4f063cb..632f0b7cf 100644 --- a/app/templates/views/pricing.html +++ b/app/templates/views/pricing.html @@ -87,7 +87,7 @@ -

Letters

+

Letters

The cost of sending a letter depends on how many sheets of paper you need.

{% call mapping_table( diff --git a/app/templates/views/service-settings/set-letters.html b/app/templates/views/service-settings/set-letters.html index 60f2895fb..b32fe1009 100644 --- a/app/templates/views/service-settings/set-letters.html +++ b/app/templates/views/service-settings/set-letters.html @@ -1,34 +1,26 @@ {% 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 %} - Text message sender + Send letters {% endblock %} {% block maincolumn_content %}
-

Letters

- {% if 'letter' in current_service.permissions %} -

- Your service can send letters. -

-

- If you want to stop your service from sending letters, - get in touch with the GOV.UK Notify team. -

- {% else %} -

- Using GOV.UK Notify to send letters is an invitation‑only feature. -

-

- If you want to try it out, - get in touch with the GOV.UK Notify team. -

- {% endif %} +

Send letters

+

+ It costs between 30p and 45p to send a letter using Notify. +

+

+ See pricing for the list + of rates. +

+ {{ radios(form.enabled) }} {{ page_footer( + 'Save', back_link=url_for('.service_settings', service_id=current_service.id), back_link_text='Back to settings' ) }} diff --git a/tests/app/main/views/test_service_settings.py b/tests/app/main/views/test_service_settings.py index 498ad5071..a346aea45 100644 --- a/tests/app/main/views/test_service_settings.py +++ b/tests/app/main/views/test_service_settings.py @@ -1557,40 +1557,50 @@ def test_should_set_sms_allowance( ) +@pytest.mark.parametrize(( + 'expected_initial_value,' + 'posted_value,' + 'initial_permissions,' + 'expected_updated_permissions' +), [ + ('off', 'on', ['email', 'sms'], ['email', 'sms', 'letter']), + ('on', 'off', ['email', 'sms', 'letter'], ['email', 'sms']), +]) def test_switch_service_enable_letters( - logged_in_platform_admin_client, + client_request, service_one, mocker, + expected_initial_value, + posted_value, + initial_permissions, + expected_updated_permissions, ): mocked_fn = mocker.patch('app.service_api_client.update_service_with_properties', return_value=service_one) + service_one['permissions'] = initial_permissions - response = logged_in_platform_admin_client.get( - url_for('main.service_switch_can_send_letters', service_id=service_one['id']) + page = client_request.get( + 'main.service_set_letters', + service_id=service_one['id'], ) - assert response.status_code == 302 - assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True) - assert 'letter' in mocked_fn.call_args[0][1]['permissions'] + assert page.select_one('input[checked]')['value'] == expected_initial_value + assert len(page.select('input[checked]')) == 1 + + client_request.post( + 'main.service_set_letters', + service_id=service_one['id'], + _data={'enabled': posted_value}, + _expected_redirect=url_for( + 'main.service_settings', + service_id=service_one['id'], + _external=True + ) + ) + + assert set(mocked_fn.call_args[0][1]['permissions']) == set(expected_updated_permissions) assert mocked_fn.call_args[0][0] == service_one['id'] -def test_switch_service_disable_letters( - logged_in_platform_admin_client, - service_one, - mocker, -): - service_one['permissions'] = ['letter'] - mocked_fn = mocker.patch('app.service_api_client.update_service_with_properties', return_value=service_one) - - response = logged_in_platform_admin_client.get( - url_for('main.service_switch_can_send_letters', service_id=service_one['id']) - ) - - assert response.status_code == 302 - assert response.location == url_for('main.service_settings', service_id=service_one['id'], _external=True) - assert mocked_fn.call_args == call(service_one['id'], {"permissions": []}) - - @pytest.mark.parametrize('permissions, expected_checked', [ (['international_sms'], 'on'), ([''], 'off'), @@ -1802,21 +1812,6 @@ def test_cant_resume_active_service( @pytest.mark.parametrize('endpoint, permissions, expected_p', [ - ( - 'main.service_set_letters', - [], - ( - 'Using GOV.UK Notify to send letters is an invitation‑only ' - 'feature.' - ) - ), - ( - 'main.service_set_letters', - ['letter'], - ( - 'Your service can send letters.' - ) - ), ( 'main.service_set_inbound_sms', ['sms'],