mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-24 16:24:08 -04:00
[WIP] Start of user accepting invite.
This commit only deals with acceptance by users who are already in system. Changed invite client to return invited user objects instead of dictionaries. Added commented out test. fixed up fixtures to return invited user object for invites
This commit is contained in:
@@ -3,7 +3,24 @@ from flask import Blueprint
|
||||
main = Blueprint('main', __name__)
|
||||
|
||||
from app.main.views import (
|
||||
index, sign_in, sign_out, register, two_factor, verify, send, add_service,
|
||||
code_not_received, jobs, dashboard, templates, service_settings, forgot_password,
|
||||
new_password, styleguide, user_profile, choose_service, api_keys, manage_users
|
||||
index,
|
||||
sign_in,
|
||||
sign_out,
|
||||
register,
|
||||
two_factor,
|
||||
verify,
|
||||
send,
|
||||
add_service,
|
||||
code_not_received,
|
||||
jobs, dashboard,
|
||||
templates,
|
||||
service_settings,
|
||||
forgot_password,
|
||||
new_password,
|
||||
styleguide,
|
||||
user_profile,
|
||||
choose_service,
|
||||
api_keys,
|
||||
manage_users,
|
||||
invites
|
||||
)
|
||||
|
||||
34
app/main/views/invites.py
Normal file
34
app/main/views/invites.py
Normal file
@@ -0,0 +1,34 @@
|
||||
from flask import (
|
||||
redirect,
|
||||
url_for,
|
||||
abort
|
||||
)
|
||||
|
||||
from notifications_python_client.errors import HTTPError
|
||||
|
||||
from app.main import main
|
||||
from app import (
|
||||
invite_api_client,
|
||||
user_api_client
|
||||
)
|
||||
|
||||
|
||||
@main.route("/invitation/<token>")
|
||||
def accept_invite(token):
|
||||
try:
|
||||
invited_user = invite_api_client.accept_invite(token)
|
||||
existing_user = user_api_client.get_user_by_email(invited_user['email_address'])
|
||||
|
||||
if existing_user:
|
||||
user_api_client.add_user_to_service(invited_user['service'],
|
||||
existing_user.id,
|
||||
invited_user)
|
||||
return redirect(url_for('main.service_dashboard', service_id=invited_user['service']))
|
||||
else:
|
||||
# TODO implement registration flow for new users
|
||||
abort(404)
|
||||
except HTTPError as e:
|
||||
if e.status_code == 404:
|
||||
abort(404)
|
||||
else:
|
||||
raise e
|
||||
@@ -58,8 +58,8 @@ def invite_user(service_id):
|
||||
email_address = form.email_address.data
|
||||
permissions = _get_permissions(request.form)
|
||||
try:
|
||||
resp = invite_api_client.create_invite(current_user.id, service_id, email_address, permissions)
|
||||
flash('Invite sent to {}'.format(resp['email_address']), 'default_with_tick')
|
||||
invited_user = invite_api_client.create_invite(current_user.id, service_id, email_address, permissions)
|
||||
flash('Invite sent to {}'.format(invited_user.email_address), 'default_with_tick')
|
||||
return redirect(url_for('.manage_users', service_id=service_id))
|
||||
|
||||
except HTTPError as e:
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
|
||||
from notifications_python_client.base import BaseAPIClient
|
||||
from app.notify_client.models import User
|
||||
from app.notify_client.models import InvitedUser
|
||||
|
||||
|
||||
class InviteApiClient(BaseAPIClient):
|
||||
@@ -22,9 +21,23 @@ class InviteApiClient(BaseAPIClient):
|
||||
'permissions': permissions
|
||||
}
|
||||
resp = self.post(url='/service/{}/invite'.format(service_id), data=data)
|
||||
return resp['data']
|
||||
return InvitedUser(**resp['data'])
|
||||
|
||||
def get_invites_for_service(self, service_id):
|
||||
endpoint = '/service/{}/invite'.format(service_id)
|
||||
resp = self.get(endpoint)
|
||||
return [User(data) for data in resp['data']]
|
||||
invites = resp['data']
|
||||
invited_users = _get_invited_users(invites)
|
||||
return invited_users
|
||||
|
||||
def accept_invite(self, token):
|
||||
resp = self.get(url='/invite/{}'.format(token))
|
||||
return InvitedUser(**resp['data'])
|
||||
|
||||
|
||||
def _get_invited_users(invites):
|
||||
invited_users = []
|
||||
for invite in invites:
|
||||
invited_user = InvitedUser(**invite)
|
||||
invited_users.append(invited_user)
|
||||
return invited_users
|
||||
|
||||
@@ -110,3 +110,18 @@ class User(UserMixin):
|
||||
|
||||
def set_password(self, pwd):
|
||||
self._password = pwd
|
||||
|
||||
|
||||
class InvitedUser(object):
|
||||
|
||||
def __init__(self, id, service, from_user, email_address, permissions, status, created_at):
|
||||
self.id = id
|
||||
self.service = str(service)
|
||||
self.from_user = from_user
|
||||
self.email_address = email_address
|
||||
self.permissions = permissions.split(',')
|
||||
self.status = status
|
||||
self.created_at = created_at
|
||||
|
||||
def has_permissions(self, permission):
|
||||
return permission in self.permissions
|
||||
|
||||
@@ -85,3 +85,8 @@ class UserApiClient(BaseAPIClient):
|
||||
endpoint = '/service/{}/users'.format(service_id)
|
||||
resp = self.get(endpoint)
|
||||
return [User(data) for data in resp['data']]
|
||||
|
||||
def add_user_to_service(self, service_id, user_id, invited_user):
|
||||
endpoint = '/service/{}/users/{}'.format(service_id, user_id)
|
||||
resp = self.post(endpoint, data=invited_user)
|
||||
return User(resp['data'], max_failed_login_count=self.max_failed_login_count)
|
||||
|
||||
@@ -43,9 +43,9 @@ Manage users – GOV.UK Notify
|
||||
{% call field() %}
|
||||
{{ item.email_address }}
|
||||
{% endcall %}
|
||||
{{ 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, 'api_keys')) }}
|
||||
{{ boolean_field(item.has_permissions('send_messages')) }}
|
||||
{{ boolean_field(item.has_permissions('manage_service')) }}
|
||||
{{ boolean_field(item.has_permissions('api_keys')) }}
|
||||
{% call field(align='right') %}
|
||||
<a href="{{ url_for('.edit_user', service_id=service_id, user_id=item.id)}}">Change</a>
|
||||
{% endcall %}
|
||||
|
||||
Reference in New Issue
Block a user