diff --git a/app/main/views/uploads.py b/app/main/views/uploads.py
index 4398152eb..20cc47f64 100644
--- a/app/main/views/uploads.py
+++ b/app/main/views/uploads.py
@@ -443,6 +443,29 @@ def contact_list(service_id, contact_list_id):
)
+@main.route("/services//contact-list//delete", methods=['GET', 'POST'])
+@user_has_permissions('manage_templates')
+def delete_contact_list(service_id, contact_list_id):
+ contact_list = ContactList.from_id(contact_list_id, service_id=service_id)
+
+ if request.method == 'POST':
+ contact_list.delete()
+ return redirect(url_for(
+ '.uploads',
+ service_id=service_id,
+ ))
+
+ flash([
+ f"Are you sure you want to delete ‘{contact_list.original_file_name}’?",
+ ], 'delete')
+
+ return render_template(
+ 'views/uploads/contact-list/contact-list.html',
+ contact_list=contact_list,
+ confirm_delete_banner=True,
+ )
+
+
@main.route("/services//contact-list/.csv", methods=['GET'])
@user_has_permissions('send_messages')
def download_contact_list(service_id, contact_list_id):
diff --git a/app/models/contact_list.py b/app/models/contact_list.py
index 70378cb12..95cfdfdf2 100644
--- a/app/models/contact_list.py
+++ b/app/models/contact_list.py
@@ -105,6 +105,12 @@ class ContactList(JSONModel):
template_type=metadata['template_type'],
))
+ def delete(self):
+ contact_list_api_client.delete_contact_list(
+ service_id=self.service_id,
+ contact_list_id=self.id,
+ )
+
@property
def contents(self):
return self.download(self.service_id, self.id)
diff --git a/app/navigation.py b/app/navigation.py
index b4bbd4429..0f11b3df1 100644
--- a/app/navigation.py
+++ b/app/navigation.py
@@ -326,6 +326,7 @@ class HeaderNavigation(Navigation):
'check_contact_list',
'save_contact_list',
'contact_list',
+ 'delete_contact_list',
'upload_letter',
'uploaded_letter_preview',
'uploads',
@@ -400,6 +401,7 @@ class MainNavigation(Navigation):
'check_contact_list',
'save_contact_list',
'contact_list',
+ 'delete_contact_list',
'upload_letter',
'uploaded_letter_preview',
'uploads',
@@ -686,6 +688,7 @@ class CaseworkNavigation(Navigation):
'check_contact_list',
'save_contact_list',
'contact_list',
+ 'delete_contact_list',
'upload_letter',
'uploaded_letter_preview',
'uploads',
@@ -1234,6 +1237,7 @@ class OrgNavigation(Navigation):
'check_contact_list',
'save_contact_list',
'contact_list',
+ 'delete_contact_list',
'upload_letter',
'uploaded_letter_preview',
'uploads',
diff --git a/app/notify_client/contact_list_api_client.py b/app/notify_client/contact_list_api_client.py
index 9315d57d8..9f7c04dc7 100644
--- a/app/notify_client/contact_list_api_client.py
+++ b/app/notify_client/contact_list_api_client.py
@@ -30,5 +30,8 @@ class ContactListApiClient(NotifyAdminAPIClient):
def get_contact_list(self, *, service_id, contact_list_id):
return self.get(f'/service/{service_id}/contact-list/{contact_list_id}')
+ def delete_contact_list(self, *, service_id, contact_list_id):
+ return self.delete(f'/service/{service_id}/contact-list/{contact_list_id}')
+
contact_list_api_client = ContactListApiClient()
diff --git a/app/templates/views/uploads/contact-list/contact-list.html b/app/templates/views/uploads/contact-list/contact-list.html
index 50c0cef79..eee292712 100644
--- a/app/templates/views/uploads/contact-list/contact-list.html
+++ b/app/templates/views/uploads/contact-list/contact-list.html
@@ -45,4 +45,14 @@
{% endif %}
+ {% if not confirm_delete_banner %}
+
+
+
+ {% endif %}
+
{% endblock %}
diff --git a/tests/app/main/views/test_uploads.py b/tests/app/main/views/test_uploads.py
index 2c63839e8..8afd8505f 100644
--- a/tests/app/main/views/test_uploads.py
+++ b/tests/app/main/views/test_uploads.py
@@ -1261,3 +1261,52 @@ def test_download_contact_list(
'phone number\n'
'07900900321'
)
+
+
+def test_confirm_delete_contact_list(
+ mocker,
+ client_request,
+ fake_uuid,
+ mock_get_contact_list,
+):
+ mocker.patch(
+ 'app.models.contact_list.s3download',
+ return_value='phone number\n07900900321'
+ )
+ page = client_request.get(
+ 'main.delete_contact_list',
+ service_id=SERVICE_ONE_ID,
+ contact_list_id=fake_uuid,
+ )
+ assert normalize_spaces(page.select_one('.banner-dangerous').text) == (
+ 'Are you sure you want to delete ‘EmergencyContactList.xls’? '
+ 'Yes, delete'
+ )
+ assert 'action' not in page.select_one('form')
+ assert page.select_one('form')['method'] == 'post'
+ assert page.select_one('form button')['type'] == 'submit'
+
+
+def test_delete_contact_list(
+ mocker,
+ client_request,
+ fake_uuid,
+ mock_get_contact_list,
+):
+ mock_delete = mocker.patch(
+ 'app.models.contact_list.contact_list_api_client.delete_contact_list'
+ )
+ client_request.post(
+ 'main.delete_contact_list',
+ service_id=SERVICE_ONE_ID,
+ contact_list_id=fake_uuid,
+ _expected_redirect=url_for(
+ 'main.uploads',
+ service_id=SERVICE_ONE_ID,
+ _external=True,
+ )
+ )
+ mock_delete.assert_called_once_with(
+ service_id=SERVICE_ONE_ID,
+ contact_list_id=fake_uuid,
+ )