Add a form for choosing areas

Picking multiple areas at once definitely feels like a need, so let’s
make them checkboxes.
This commit is contained in:
Chris Hill-Scott
2020-07-06 10:53:16 +01:00
parent 49444221e9
commit 29ad5cf510
5 changed files with 42 additions and 46 deletions

View File

@@ -1809,3 +1809,18 @@ class AcceptAgreementForm(StripWhitespaceForm):
float(field.data)
except (TypeError, ValueError):
raise ValidationError("Must be a number")
class BroadcastAreaForm(StripWhitespaceForm):
areas = MultiCheckboxField('Choose areas to broadcast to')
def __init__(self, choices, *args, **kwargs):
super().__init__(*args, **kwargs)
self.areas.choices = choices
@classmethod
def from_library(cls, library):
return cls(choices=[
(area.id, area.name) for area in sorted(library)
])

View File

@@ -4,6 +4,7 @@ from orderedset import OrderedSet
from app import current_service
from app.main import main
from app.main.forms import BroadcastAreaForm
from app.utils import service_has_permission, user_has_permissions
@@ -48,34 +49,30 @@ def choose_broadcast_library(service_id):
)
@main.route('/services/<uuid:service_id>/broadcast/libraries/<library_slug>')
@main.route('/services/<uuid:service_id>/broadcast/libraries/<library_slug>', methods=['GET', 'POST'])
@user_has_permissions('send_messages')
@service_has_permission('broadcast')
def choose_broadcast_area(service_id, library_slug):
library = broadcast_area_libraries.get(library_slug)
form = BroadcastAreaForm.from_library(library)
if form.validate_on_submit():
if not session.get('broadcast_areas'):
session['broadcast_areas'] = []
session['broadcast_areas'] = session['broadcast_areas'] + form.areas.data
session['broadcast_areas'] = list(OrderedSet(
session['broadcast_areas']
))
return redirect(url_for(
'.preview_broadcast_areas',
service_id=current_service.id,
))
return render_template(
'views/broadcast/areas.html',
areas=broadcast_area_libraries.get(library_slug),
form=form,
page_title=library.name,
)
@main.route('/services/<uuid:service_id>/broadcast/add/<area_slug>')
@user_has_permissions('send_messages')
@service_has_permission('broadcast')
def add_broadcast_area(service_id, area_slug):
if not session.get('broadcast_areas'):
session['broadcast_areas'] = []
session['broadcast_areas'].append(area_slug)
session['broadcast_areas'] = list(OrderedSet(
session['broadcast_areas']
))
return redirect(url_for(
'.preview_broadcast_areas',
service_id=current_service.id,
))
@main.route('/services/<uuid:service_id>/broadcast/remove/<area_slug>')
@user_has_permissions('send_messages')
@service_has_permission('broadcast')

View File

@@ -355,7 +355,6 @@ class HeaderNavigation(Navigation):
'preview_broadcast_areas',
'choose_broadcast_library',
'choose_broadcast_area',
'add_broadcast_area',
'remove_broadcast_area',
'preview_broadcast_message',
}
@@ -410,7 +409,6 @@ class MainNavigation(Navigation):
'preview_broadcast_areas',
'choose_broadcast_library',
'choose_broadcast_area',
'add_broadcast_area',
'remove_broadcast_area',
'preview_broadcast_message',
},
@@ -996,7 +994,6 @@ class CaseworkNavigation(Navigation):
'preview_broadcast_areas',
'choose_broadcast_library',
'choose_broadcast_area',
'add_broadcast_area',
'remove_broadcast_area',
'preview_broadcast_message',
}
@@ -1313,7 +1310,6 @@ class OrgNavigation(Navigation):
'preview_broadcast_areas',
'choose_broadcast_library',
'choose_broadcast_area',
'add_broadcast_area',
'remove_broadcast_area',
'preview_broadcast_message',
}

View File

@@ -1,4 +1,7 @@
{% from "components/page-header.html" import page_header %}
{% from "components/page-footer.html" import sticky_page_footer %}
{% from "components/checkbox.html" import checkboxes %}
{% from "components/form.html" import form_wrapper %}
{% extends "withnav_template.html" %}
@@ -9,12 +12,15 @@
{% block maincolumn_content %}
{{ page_header(
regions.name,
page_title,
back_link=url_for('.choose_broadcast_library', service_id=current_service.id),
)}}
{% for area in areas %}
<h2 class="govuk-heading-m"><a class="govuk-link govuk-link--no-visited-state" href="{{ url_for('.add_broadcast_area', service_id=current_service.id, area_slug=area.id) }}">{{ region.name }}</a></h2>
{% endfor %}
{{ live_search(target_selector='.multiple-choice', show=show_search_form, form=search_form, label='Search by name') }}
{% call form_wrapper() %}
{{ checkboxes(form.areas, hide_legend=True) }}
{{ sticky_page_footer('Add to broadcast') }}
{% endcall %}
{% endblock %}

View File

@@ -9,7 +9,6 @@ from tests.conftest import SERVICE_ONE_ID
('.preview_broadcast_areas', {}),
('.choose_broadcast_library', {}),
('.choose_broadcast_area', {'library_slug': 'countries'}),
('.add_broadcast_area', {'area_slug': 'england'}),
('.remove_broadcast_area', {'area_slug': 'england'}),
('.preview_broadcast_message', {}),
))
@@ -76,23 +75,6 @@ def test_choose_broadcast_area_page(
)
def test_add_broadcast_area_page(
client_request,
service_one,
):
service_one['permissions'] += ['broadcast']
client_request.get(
'.add_broadcast_area',
service_id=SERVICE_ONE_ID,
area_slug='england',
_expected_redirect=url_for(
'.preview_broadcast_areas',
service_id=SERVICE_ONE_ID,
_external=True,
),
),
def test_remove_broadcast_area_page(
client_request,
service_one,