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, + )