mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-03-14 23:32:36 -04:00
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:
@@ -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)
|
||||
])
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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',
|
||||
}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user