Merge pull request #3498 from alphagov/add-broadcast-template

Allow adding broadcast templates
This commit is contained in:
Chris Hill-Scott
2020-07-06 09:06:16 +01:00
committed by GitHub
18 changed files with 285 additions and 87 deletions

View File

@@ -777,7 +777,12 @@ class BaseTemplateForm(StripWhitespaceForm):
class SMSTemplateForm(BaseTemplateForm):
def validate_template_content(self, field):
OnlySMSCharacters()(None, field)
OnlySMSCharacters(template_type='sms')(None, field)
class BroadcastTemplateForm(SMSTemplateForm):
def validate_template_content(self, field):
OnlySMSCharacters(template_type='broadcast')(None, field)
class LetterAddressForm(StripWhitespaceForm):
@@ -1644,7 +1649,7 @@ class TemplateAndFoldersSelectionForm(Form):
self,
all_template_folders,
template_list,
allow_adding_letter_template,
available_template_types,
allow_adding_copy_of_template,
*args,
**kwargs
@@ -1652,6 +1657,8 @@ class TemplateAndFoldersSelectionForm(Form):
super().__init__(*args, **kwargs)
self.available_template_types = available_template_types
self.templates_and_folders.choices = template_list.as_id_and_name
self.op = None
@@ -1664,12 +1671,25 @@ class TemplateAndFoldersSelectionForm(Form):
]
self.add_template_by_template_type.choices = list(filter(None, [
# We want to show email and text message to everyone,
# whether or not the service has them switched on. The
# option to add letter or broadcast templates should only
# be shown to services which have that permission
('email', 'Email'),
('sms', 'Text message'),
('letter', 'Letter') if allow_adding_letter_template else None,
('letter', 'Letter') if 'letter' in available_template_types else None,
('broadcast', 'Broadcast') if 'broadcast' in available_template_types else None,
('copy-existing', 'Copy an existing template') if allow_adding_copy_of_template else None,
]))
@property
def trying_to_add_unavailable_template_type(self):
return all((
self.is_add_template_op,
self.add_template_by_template_type.data,
self.add_template_by_template_type.data not in self.available_template_types,
))
def is_selected(self, template_folder_id):
return template_folder_id in (self.templates_and_folders.data or [])

View File

@@ -88,12 +88,21 @@ class NoEmbeddedImagesInSVG:
class OnlySMSCharacters:
def __init__(self, *args, template_type, **kwargs):
self._template_type = template_type
super().__init__(*args, **kwargs)
def __call__(self, form, field):
non_sms_characters = sorted(list(SanitiseSMS.get_non_compatible_characters(field.data)))
if non_sms_characters:
raise ValidationError(
'You cannot use {} in text messages. {} will not show up properly on everyones phones.'.format(
'You cannot use {} in {}. {} will not show up properly on everyones phones.'.format(
formatted_list(non_sms_characters, conjunction='or', before_each='', after_each=''),
{
'broadcast': 'broadcasts',
'sms': 'text messages',
}.get(self._template_type),
('It' if len(non_sms_characters) == 1 else 'They')
)
)

View File

@@ -53,7 +53,6 @@ from app.template_previews import TemplatePreview, get_page_count_for_letter
from app.utils import (
PermanentRedirect,
Spreadsheet,
email_or_sms_not_enabled,
get_errors_for_csv,
get_help_argument,
get_template,
@@ -128,7 +127,7 @@ def send_messages(service_id, template_id):
elif db_template['template_type'] == 'sms':
sms_sender = get_sms_sender_from_session()
if email_or_sms_not_enabled(db_template['template_type'], current_service.permissions):
if db_template['template_type'] not in current_service.available_template_types:
return redirect(url_for(
'.action_blocked',
service_id=service_id,
@@ -302,8 +301,11 @@ def send_test(service_id, template_id):
db_template = current_service.get_template_with_user_permission_or_403(template_id, current_user)
if db_template['template_type'] == 'letter':
session['sender_id'] = None
return redirect(
url_for('.send_one_off_letter_address', service_id=service_id, template_id=template_id)
)
if email_or_sms_not_enabled(db_template['template_type'], current_service.permissions):
if db_template['template_type'] not in current_service.available_template_types:
return redirect(url_for(
'.action_blocked',
service_id=service_id,
@@ -311,11 +313,6 @@ def send_test(service_id, template_id):
return_to='view_template',
template_id=template_id))
if db_template['template_type'] == 'letter':
return redirect(
url_for('.send_one_off_letter_address', service_id=service_id, template_id=template_id)
)
return redirect(url_for(
{
'main.send_test': '.send_test_step',

View File

@@ -16,6 +16,7 @@ from app import (
)
from app.main import main, no_cookie
from app.main.forms import (
BroadcastTemplateForm,
EmailTemplateForm,
LetterTemplateForm,
LetterTemplatePostageForm,
@@ -30,7 +31,6 @@ from app.models.service import Service
from app.models.template_list import TemplateList, TemplateLists
from app.template_previews import TemplatePreview, get_page_count_for_letter
from app.utils import (
email_or_sms_not_enabled,
get_template,
should_skip_template_page,
user_has_permissions,
@@ -40,7 +40,8 @@ from app.utils import (
form_objects = {
'email': EmailTemplateForm,
'sms': SMSTemplateForm,
'letter': LetterTemplateForm
'letter': LetterTemplateForm,
'broadcast': BroadcastTemplateForm,
}
@@ -122,7 +123,7 @@ def choose_template(service_id, template_type='all', template_folder_id=None):
all_template_folders=current_service.get_user_template_folders(current_user),
template_list=template_list,
template_type=template_type,
allow_adding_letter_template=current_service.has_permission('letter'),
available_template_types=current_service.available_template_types,
allow_adding_copy_of_template=(
current_service.all_templates or len(current_user.service_ids) > 1
),
@@ -136,6 +137,13 @@ def choose_template(service_id, template_type='all', template_folder_id=None):
return process_folder_management_form(templates_and_folders_form, template_folder_id)
except HTTPError as e:
flash(e.message)
elif templates_and_folders_form.trying_to_add_unavailable_template_type:
return redirect(url_for(
'.action_blocked',
service_id=current_service.id,
notification_type=templates_and_folders_form.add_template_by_template_type.data,
return_to='add_new_template',
))
if 'templates_and_folders' in templates_and_folders_form.errors:
flash('Select at least one template or folder')
@@ -199,6 +207,7 @@ def get_template_nav_label(value):
'sms': 'Text message',
'email': 'Email',
'letter': 'Letter',
'broadcast': 'Broadcast',
}[value]
@@ -310,20 +319,12 @@ def _add_template_by_type(template_type, template_folder_id):
template_id=blank_letter['data']['id'],
))
if email_or_sms_not_enabled(template_type, current_service.permissions):
return redirect(url_for(
'.action_blocked',
service_id=current_service.id,
notification_type=template_type,
return_to='add_new_template',
))
else:
return redirect(url_for(
'.add_service_template',
service_id=current_service.id,
template_type=template_type,
template_folder_id=template_folder_id,
))
return redirect(url_for(
'.add_service_template',
service_id=current_service.id,
template_type=template_type,
template_folder_id=template_folder_id,
))
@main.route("/services/<uuid:service_id>/templates/copy")
@@ -437,7 +438,7 @@ def action_blocked(service_id, notification_type, return_to, template_id=None):
service_id=service_id,
notification_type=notification_type,
back_link=back_link(),
)
), 403
@main.route("/services/<uuid:service_id>/templates/folders/<uuid:template_folder_id>/manage", methods=['GET', 'POST'])
@@ -527,8 +528,14 @@ def delete_template_folder(service_id, template_folder_id):
@user_has_permissions('manage_templates')
def add_service_template(service_id, template_type, template_folder_id=None):
if not current_service.has_permission('letter') and template_type == 'letter':
abort(403)
if template_type not in current_service.available_template_types:
return redirect(url_for(
'.action_blocked',
service_id=service_id,
notification_type=template_type,
template_folder_id=template_folder_id,
return_to='templates',
))
form = form_objects[template_type]()
if form.validate_on_submit():
@@ -558,22 +565,13 @@ def add_service_template(service_id, template_type, template_folder_id=None):
url_for('.view_template', service_id=service_id, template_id=new_template['data']['id'])
)
if email_or_sms_not_enabled(template_type, current_service.permissions):
return redirect(url_for(
'.action_blocked',
service_id=service_id,
notification_type=template_type,
template_folder_id=template_folder_id,
return_to='templates',
))
else:
return render_template(
'views/edit-{}-template.html'.format(template_type),
form=form,
template_type=template_type,
template_folder_id=template_folder_id,
heading_action='New',
)
return render_template(
'views/edit-{}-template.html'.format(template_type),
form=form,
template_type=template_type,
template_folder_id=template_folder_id,
heading_action='New',
)
def abort_403_if_not_admin_user():
@@ -642,7 +640,7 @@ def edit_service_template(service_id, template_id):
template_id=template_id
))
if email_or_sms_not_enabled(template['template_type'], current_service.permissions):
if template['template_type'] not in current_service.available_template_types:
return redirect(url_for(
'.action_blocked',
service_id=service_id,