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
This commit is contained in:
Pea Tyczynska
2018-11-12 16:37:37 +00:00
parent 0f90bde958
commit 565d29ed43
6 changed files with 118 additions and 0 deletions

View File

@@ -369,6 +369,27 @@ def add_template_folder(service_id, template_folder_id=None):
)
@main.route("/services/<service_id>/templates/folders/<template_folder_id>/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/<service_id>/templates/add-<template_type>", methods=['GET', 'POST'])
@main.route("/services/<service_id>/templates/folders/<template_folder_id>/add-<template_type>",
methods=['GET', 'POST'])

View File

@@ -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',

View File

@@ -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()

View File

@@ -65,6 +65,10 @@
{% if current_user.has_permissions('manage_templates') %}
<div class="column-one-third">
<a href="{{ url_for('.add_template_by_type', service_id=current_service.id, template_folder_id=current_template_folder_id) }}" class="button align-with-heading">Add new template</a>
{% if can_manage_folders and template_folder_path %}
<a href="{{ url_for('.manage_template_folder', service_id=current_service.id, template_folder_id=current_template_folder_id) }}" class="align-with-heading">Manage</a>
{% endif %}
</div>
{% endif %}
</div>

View File

@@ -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 %}
<h1 class="heading-large">
<a href="{{ url_for('.choose_template', service_id=current_service.id, template_type=template_type) }}">Templates</a>
{% for folder in template_folder_path %}
/
<a href="{{ url_for('.choose_template', service_id=current_service.id, template_type=template_type, template_folder_id=folder.id) }}">{{ folder.name }}</a>
{% endfor %}
</h1>
{% call form_wrapper() %}
{{ textbox(form.name) }}
{{ page_footer('Save') }}
{% endcall %}
{% endblock %}

View File

@@ -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"
)