mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-23 15:57:23 -04:00
Merge pull request #3377 from alphagov/delete-contact-list
Let users delete a contact list
This commit is contained in:
@@ -443,6 +443,29 @@ def contact_list(service_id, contact_list_id):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@main.route("/services/<uuid:service_id>/contact-list/<uuid:contact_list_id>/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/<uuid:service_id>/contact-list/<uuid:contact_list_id>.csv", methods=['GET'])
|
@main.route("/services/<uuid:service_id>/contact-list/<uuid:contact_list_id>.csv", methods=['GET'])
|
||||||
@user_has_permissions('send_messages')
|
@user_has_permissions('send_messages')
|
||||||
def download_contact_list(service_id, contact_list_id):
|
def download_contact_list(service_id, contact_list_id):
|
||||||
|
|||||||
@@ -105,6 +105,12 @@ class ContactList(JSONModel):
|
|||||||
template_type=metadata['template_type'],
|
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
|
@property
|
||||||
def contents(self):
|
def contents(self):
|
||||||
return self.download(self.service_id, self.id)
|
return self.download(self.service_id, self.id)
|
||||||
|
|||||||
@@ -326,6 +326,7 @@ class HeaderNavigation(Navigation):
|
|||||||
'check_contact_list',
|
'check_contact_list',
|
||||||
'save_contact_list',
|
'save_contact_list',
|
||||||
'contact_list',
|
'contact_list',
|
||||||
|
'delete_contact_list',
|
||||||
'upload_letter',
|
'upload_letter',
|
||||||
'uploaded_letter_preview',
|
'uploaded_letter_preview',
|
||||||
'uploads',
|
'uploads',
|
||||||
@@ -400,6 +401,7 @@ class MainNavigation(Navigation):
|
|||||||
'check_contact_list',
|
'check_contact_list',
|
||||||
'save_contact_list',
|
'save_contact_list',
|
||||||
'contact_list',
|
'contact_list',
|
||||||
|
'delete_contact_list',
|
||||||
'upload_letter',
|
'upload_letter',
|
||||||
'uploaded_letter_preview',
|
'uploaded_letter_preview',
|
||||||
'uploads',
|
'uploads',
|
||||||
@@ -686,6 +688,7 @@ class CaseworkNavigation(Navigation):
|
|||||||
'check_contact_list',
|
'check_contact_list',
|
||||||
'save_contact_list',
|
'save_contact_list',
|
||||||
'contact_list',
|
'contact_list',
|
||||||
|
'delete_contact_list',
|
||||||
'upload_letter',
|
'upload_letter',
|
||||||
'uploaded_letter_preview',
|
'uploaded_letter_preview',
|
||||||
'uploads',
|
'uploads',
|
||||||
@@ -1234,6 +1237,7 @@ class OrgNavigation(Navigation):
|
|||||||
'check_contact_list',
|
'check_contact_list',
|
||||||
'save_contact_list',
|
'save_contact_list',
|
||||||
'contact_list',
|
'contact_list',
|
||||||
|
'delete_contact_list',
|
||||||
'upload_letter',
|
'upload_letter',
|
||||||
'uploaded_letter_preview',
|
'uploaded_letter_preview',
|
||||||
'uploads',
|
'uploads',
|
||||||
|
|||||||
@@ -30,5 +30,8 @@ class ContactListApiClient(NotifyAdminAPIClient):
|
|||||||
def get_contact_list(self, *, service_id, contact_list_id):
|
def get_contact_list(self, *, service_id, contact_list_id):
|
||||||
return self.get(f'/service/{service_id}/contact-list/{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()
|
contact_list_api_client = ContactListApiClient()
|
||||||
|
|||||||
@@ -45,4 +45,14 @@
|
|||||||
</p>
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% if not confirm_delete_banner %}
|
||||||
|
<div class="js-stick-at-bottom-when-scrolling">
|
||||||
|
<div class="page-footer">
|
||||||
|
<span class="page-footer-delete-link page-footer-delete-link-without-button">
|
||||||
|
<a class="govuk-link govuk-link--destructive" href="{{ url_for('main.delete_contact_list', service_id=current_service.id, contact_list_id=contact_list.id) }}">Delete this contact list</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -1261,3 +1261,52 @@ def test_download_contact_list(
|
|||||||
'phone number\n'
|
'phone number\n'
|
||||||
'07900900321'
|
'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,
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user