From 29ad5cf510b9b27734efec263c7cb93da652bb0b Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Mon, 6 Jul 2020 10:53:16 +0100 Subject: [PATCH] Add a form for choosing areas MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Picking multiple areas at once definitely feels like a need, so let’s make them checkboxes. --- app/main/forms.py | 15 ++++++++++ app/main/views/broadcast.py | 37 +++++++++++------------- app/navigation.py | 4 --- app/templates/views/broadcast/areas.html | 14 ++++++--- tests/app/main/views/test_broadcast.py | 18 ------------ 5 files changed, 42 insertions(+), 46 deletions(-) diff --git a/app/main/forms.py b/app/main/forms.py index 911b0531e..713e5e036 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -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) + ]) diff --git a/app/main/views/broadcast.py b/app/main/views/broadcast.py index f5e90aeeb..927a1907c 100644 --- a/app/main/views/broadcast.py +++ b/app/main/views/broadcast.py @@ -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//broadcast/libraries/') +@main.route('/services//broadcast/libraries/', 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//broadcast/add/') -@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//broadcast/remove/') @user_has_permissions('send_messages') @service_has_permission('broadcast') diff --git a/app/navigation.py b/app/navigation.py index 51717ef52..07458080c 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -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', } diff --git a/app/templates/views/broadcast/areas.html b/app/templates/views/broadcast/areas.html index 55db5a0e2..c8fbdd7eb 100644 --- a/app/templates/views/broadcast/areas.html +++ b/app/templates/views/broadcast/areas.html @@ -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 %} -

{{ region.name }}

- {% 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 %} diff --git a/tests/app/main/views/test_broadcast.py b/tests/app/main/views/test_broadcast.py index 378054a51..0719ae6b8 100644 --- a/tests/app/main/views/test_broadcast.py +++ b/tests/app/main/views/test_broadcast.py @@ -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,