From 61ab9661fb6f360d19df41b297c08c58544b1db9 Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Tue, 24 Mar 2020 15:01:42 +0000 Subject: [PATCH] Direct members of the public somewhere more useful MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We can’t give advice to members of the public, but increasingly we’re seeing them try to use our support form to ask. It would be better for them if we can direct them straight to somewhere more useful, before they have the chance to raise a support ticket. This commit replaces the report a problem/ask a question triaging for users who aren’t signed in. It’s not possible for non-signed-in users to raise an priority 1 ticket, so we never need to triage the tickets in this way. Instead we can triage people based on whether they work in the public sector or not. If they do then we send them on to the feedback form. If not then they go to a new page which contains some useful links. We’ve chosen these links based on some analysis of the support tickets we’ve received recently[1] 1. https://docs.google.com/spreadsheets/d/1uBQn-ZnCYfz6ltFaUKZpytgvBF0-MeshCLZ1cD74R0c/edit?usp=sharing --- app/main/forms.py | 11 +++ app/main/views/feedback.py | 40 ++++++-- app/navigation.py | 4 + app/templates/views/support/index.html | 28 +++--- app/templates/views/support/public.html | 48 ++++++++++ tests/app/main/views/test_feedback.py | 118 +++++++++++++++++------- 6 files changed, 199 insertions(+), 50 deletions(-) create mode 100644 app/templates/views/support/public.html diff --git a/app/main/forms.py b/app/main/forms.py index 34e7c2918..c0e9e1b24 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -892,6 +892,17 @@ class SupportType(StripWhitespaceForm): ) +class SupportRedirect(StripWhitespaceForm): + who = RadioField( + 'What do you need help with?', + choices=[ + ('public-sector', 'I work in the public sector and need to send emails, text messages or letters'), + ('public', 'I’m a member of the public with a question for the government'), + ], + validators=[DataRequired()] + ) + + class Feedback(StripWhitespaceForm): name = StringField('Name (optional)') email_address = email_address(label='Email address', gov_user=False, required=True) diff --git a/app/main/views/feedback.py b/app/main/views/feedback.py index 9cf0cd6a5..0f386d2b6 100644 --- a/app/main/views/feedback.py +++ b/app/main/views/feedback.py @@ -7,7 +7,13 @@ from flask_login import current_user from app import convert_to_boolean, current_service, service_api_client from app.extensions import zendesk_client from app.main import main -from app.main.forms import Feedback, Problem, SupportType, Triage +from app.main.forms import ( + Feedback, + Problem, + SupportRedirect, + SupportType, + Triage, +) QUESTION_TICKET_TYPE = 'ask-question-give-feedback' PROBLEM_TICKET_TYPE = "report-problem" @@ -29,15 +35,35 @@ def get_prefilled_message(): @main.route('/support', methods=['GET', 'POST']) def support(): - form = SupportType() - if form.validate_on_submit(): - return redirect(url_for( - '.feedback', - ticket_type=form.support_type.data, - )) + + if current_user.is_authenticated: + form = SupportType() + if form.validate_on_submit(): + return redirect(url_for( + '.feedback', + ticket_type=form.support_type.data, + )) + else: + form = SupportRedirect() + if form.validate_on_submit(): + if form.who.data == 'public': + return redirect(url_for( + '.support_public' + )) + else: + return redirect(url_for( + '.feedback', + ticket_type=QUESTION_TICKET_TYPE, + )) + return render_template('views/support/index.html', form=form) +@main.route('/support/public') +def support_public(): + return render_template('views/support/public.html') + + @main.route('/support/triage', methods=['GET', 'POST']) def triage(): form = Triage() diff --git a/app/navigation.py b/app/navigation.py index 2342429a2..53f01483c 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -47,6 +47,7 @@ class HeaderNavigation(Navigation): 'bat_phone', 'feedback', 'support', + 'support_public', 'thanks', 'triage', }, @@ -619,6 +620,7 @@ class MainNavigation(Navigation): 'start_tour', 'styleguide', 'support', + 'support_public', 'suspend_service', 'template_history', 'terms', @@ -916,6 +918,7 @@ class CaseworkNavigation(Navigation): 'styleguide', 'submit_request_to_go_live', 'support', + 'support_public', 'suspend_service', 'template_history', 'template_usage', @@ -1209,6 +1212,7 @@ class OrgNavigation(Navigation): 'styleguide', 'submit_request_to_go_live', 'support', + 'support_public', 'suspend_service', 'template_history', 'template_usage', diff --git a/app/templates/views/support/index.html b/app/templates/views/support/index.html index fcf32bf7e..09dd8caba 100644 --- a/app/templates/views/support/index.html +++ b/app/templates/views/support/index.html @@ -9,19 +9,25 @@ {% block maincolumn_content %} +

Support

+

We provide 24-hour online support for teams with a live service on GOV.UK Notify.

+ + {% call form_wrapper() %} + {% if current_user.is_authenticated %} + {{ radios(form.support_type) }} + {% else %} +

+ What do you need help with? +

+ {{ radios(form.who, hide_legend=True) }} + {% endif %} + {{ page_footer('Continue') }} + {% endcall %} + +

You can also contact us on Slack.

+
- -

Support

-

We provide 24-hour online support for teams with a live service on GOV.UK Notify.

- - {% call form_wrapper(class="bottom-gutter-2") %} - {{ radios(form.support_type) }} - {{ page_footer('Continue') }} - {% endcall %} - -

You can also contact us on Slack.

-

Office hours

Our office hours are 9:30am to 5:30pm, Monday to Friday.

When you report a problem in office hours, we’ll aim to read it within 30 minutes and reply within one working day.

diff --git a/app/templates/views/support/public.html b/app/templates/views/support/public.html new file mode 100644 index 000000000..711a08ccb --- /dev/null +++ b/app/templates/views/support/public.html @@ -0,0 +1,48 @@ +{% extends "withoutnav_template.html" %} + +{% from "components/page-header.html" import page_header %} + +{% block per_page_title %} + The GOV.UK Notify team can’t give advice to members of the public +{% endblock %} + +{% block maincolumn_content %} + +
+
+ + {{ page_header( + 'The GOV.UK Notify service is for people who work in the government', + back_link=url_for('.support') + ) }} + +

+ We can’t give advice to the public. We don’t have access to information about you held by government departments. +

+ +

+ There are other pages on GOV.UK where you can get help: +

+ +

+ Coronavirus (COVID-19) +

+

+ What you need to do +

+

+ Contact the government +

+

+ Ask about benefits, driving, transport, tax, and more +

+

+ Avoid and report internet scams and phishing +

+

+ Advice on suspicious emails and text messages +

+
+
+ +{% endblock %} diff --git a/tests/app/main/views/test_feedback.py b/tests/app/main/views/test_feedback.py index 684fc2b12..0a2cd3a58 100644 --- a/tests/app/main/views/test_feedback.py +++ b/tests/app/main/views/test_feedback.py @@ -19,18 +19,48 @@ def no_redirect(): return lambda _external=True: None -@pytest.mark.parametrize('endpoint', [ - 'main.old_feedback', - 'main.support', -]) def test_get_support_index_page( - client, - endpoint, + client_request, ): - response = client.get(url_for('main.support'), follow_redirects=True) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - assert page.h1.string.strip() == 'Support' + page = client_request.get('.support') + assert page.select_one('form')['method'] == 'post' + assert 'action' not in page.select_one('form') + assert normalize_spaces(page.select_one('h1').text) == 'Support' + assert normalize_spaces( + page.select_one('form label[for=support_type-0]').text + ) == 'Report a problem' + assert page.select_one('form input#support_type-0')['value'] == 'report-problem' + assert normalize_spaces( + page.select_one('form label[for=support_type-1]').text + ) == 'Ask a question or give feedback' + assert page.select_one('form input#support_type-1')['value'] == 'ask-question-give-feedback' + assert normalize_spaces( + page.select_one('form button[type=submit]').text + ) == 'Continue' + + +def test_get_support_index_page_when_signed_out( + client_request, +): + client_request.logout() + page = client_request.get('.support') + assert page.select_one('form')['method'] == 'post' + assert 'action' not in page.select_one('form') + assert normalize_spaces( + page.select_one('form label[for=who-0]').text + ) == ( + 'I work in the public sector and need to send emails, text messages or letters' + ) + assert page.select_one('form input#who-0')['value'] == 'public-sector' + assert normalize_spaces( + page.select_one('form label[for=who-1]').text + ) == ( + 'I’m a member of the public with a question for the government' + ) + assert page.select_one('form input#who-1')['value'] == 'public' + assert normalize_spaces( + page.select_one('form button[type=submit]').text + ) == 'Continue' @freeze_time('2016-12-12 12:00:00.000000') @@ -38,34 +68,58 @@ def test_get_support_index_page( (PROBLEM_TICKET_TYPE, 'Report a problem'), (QUESTION_TICKET_TYPE, 'Ask a question or give feedback'), ]) -@pytest.mark.parametrize('logged_in, expected_form_field, expected_contact_details', [ - (True, type(None), 'We’ll reply to test@user.gov.uk'), - (False, element.Tag, None), -]) def test_choose_support_type( - client, - api_user_active, - mock_get_user, - mock_get_services, - logged_in, - expected_form_field, - expected_contact_details, + client_request, support_type, expected_h1 ): - if logged_in: - client.login(api_user_active) - response = client.post( - url_for('main.support'), - data={'support_type': support_type}, follow_redirects=True + page = client_request.post( + 'main.support', + _data={'support_type': support_type}, + _follow_redirects=True, ) - assert response.status_code == 200 - page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') assert page.h1.string.strip() == expected_h1 - assert isinstance(page.find('input', {'name': 'name'}), expected_form_field) - assert isinstance(page.find('input', {'name': 'email_address'}), expected_form_field) - if expected_contact_details: - assert page.find('form').find('p').text.strip() == expected_contact_details + assert not page.select_one('input[name=name]') + assert not page.select_one('input[name=email_address]') + assert page.find('form').find('p').text.strip() == ( + 'We’ll reply to test@user.gov.uk' + ) + + +def test_get_support_as_someone_in_the_public_sector( + client_request, +): + client_request.logout() + page = client_request.post( + 'main.support', + _data={'who': 'public-sector'}, + _follow_redirects=True, + ) + assert normalize_spaces(page.select('h1')) == ( + 'Ask a question or give feedback' + ) + assert page.select_one('form textarea[name=feedback]') + assert page.select_one('form input[name=name]') + assert page.select_one('form input[name=email_address]') + assert page.select_one('form button[type=submit]') + + +def test_get_support_as_member_of_public( + client_request, +): + client_request.logout() + page = client_request.post( + 'main.support', + _data={'who': 'public'}, + _follow_redirects=True, + ) + assert normalize_spaces(page.select('h1')) == ( + 'The GOV.UK Notify service is for people who work in the government' + ) + assert len(page.select('h2 a')) == 3 + assert not page.select('form') + assert not page.select('input') + assert not page.select('form [type=submit]') @freeze_time('2016-12-12 12:00:00.000000')