From 565d29ed438df79de2bbc65acd7e035f0b66c9c8 Mon Sep 17 00:00:00 2001 From: Pea Tyczynska Date: Mon, 12 Nov 2018 16:37:37 +0000 Subject: [PATCH] Add a new endpoint for managing a folder, use it to rename folder - Add a GET / POST view: manage template folder - Add a template for that view, where a user can rename their folder - Add an API client method for updating a folder - Test the new feature, including the test that service without permissions cannot manage a folder --- app/main/views/templates.py | 21 ++++++++ app/navigation.py | 4 ++ .../template_folder_api_client.py | 6 +++ app/templates/views/templates/choose.html | 4 ++ .../templates/manage-template-folder.html | 31 +++++++++++ tests/app/main/views/test_template_folders.py | 52 +++++++++++++++++++ 6 files changed, 118 insertions(+) create mode 100644 app/templates/views/templates/manage-template-folder.html diff --git a/app/main/views/templates.py b/app/main/views/templates.py index e78aa7901..297bbba21 100644 --- a/app/main/views/templates.py +++ b/app/main/views/templates.py @@ -369,6 +369,27 @@ def add_template_folder(service_id, template_folder_id=None): ) +@main.route("/services//templates/folders//manage", methods=['GET', 'POST']) +def manage_template_folder(service_id, template_folder_id): + if not current_service.has_permission('edit_folders'): + abort(403) + + form = TemplateFolderForm() + if form.validate_on_submit(): + template_folder_api_client.update_template_folder( + current_service.id, template_folder_id, name=form.name.data + ) + return redirect( + url_for('.choose_template', service_id=service_id, template_folder_id=template_folder_id) + ) + + return render_template( + 'views/templates/manage-template-folder.html', + form=form, + template_folder_path=current_service.get_template_folder_path(template_folder_id), + ) + + @main.route("/services//templates/add-", methods=['GET', 'POST']) @main.route("/services//templates/folders//add-", methods=['GET', 'POST']) diff --git a/app/navigation.py b/app/navigation.py index af45c74ba..7bae1f3af 100644 --- a/app/navigation.py +++ b/app/navigation.py @@ -172,6 +172,7 @@ class HeaderNavigation(Navigation): 'letter_jobs', 'link_service_to_organisation', 'manage_org_users', + 'manage_template_folder', 'manage_users', 'monthly', 'new_password', @@ -310,6 +311,7 @@ class MainNavigation(Navigation): 'copy_template', 'delete_service_template', 'edit_service_template', + 'manage_template_folder', 'send_messages', 'send_one_off', 'send_one_off_step', @@ -625,6 +627,7 @@ class CaseworkNavigation(Navigation): 'link_service_to_organisation', 'live_services', 'manage_org_users', + 'manage_template_folder', 'manage_users', 'monthly', 'new_password', @@ -857,6 +860,7 @@ class OrgNavigation(Navigation): 'letter_jobs', 'link_service_to_organisation', 'live_services', + 'manage_template_folder', 'manage_users', 'monthly', 'new_password', diff --git a/app/notify_client/template_folder_api_client.py b/app/notify_client/template_folder_api_client.py index ee70ff0b2..ea078b716 100644 --- a/app/notify_client/template_folder_api_client.py +++ b/app/notify_client/template_folder_api_client.py @@ -43,5 +43,11 @@ class TemplateFolderAPIClient(NotifyAdminAPIClient): template_ids, )) + def update_template_folder(self, service_id, template_folder_id, name): + self.post( + '/service/{}/template-folder/{}'.format(service_id, template_folder_id), + {"name": name} + ) + template_folder_api_client = TemplateFolderAPIClient() diff --git a/app/templates/views/templates/choose.html b/app/templates/views/templates/choose.html index 952d7ef7a..c3e519c6d 100644 --- a/app/templates/views/templates/choose.html +++ b/app/templates/views/templates/choose.html @@ -65,6 +65,10 @@ {% if current_user.has_permissions('manage_templates') %}
Add new template + + {% if can_manage_folders and template_folder_path %} + Manage + {% endif %}
{% endif %} diff --git a/app/templates/views/templates/manage-template-folder.html b/app/templates/views/templates/manage-template-folder.html new file mode 100644 index 000000000..8d9c82bc9 --- /dev/null +++ b/app/templates/views/templates/manage-template-folder.html @@ -0,0 +1,31 @@ +{% 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 %} +Templates +{% for folder in template_folder_path %} + / + {{ folder.name }} +{% endfor %} + - Manage folder +{% endblock %} + +{% block maincolumn_content %} + +

+ Templates + {% for folder in template_folder_path %} + / + {{ folder.name }} + {% endfor %} +

+ + + {% 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 cfc33d07c..f608bd0ee 100644 --- a/tests/app/main/views/test_template_folders.py +++ b/tests/app/main/views/test_template_folders.py @@ -248,3 +248,55 @@ def test_can_create_email_template_with_parent_folder( data['subject'], data['process_type'], data['parent_folder_id']) + + +def test_get_manage_folder_page(client_request, service_one, mock_get_template_folders): + folder_id = str(uuid.uuid4()) + mock_get_template_folders.return_value = [ + {'id': folder_id, 'name': 'folder_two', 'parent_id': None}, + ] + service_one['permissions'] += ['edit_folders'] + + page = client_request.get( + 'main.manage_template_folder', + service_id=service_one['id'], + template_folder_id=folder_id + ) + assert page.select_one('input[name=name]') is not None + + +def test_get_manage_folder_page_no_permissions(client_request, service_one, mock_get_template_folders): + folder_id = str(uuid.uuid4()) + + client_request.get( + 'main.manage_template_folder', + service_id=service_one['id'], + template_folder_id=folder_id, + _expected_status=403 + ) + + +def test_rename_folder(client_request, service_one, mock_get_template_folders, mocker): + mock_update = mocker.patch('app.template_folder_api_client.update_template_folder') + folder_id = str(uuid.uuid4()) + mock_get_template_folders.return_value = [ + {'id': folder_id, 'name': 'folder_two', 'parent_id': None}, + ] + service_one['permissions'] += ['edit_folders'] + + client_request.post( + 'main.manage_template_folder', + service_id=service_one['id'], + template_folder_id=folder_id, + _data={"name": "new beautiful name"}, + _expected_redirect=url_for("main.choose_template", + service_id=service_one['id'], + template_folder_id=folder_id, + _external=True) + ) + + mock_update.assert_called_once_with( + service_one['id'], + folder_id, + name="new beautiful name" + )