diff --git a/app/main/views/manage_users.py b/app/main/views/manage_users.py index f5d83bfd6..513bfbdaf 100644 --- a/app/main/views/manage_users.py +++ b/app/main/views/manage_users.py @@ -4,8 +4,7 @@ from flask import ( redirect, abort, url_for, - flash -) + flash) from flask_login import ( login_required, @@ -79,7 +78,7 @@ def invite_user(service_id): @main.route("/services//users/", methods=['GET', 'POST']) @login_required -def edit_user(service_id, user_id): +def edit_user_permissions(service_id, user_id): if request.method == 'POST': return redirect(url_for('.manage_users', service_id=service_id)) @@ -116,6 +115,13 @@ def delete_user(service_id, user_id): ) +@main.route("/services//cancel-invited-user/", methods=['GET']) +def cancel_invited_user(service_id, invited_user_id): + invite_api_client.cancel_invited_user(service_id=service_id, invited_user_id=invited_user_id) + + return redirect(url_for('main.manage_users', service_id=service_id)) + + def _get_permissions(form): permissions = [] if form.get('send_messages') and form['send_messages'] == 'yes': diff --git a/app/notify_client/invite_api_client.py b/app/notify_client/invite_api_client.py index d1acd5f6d..6f2712848 100644 --- a/app/notify_client/invite_api_client.py +++ b/app/notify_client/invite_api_client.py @@ -1,3 +1,4 @@ + from notifications_python_client.base import BaseAPIClient from app.notify_client.models import InvitedUser @@ -27,17 +28,21 @@ class InviteApiClient(BaseAPIClient): endpoint = '/service/{}/invite'.format(service_id) resp = self.get(endpoint) invites = resp['data'] - invited_users = _get_invited_users(invites) + invited_users = self._get_invited_users(invites) return invited_users def accept_invite(self, token): resp = self.get(url='/invite/{}'.format(token)) return InvitedUser(**resp['data']) + def cancel_invited_user(self, service_id, invited_user_id): + data = {'status': 'cancelled'} + self.post(url='/service/{0}/invite/{1}'.format(service_id, invited_user_id), + data=data) -def _get_invited_users(invites): - invited_users = [] - for invite in invites: - invited_user = InvitedUser(**invite) - invited_users.append(invited_user) - return invited_users + def _get_invited_users(self, invites): + invited_users = [] + for invite in invites: + invited_user = InvitedUser(**invite) + invited_users.append(invited_user) + return invited_users diff --git a/app/templates/views/manage-users.html b/app/templates/views/manage-users.html index 44a0b39e5..161f966ec 100644 --- a/app/templates/views/manage-users.html +++ b/app/templates/views/manage-users.html @@ -31,9 +31,6 @@ Manage users – GOV.UK Notify {{ boolean_field(item.has_permissions(service_id, 'send_messages')) }} {{ boolean_field(item.has_permissions(service_id, 'manage_service')) }} {{ boolean_field(item.has_permissions(service_id, 'manage_api_keys')) }} - {% call field(align='right') %} - Change - {% endcall %} {% endcall %} {% if invited_users %} @@ -46,9 +43,15 @@ Manage users – GOV.UK Notify {{ boolean_field(item.has_permissions('send_messages')) }} {{ boolean_field(item.has_permissions('manage_service')) }} {{ boolean_field(item.has_permissions('manage_api_keys')) }} - {% call field(align='right') %} - Change - {% endcall %} + {% if item.status == 'pending' %} + {% call field(align='right') %} + Cancel invitation + {% endcall %} + {% else %} + {% call field() %} + {{ item.status }} + {% endcall %} + {% endif %} {% endcall %} {% endif %} diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py index 438e3060e..0d4ecf093 100644 --- a/tests/app/main/views/test_manage_users.py +++ b/tests/app/main/views/test_manage_users.py @@ -30,7 +30,7 @@ def test_should_show_page_for_one_user( with app_.test_request_context(): with app_.test_client() as client: client.login(api_user_active) - response = client.get(url_for('main.edit_user', service_id=55555, user_id=0)) + response = client.get(url_for('main.edit_user_permissions', service_id=55555, user_id=0)) assert response.status_code == 200 @@ -47,7 +47,7 @@ def test_redirect_after_saving_user( with app_.test_client() as client: client.login(api_user_active) response = client.post(url_for( - 'main.edit_user', service_id=55555, user_id=0 + 'main.edit_user_permissions', service_id=55555, user_id=0 )) assert response.status_code == 302 @@ -104,3 +104,18 @@ def test_invite_user( assert page.h1.string.strip() == 'Manage team' flash_banner = page.find('div', class_='banner-default-with-tick').string.strip() assert flash_banner == 'Invite sent to test@example.gov.uk' + + +def test_cancel_invited_user_cancels_user_invitations(app_, api_user_active, mock_login, mocker): + with app_.test_request_context(): + with app_.test_client() as client: + mocker.patch('app.invite_api_client.cancel_invited_user') + import uuid + invited_user_id = uuid.uuid4() + client.login(api_user_active) + service_id = uuid.uuid4() + response = client.get(url_for('main.cancel_invited_user', service_id=service_id, + invited_user_id=invited_user_id)) + + assert response.status_code == 302 + assert response.location == url_for('main.manage_users', service_id=service_id, _external=True)