Files
notifications-admin/app/main/views/feedback.py
T

226 lines
6.4 KiB
Python
Raw Normal View History

2018-02-20 11:22:17 +00:00
from datetime import datetime
import pytz
from flask import redirect, render_template, request, session, url_for
from flask_login import current_user
2020-04-16 14:58:22 +01:00
from govuk_bank_holidays.bank_holidays import BankHolidays
from app import convert_to_boolean, current_service
from app.extensions import zendesk_client
2016-04-26 10:32:26 +01:00
from app.main import main
from app.main.forms import (
FeedbackOrProblem,
SupportRedirect,
SupportType,
Triage,
)
2020-03-24 15:45:13 +00:00
from app.models.feedback import (
GENERAL_TICKET_TYPE,
PROBLEM_TICKET_TYPE,
QUESTION_TICKET_TYPE,
)
from app.utils import hide_from_search_engines
2020-04-16 14:58:22 +01:00
bank_holidays = BankHolidays(use_cached_holidays=True)
2016-04-26 10:32:26 +01:00
2016-12-12 11:18:25 +00:00
@main.route('/support', methods=['GET', 'POST'])
@hide_from_search_engines
2016-12-12 11:18:25 +00:00
def support():
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',
2020-03-24 15:45:13 +00:00
ticket_type=GENERAL_TICKET_TYPE,
))
2016-12-12 11:25:43 +00:00
return render_template('views/support/index.html', form=form)
2016-12-12 11:18:25 +00:00
@main.route('/support/public')
@hide_from_search_engines
def support_public():
return render_template('views/support/public.html')
@main.route('/support/triage', methods=['GET', 'POST'])
2020-03-24 15:45:13 +00:00
@main.route('/support/triage/<ticket_type:ticket_type>', methods=['GET', 'POST'])
@hide_from_search_engines
2020-03-24 15:45:13 +00:00
def triage(ticket_type=PROBLEM_TICKET_TYPE):
form = Triage()
if form.validate_on_submit():
return redirect(url_for(
'.feedback',
2020-03-24 15:45:13 +00:00
ticket_type=ticket_type,
2017-03-07 09:44:21 +00:00
severe=form.severe.data
))
return render_template(
'views/support/triage.html',
2020-03-24 15:45:13 +00:00
form=form,
page_title={
PROBLEM_TICKET_TYPE: 'Report a problem',
GENERAL_TICKET_TYPE: 'Contact GOV.UK Notify support',
}.get(ticket_type)
)
@main.route('/support/<ticket_type:ticket_type>', methods=['GET', 'POST'])
@hide_from_search_engines
def feedback(ticket_type):
form = FeedbackOrProblem()
if not form.feedback.data:
form.feedback.data = session.pop('feedback_message', '')
if request.args.get('severe') in ['yes', 'no']:
severe = convert_to_boolean(request.args.get('severe'))
else:
severe = None
out_of_hours_emergency = all((
2020-03-24 15:45:13 +00:00
ticket_type != QUESTION_TICKET_TYPE,
not in_business_hours(),
severe,
))
if needs_triage(ticket_type, severe):
session['feedback_message'] = form.feedback.data
2020-03-24 15:45:13 +00:00
return redirect(url_for('.triage', ticket_type=ticket_type))
if needs_escalation(ticket_type, severe):
return redirect(url_for('.bat_phone'))
if current_user.is_authenticated:
form.email_address.data = current_user.email_address
form.name.data = current_user.name
2016-04-26 10:32:26 +01:00
if form.validate_on_submit():
user_email = form.email_address.data
user_name = form.name.data or None
if current_service:
service_string = 'Service: "{name}"\n{url}\n'.format(
name=current_service.name,
url=url_for('main.service_dashboard', service_id=current_service.id, _external=True)
)
else:
service_string = ''
2020-03-24 15:54:44 +00:00
feedback_msg = '{}\n{}'.format(
form.feedback.data,
service_string,
2016-08-04 18:01:08 +01:00
)
zendesk_client.create_ticket(
subject='Notify feedback',
2018-06-15 15:33:21 +01:00
message=feedback_msg,
ticket_type=ticket_type,
p1=out_of_hours_emergency,
user_email=user_email,
user_name=user_name
)
return redirect(url_for(
'.thanks',
out_of_hours_emergency=out_of_hours_emergency,
email_address_provided=(
current_user.is_authenticated or bool(form.email_address.data)
),
))
2016-04-26 10:32:26 +01:00
2016-12-12 11:25:43 +00:00
return render_template(
2020-03-24 15:30:43 +00:00
'views/support/form.html',
2016-12-12 11:25:43 +00:00
form=form,
back_link=(
url_for('.support')
if severe is None else
url_for('.triage', ticket_type=ticket_type)
),
2020-03-24 15:45:13 +00:00
show_status_page_banner=(ticket_type == PROBLEM_TICKET_TYPE),
page_title={
GENERAL_TICKET_TYPE: 'Contact GOV.UK Notify support',
PROBLEM_TICKET_TYPE: 'Report a problem',
QUESTION_TICKET_TYPE: 'Ask a question or give feedback',
}.get(ticket_type),
2016-12-12 11:25:43 +00:00
)
@main.route('/support/escalate', methods=['GET', 'POST'])
@hide_from_search_engines
def bat_phone():
if current_user.is_authenticated:
return redirect(url_for('main.feedback', ticket_type=PROBLEM_TICKET_TYPE))
return render_template('views/support/bat-phone.html')
@main.route('/support/thanks', methods=['GET', 'POST'])
@hide_from_search_engines
def thanks():
return render_template(
'views/support/thanks.html',
out_of_hours_emergency=convert_to_boolean(request.args.get('out_of_hours_emergency')),
email_address_provided=convert_to_boolean(request.args.get('email_address_provided')),
out_of_hours=not in_business_hours(),
)
def in_business_hours():
now = datetime.utcnow().replace(tzinfo=pytz.utc)
if is_weekend(now) or is_bank_holiday(now):
return False
return london_time_today_as_utc(9, 30) <= now < london_time_today_as_utc(17, 30)
def london_time_today_as_utc(hour, minute):
return pytz.timezone('Europe/London').localize(
datetime.now().replace(hour=hour, minute=minute)
).astimezone(pytz.utc)
def is_weekend(time):
return time.strftime('%A') in {
'Saturday',
'Sunday',
}
def is_bank_holiday(time):
2020-04-16 14:58:22 +01:00
return bank_holidays.is_holiday(time.date())
def needs_triage(ticket_type, severe):
return all((
2020-03-24 15:45:13 +00:00
ticket_type != QUESTION_TICKET_TYPE,
severe is None,
(
not current_user.is_authenticated or current_user.live_services
),
not in_business_hours(),
))
def needs_escalation(ticket_type, severe):
return all((
2020-03-24 15:45:13 +00:00
ticket_type != QUESTION_TICKET_TYPE,
severe,
not current_user.is_authenticated,
not in_business_hours(),
))