diff --git a/app/main/forms.py b/app/main/forms.py index eda0bcca9..3dc585d33 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -1100,3 +1100,7 @@ class ReturnedLettersForm(StripWhitespaceForm): DataRequired(message="Can’t be empty"), ] ) + + +class TemplateFolderForm(StripWhitespaceForm): + name = StringField('Folder name', validators=[DataRequired(message='Can’t be empty')]) diff --git a/app/main/views/templates.py b/app/main/views/templates.py index e178d1d3c..39f0e9dbe 100644 --- a/app/main/views/templates.py +++ b/app/main/views/templates.py @@ -14,6 +14,7 @@ from app import ( service_api_client, template_statistics_client, user_api_client, + template_folder_api_client ) from app.main import main from app.main.forms import ( @@ -23,6 +24,7 @@ from app.main.forms import ( SearchTemplatesForm, SetTemplateSenderForm, SMSTemplateForm, + TemplateFolderForm ) from app.main.views.send import get_example_csv_rows, get_sender_details from app.models.service import Service @@ -290,18 +292,23 @@ def action_blocked(service_id, notification_type, return_to, template_id): @main.route("/services//templates/add-folder", methods=['GET', 'POST']) -def add_folder(service_id): +def add_template_folder(service_id): if not current_service.has_permission('edit_folders'): abort(403) - form = NewFolderForm() + form = TemplateFolderForm() if form.validate_on_submit(): - folder_api_client.create_template_folder(form.name.data, current_service.id, parent_id=None) + template_folder_api_client.create_template_folder(current_service.id, name=form.name.data, parent_id=None) return redirect( - url_for('.view_templates', service_id=service_id) + url_for('.choose_template', service_id=service_id) ) + return render_template( + 'views/templates/add-template-folder.html', + form=form + ) + @main.route("/services//templates/add-", methods=['GET', 'POST']) @login_required diff --git a/app/models/service.py b/app/models/service.py index 293d7d6e8..9b5c534e4 100644 --- a/app/models/service.py +++ b/app/models/service.py @@ -8,7 +8,7 @@ from app.notify_client.job_api_client import job_api_client from app.notify_client.organisations_api_client import organisations_client from app.notify_client.service_api_client import service_api_client from app.notify_client.user_api_client import user_api_client -from app.notify_client.template_folder_client import template_folder_client +from app.notify_client.template_folder_api_client import template_folder_api_client from app.utils import get_default_sms_sender @@ -256,4 +256,4 @@ class Service(): @cached_property def template_folders(self): - return template_folder_client.get_template_folders(self.id) + return template_folder_api_client.get_template_folders(self.id) diff --git a/app/navigation.py b/app/navigation.py index 4bbc81fe0..af45c74ba 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -109,7 +109,7 @@ class HeaderNavigation(Navigation): 'add_service', 'add_service_template', 'add_template_by_type', - 'add_folder', + 'add_template_folder', 'agreement', 'api_callbacks', 'api_documentation', @@ -300,7 +300,7 @@ class MainNavigation(Navigation): 'action_blocked', 'add_service_template', 'add_template_by_type', - 'add_folder', + 'add_template_folder', 'check_messages', 'check_notification', 'choose_template', @@ -554,7 +554,7 @@ class CaseworkNavigation(Navigation): 'add_service', 'add_service_template', 'add_template_by_type', - 'add_folder', + 'add_template_folder', 'agreement', 'api_callbacks', 'api_documentation', @@ -790,7 +790,7 @@ class OrgNavigation(Navigation): 'add_service', 'add_service_template', 'add_template_by_type', - 'add_folder', + 'add_template_folder', 'agreement', 'api_callbacks', 'api_documentation', diff --git a/app/templates/views/service-settings/name.html b/app/templates/views/service-settings/name.html index 33694395d..182af6fc8 100644 --- a/app/templates/views/service-settings/name.html +++ b/app/templates/views/service-settings/name.html @@ -1,3 +1,4 @@ + {% extends "withnav_template.html" %} {% from "components/textbox.html" import textbox %} {% from "components/page-footer.html" import page_footer %} diff --git a/app/templates/views/templates/add-template-folder.html b/app/templates/views/templates/add-template-folder.html new file mode 100644 index 000000000..81a816918 --- /dev/null +++ b/app/templates/views/templates/add-template-folder.html @@ -0,0 +1,20 @@ + +{% extends "withnav_template.html" %} +{% from "components/textbox.html" import textbox %} +{% from "components/page-footer.html" import page_footer %} +{% from "components/form.html" import form_wrapper %} + +{% block service_page_title %} + Add a folder +{% endblock %} + +{% block maincolumn_content %} + +

Add a folder

+ + {% call form_wrapper() %} + {{ textbox(form.name) }} + {{ page_footer('Save') }} + {% endcall %} + +{% endblock %} diff --git a/tests/app/main/views/test_template_folders.py b/tests/app/main/views/test_template_folders.py index b7ac1bee8..50bc396b7 100644 --- a/tests/app/main/views/test_template_folders.py +++ b/tests/app/main/views/test_template_folders.py @@ -1,6 +1,7 @@ +from flask import url_for -def test_add_folder( +def test_add_page_shows_option_for_folder( client_request, service_one, mocker, @@ -26,3 +27,35 @@ def test_add_folder( 'Copy of an existing template', 'Folder' ] + + +def test_get_add_template_folder_page(client_request, service_one): + service_one['permissions'] += ['edit_folders'] + + page = client_request.get('main.add_template_folder', service_id=service_one['id']) + + assert page.find('input', attrs={'name': 'name'}) is not None + + +def test_add_template_folder_page_rejects_if_service_doesnt_have_permission(client_request, service_one): + client_request.get('main.add_template_folder', service_id=service_one['id'], _expected_status=403) + client_request.post('main.add_template_folder', service_id=service_one['id'], _expected_status=403) + + +def test_post_add_template_folder_page(client_request, service_one, mocker): + mock_create = mocker.patch('app.template_folder_api_client.create_template_folder') + + service_one['permissions'] += ['edit_folders'] + + client_request.post( + 'main.add_template_folder', + service_id=service_one['id'], + _data={'name': 'foo'}, + _expected_redirect=url_for( + 'main.choose_template', + service_id=service_one['id'], + _external=True, + ) + ) + + mock_create.assert_called_once_with(service_one['id'], name='foo', parent_id=None)