Let users switch international letters on and off

We’ve decided that this feature should be self-service, and on by
default for all users. Before we can make it on by default we should
give users a way to switch it off for themselves. Which is what this PR
does.
This commit is contained in:
Chris Hill-Scott
2020-05-29 10:47:52 +01:00
parent 24f0b172f4
commit f852c27586
5 changed files with 91 additions and 14 deletions

View File

@@ -665,6 +665,27 @@ def service_set_international_sms(service_id):
)
@main.route("/services/<uuid:service_id>/service-settings/set-international-letters", methods=['GET', 'POST'])
@user_has_permissions('manage_service')
def service_set_international_letters(service_id):
form = ServiceOnOffSettingForm(
'Send letters to international addresses',
enabled=current_service.has_permission('international_letters'),
)
if form.validate_on_submit():
current_service.force_permission(
'international_letters',
on=form.enabled.data,
)
return redirect(
url_for(".service_settings", service_id=service_id)
)
return render_template(
'views/service-settings/set-international-letters.html',
form=form,
)
@main.route("/services/<uuid:service_id>/service-settings/set-inbound-sms", methods=['GET'])
@user_has_permissions('manage_service')
def service_set_inbound_sms(service_id):

View File

@@ -297,6 +297,7 @@ class HeaderNavigation(Navigation):
'service_set_email_branding',
'service_set_inbound_number',
'service_set_inbound_sms',
'service_set_international_letters',
'service_set_international_sms',
'service_set_letter_branding',
'service_set_letters',
@@ -485,6 +486,7 @@ class MainNavigation(Navigation):
'service_set_email_branding',
'service_set_inbound_number',
'service_set_inbound_sms',
'service_set_international_letters',
'service_set_international_sms',
'service_set_letters',
'service_set_reply_to_email',
@@ -938,6 +940,7 @@ class CaseworkNavigation(Navigation):
'service_set_email_branding',
'service_set_inbound_number',
'service_set_inbound_sms',
'service_set_international_letters',
'service_set_international_sms',
'service_set_letters',
'service_set_reply_to_email',
@@ -1246,6 +1249,7 @@ class OrgNavigation(Navigation):
'service_set_email_branding',
'service_set_inbound_number',
'service_set_inbound_sms',
'service_set_international_letters',
'service_set_international_sms',
'service_set_letters',
'service_set_reply_to_email',

View File

@@ -210,6 +210,16 @@
)}}
{% endcall %}
{% call settings_row(if_has_permission='letter') %}
{{ text_field('Send international letters') }}
{{ boolean_field(current_service.has_permission('international_letters')) }}
{{ edit_field(
'Change',
url_for('.service_set_international_letters', service_id=current_service.id),
permissions=['manage_service']
)}}
{% endcall %}
{% call settings_row(if_has_permission='letter') %}
{{ text_field('Sender addresses') }}
{% call field(status='' if current_service.count_letter_contact_details else 'default') %}

View File

@@ -0,0 +1,33 @@
{% extends "withnav_template.html" %}
{% from "components/radios.html" import radios %}
{% from "components/page-header.html" import page_header %}
{% from "components/page-footer.html" import page_footer %}
{% from "components/form.html" import form_wrapper %}
{% block service_page_title %}
Send international letters
{% endblock %}
{% block maincolumn_content %}
<div class="govuk-grid-row">
<div class="govuk-grid-column-five-sixths">
{{ page_header(
'Send international letters',
back_link=url_for('main.service_settings', service_id=current_service.id)
) }}
<p class="govuk-body">
It costs more to send a letter to an international address.
</p>
<p class="govuk-body">
See <a class="govuk-link govuk-link--no-visited-state" href="{{ url_for(".pricing") }}">pricing</a> for the list
of rates.
</p>
{% call form_wrapper() %}
{{ radios(form.enabled) }}
{{ page_footer('Save') }}
{% endcall %}
</div>
</div>
{% endblock %}

View File

@@ -285,6 +285,7 @@ def test_send_files_by_email_row_on_settings_page(
'Label Value Action',
'Send letters On Change',
'Send international letters Off Change',
'Sender addresses 1 Example Street Manage',
'Letter branding Not set Change',
@@ -349,7 +350,7 @@ def test_letter_contact_block_shows_none_if_not_set(
service_id=SERVICE_ONE_ID,
)
div = page.find_all('tr')[9].find_all('td')[1].div
div = page.find_all('tr')[10].find_all('td')[1].div
assert div.text.strip() == 'Not set'
assert 'default' in div.attrs['class'][0]
@@ -370,7 +371,7 @@ def test_escapes_letter_contact_block(
service_id=SERVICE_ONE_ID,
)
div = str(page.find_all('tr')[9].find_all('td')[1].div)
div = str(page.find_all('tr')[10].find_all('td')[1].div)
assert 'foo<br/>bar' in div
assert '<script>' not in div
@@ -3787,21 +3788,24 @@ def test_broadcast_service_cant_post_to_set_other_channels_endpoint(
)
@pytest.mark.parametrize('permissions, expected_checked', [
(['international_sms'], 'True'),
([''], 'False'),
@pytest.mark.parametrize('permission, permissions, expected_checked', [
('international_sms', ['international_sms'], 'True'),
('international_letters', ['international_letters'], 'True'),
('international_sms', [''], 'False'),
('international_letters', [''], 'False'),
])
def test_show_international_sms_as_radio_button(
def test_show_international_sms_and_letters_as_radio_button(
client_request,
service_one,
mocker,
permission,
permissions,
expected_checked,
):
service_one['permissions'] = permissions
checked_radios = client_request.get(
'main.service_set_international_sms',
f'main.service_set_{permission}',
service_id=service_one['id'],
).select(
'.multiple-choice input[checked]'
@@ -3811,20 +3815,25 @@ def test_show_international_sms_as_radio_button(
assert checked_radios[0]['value'] == expected_checked
@pytest.mark.parametrize('post_value, international_sms_permission_expected_in_api_call', [
@pytest.mark.parametrize('permission', (
'international_sms',
'international_letters',
))
@pytest.mark.parametrize('post_value, permission_expected_in_api_call', [
('True', True),
('False', False),
])
def test_switch_service_enable_international_sms(
def test_switch_service_enable_international_sms_and_letters(
client_request,
service_one,
mocker,
permission,
post_value,
international_sms_permission_expected_in_api_call,
permission_expected_in_api_call,
):
mocked_fn = mocker.patch('app.service_api_client.update_service', return_value=service_one)
client_request.post(
'main.service_set_international_sms',
f'main.service_set_{permission}',
service_id=service_one['id'],
_data={
'enabled': post_value
@@ -3832,10 +3841,10 @@ def test_switch_service_enable_international_sms(
_expected_redirect=url_for('main.service_settings', service_id=service_one['id'], _external=True)
)
if international_sms_permission_expected_in_api_call:
assert 'international_sms' in mocked_fn.call_args[1]['permissions']
if permission_expected_in_api_call:
assert permission in mocked_fn.call_args[1]['permissions']
else:
assert 'international_sms' not in mocked_fn.call_args[1]['permissions']
assert permission not in mocked_fn.call_args[1]['permissions']
assert mocked_fn.call_args[0][0] == service_one['id']