From 219c74007136e644550fba2edb5de0e9d1152c16 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Tue, 1 Mar 2016 16:12:26 +0000 Subject: [PATCH 1/5] Add button to cancel invitation of invited user. --- app/main/views/manage_users.py | 12 +++++++++--- app/notify_client/invite_api_client.py | 6 ++++++ app/templates/views/manage-users.html | 5 +---- tests/app/main/views/test_manage_users.py | 19 +++++++++++++++++-- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/app/main/views/manage_users.py b/app/main/views/manage_users.py index 0b5f0e7f0..87fa3154d 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=['POST']) +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 1dffed425..4e9dc8639 100644 --- a/app/notify_client/invite_api_client.py +++ b/app/notify_client/invite_api_client.py @@ -28,3 +28,9 @@ class InviteApiClient(BaseAPIClient): endpoint = '/service/{}/invite'.format(service_id) resp = self.get(endpoint) return [User(data) for data in resp['data']] + + def cancel_invited_user(self, service_id, invited_user_id): + data = {'status': 'cancelled'} + resp = self.post(url='/service/{0}/invite/{0}'.format(service_id, invited_user_id), + data = data) + return resp['data'] \ No newline at end of file diff --git a/app/templates/views/manage-users.html b/app/templates/views/manage-users.html index 02d3d817e..2a785d359 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 %} @@ -47,7 +44,7 @@ Manage users – GOV.UK Notify {{ boolean_field(item.has_permissions(service_id, 'manage_service')) }} {{ boolean_field(item.has_permissions(service_id, 'api_keys')) }} {% call field(align='right') %} - Change + Cancel invitation {% endcall %} {% endcall %} {% endif %} diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py index 4af60ee7c..6a539b7ed 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_should_show_page_for_inviting_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.post(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) From 8e6bd2471d753027146682f2863e6b4a852b541c Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Tue, 1 Mar 2016 17:00:01 +0000 Subject: [PATCH 2/5] Change method to a get. Fix path param in invite_api_client.cancel_invited_user --- app/main/views/manage_users.py | 2 +- app/notify_client/invite_api_client.py | 6 +++--- tests/app/main/views/test_manage_users.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/main/views/manage_users.py b/app/main/views/manage_users.py index 87fa3154d..e1a8f527d 100644 --- a/app/main/views/manage_users.py +++ b/app/main/views/manage_users.py @@ -115,7 +115,7 @@ def delete_user(service_id, user_id): ) -@main.route("/services//cancel-invited-user/", methods=['POST']) +@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) diff --git a/app/notify_client/invite_api_client.py b/app/notify_client/invite_api_client.py index 4e9dc8639..9f7bd9040 100644 --- a/app/notify_client/invite_api_client.py +++ b/app/notify_client/invite_api_client.py @@ -31,6 +31,6 @@ class InviteApiClient(BaseAPIClient): def cancel_invited_user(self, service_id, invited_user_id): data = {'status': 'cancelled'} - resp = self.post(url='/service/{0}/invite/{0}'.format(service_id, invited_user_id), - data = data) - return resp['data'] \ No newline at end of file + resp = self.post(url='/service/{0}/invite/{1}'.format(service_id, invited_user_id), + data=data) + return resp['data'] diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py index 6a539b7ed..0fe95508a 100644 --- a/tests/app/main/views/test_manage_users.py +++ b/tests/app/main/views/test_manage_users.py @@ -114,8 +114,8 @@ def test_cancel_invited_user_cancels_user_invitations(app_, api_user_active, moc invited_user_id = uuid.uuid4() client.login(api_user_active) service_id = uuid.uuid4() - response = client.post(url_for('main.cancel_invited_user', service_id=service_id, - invited_user_id=invited_user_id)) + 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) From 73e5fe29074f52e0b769fd2a6c40669040bef330 Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Tue, 1 Mar 2016 17:56:39 +0000 Subject: [PATCH 3/5] Change cancel_invited_user client to not return anything. --- app/notify_client/invite_api_client.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/notify_client/invite_api_client.py b/app/notify_client/invite_api_client.py index 9f7bd9040..ebfa0fce2 100644 --- a/app/notify_client/invite_api_client.py +++ b/app/notify_client/invite_api_client.py @@ -31,6 +31,5 @@ class InviteApiClient(BaseAPIClient): def cancel_invited_user(self, service_id, invited_user_id): data = {'status': 'cancelled'} - resp = self.post(url='/service/{0}/invite/{1}'.format(service_id, invited_user_id), - data=data) - return resp['data'] + self.post(url='/service/{0}/invite/{1}'.format(service_id, invited_user_id), + data=data) From 65f4506028c5675a83da542efde4f99ce347df1b Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Wed, 2 Mar 2016 09:28:33 +0000 Subject: [PATCH 4/5] Show status of invited user on manage team page. --- app/templates/views/manage-users.html | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/templates/views/manage-users.html b/app/templates/views/manage-users.html index 298965696..161f966ec 100644 --- a/app/templates/views/manage-users.html +++ b/app/templates/views/manage-users.html @@ -43,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') %} - Cancel invitation - {% endcall %} + {% if item.status == 'pending' %} + {% call field(align='right') %} + Cancel invitation + {% endcall %} + {% else %} + {% call field() %} + {{ item.status }} + {% endcall %} + {% endif %} {% endcall %} {% endif %} From 1b64a212ea3d16ca3f7bddaee830892f67a8818f Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Wed, 2 Mar 2016 16:49:16 +0000 Subject: [PATCH 5/5] Change label to exclude the type of message being sent. --- app/templates/views/check.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/views/check.html b/app/templates/views/check.html index d60bef88f..983f13175 100644 --- a/app/templates/views/check.html +++ b/app/templates/views/check.html @@ -49,7 +49,7 @@ {% if upload_result.valid %}
- + Back
{% else %}