mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-09-10 10:03:21 -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)
|
float(field.data)
|
||||||
except (TypeError, ValueError):
|
except (TypeError, ValueError):
|
||||||
raise ValidationError("Must be a number")
|
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 import current_service
|
||||||
from app.main import main
|
from app.main import main
|
||||||
|
from app.main.forms import BroadcastAreaForm
|
||||||
from app.utils import service_has_permission, user_has_permissions
|
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')
|
@user_has_permissions('send_messages')
|
||||||
@service_has_permission('broadcast')
|
@service_has_permission('broadcast')
|
||||||
def choose_broadcast_area(service_id, library_slug):
|
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(
|
return render_template(
|
||||||
'views/broadcast/areas.html',
|
'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>')
|
@main.route('/services/<uuid:service_id>/broadcast/remove/<area_slug>')
|
||||||
@user_has_permissions('send_messages')
|
@user_has_permissions('send_messages')
|
||||||
@service_has_permission('broadcast')
|
@service_has_permission('broadcast')
|
||||||
|
|||||||
@@ -355,7 +355,6 @@ class HeaderNavigation(Navigation):
|
|||||||
'preview_broadcast_areas',
|
'preview_broadcast_areas',
|
||||||
'choose_broadcast_library',
|
'choose_broadcast_library',
|
||||||
'choose_broadcast_area',
|
'choose_broadcast_area',
|
||||||
'add_broadcast_area',
|
|
||||||
'remove_broadcast_area',
|
'remove_broadcast_area',
|
||||||
'preview_broadcast_message',
|
'preview_broadcast_message',
|
||||||
}
|
}
|
||||||
@@ -410,7 +409,6 @@ class MainNavigation(Navigation):
|
|||||||
'preview_broadcast_areas',
|
'preview_broadcast_areas',
|
||||||
'choose_broadcast_library',
|
'choose_broadcast_library',
|
||||||
'choose_broadcast_area',
|
'choose_broadcast_area',
|
||||||
'add_broadcast_area',
|
|
||||||
'remove_broadcast_area',
|
'remove_broadcast_area',
|
||||||
'preview_broadcast_message',
|
'preview_broadcast_message',
|
||||||
},
|
},
|
||||||
@@ -996,7 +994,6 @@ class CaseworkNavigation(Navigation):
|
|||||||
'preview_broadcast_areas',
|
'preview_broadcast_areas',
|
||||||
'choose_broadcast_library',
|
'choose_broadcast_library',
|
||||||
'choose_broadcast_area',
|
'choose_broadcast_area',
|
||||||
'add_broadcast_area',
|
|
||||||
'remove_broadcast_area',
|
'remove_broadcast_area',
|
||||||
'preview_broadcast_message',
|
'preview_broadcast_message',
|
||||||
}
|
}
|
||||||
@@ -1313,7 +1310,6 @@ class OrgNavigation(Navigation):
|
|||||||
'preview_broadcast_areas',
|
'preview_broadcast_areas',
|
||||||
'choose_broadcast_library',
|
'choose_broadcast_library',
|
||||||
'choose_broadcast_area',
|
'choose_broadcast_area',
|
||||||
'add_broadcast_area',
|
|
||||||
'remove_broadcast_area',
|
'remove_broadcast_area',
|
||||||
'preview_broadcast_message',
|
'preview_broadcast_message',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
{% from "components/page-header.html" import page_header %}
|
{% 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" %}
|
{% extends "withnav_template.html" %}
|
||||||
|
|
||||||
@@ -9,12 +12,15 @@
|
|||||||
{% block maincolumn_content %}
|
{% block maincolumn_content %}
|
||||||
|
|
||||||
{{ page_header(
|
{{ page_header(
|
||||||
regions.name,
|
page_title,
|
||||||
back_link=url_for('.choose_broadcast_library', service_id=current_service.id),
|
back_link=url_for('.choose_broadcast_library', service_id=current_service.id),
|
||||||
)}}
|
)}}
|
||||||
|
|
||||||
{% for area in areas %}
|
{{ live_search(target_selector='.multiple-choice', show=show_search_form, form=search_form, label='Search by name') }}
|
||||||
<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 %}
|
{% call form_wrapper() %}
|
||||||
|
{{ checkboxes(form.areas, hide_legend=True) }}
|
||||||
|
{{ sticky_page_footer('Add to broadcast') }}
|
||||||
|
{% endcall %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ from tests.conftest import SERVICE_ONE_ID
|
|||||||
('.preview_broadcast_areas', {}),
|
('.preview_broadcast_areas', {}),
|
||||||
('.choose_broadcast_library', {}),
|
('.choose_broadcast_library', {}),
|
||||||
('.choose_broadcast_area', {'library_slug': 'countries'}),
|
('.choose_broadcast_area', {'library_slug': 'countries'}),
|
||||||
('.add_broadcast_area', {'area_slug': 'england'}),
|
|
||||||
('.remove_broadcast_area', {'area_slug': 'england'}),
|
('.remove_broadcast_area', {'area_slug': 'england'}),
|
||||||
('.preview_broadcast_message', {}),
|
('.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(
|
def test_remove_broadcast_area_page(
|
||||||
client_request,
|
client_request,
|
||||||
service_one,
|
service_one,
|
||||||
|
|||||||
Reference in New Issue
Block a user