Add pages to invite, edit, and delete users

This takes the original prototype version of this page, and, using the same
fake data (ie nothing is wired up):
- adds an invite users page
- adds an edit (and delete) user page

Both these pages allow the user to set another user’s permissions.

This commit adds images for the ticks and crosses, so we have control over their
appearance.
This commit is contained in:
Chris Hill-Scott
2016-02-19 15:02:13 +00:00
parent a86be302ce
commit 17b99c9bf2
23 changed files with 443 additions and 132 deletions

View File

@@ -5,5 +5,5 @@ main = Blueprint('main', __name__)
from app.main.views import (
index, sign_in, sign_out, register, two_factor, verify, sms, add_service,
code_not_received, jobs, dashboard, templates, service_settings, forgot_password,
new_password, styleguide, user_profile, choose_service, api_keys
new_password, styleguide, user_profile, choose_service, api_keys, manage_users
)

View File

@@ -1,7 +1,7 @@
from flask import url_for
from flask import url_for, abort
from app import notifications_api_client
from notifications_python_client.errors import HTTPError
from app.utils import BrowsableItem
from notifications_python_client.errors import HTTPError
def insert_new_service(service_name, user_id):
@@ -29,7 +29,9 @@ def get_service_by_id(id_):
def get_service_by_id_or_404(id_):
try:
return get_service_by_id(id_)
return notifications_api_client.get_service(id_)['data']
except KeyError:
abort(404)
except HTTPError as e:
if e.status_code == 404:
abort(404)

View File

@@ -21,10 +21,10 @@ from app.utils import (
)
def email_address():
def email_address(label='Email address'):
gov_uk_email \
= "(^[^@^\\s]+@[^@^\\.^\\s]+(\\.[^@^\\.^\\s]*)*.gov.uk)"
return EmailField('Email address', validators=[
return EmailField(label, validators=[
Length(min=5, max=255),
DataRequired(message='Email cannot be empty'),
Email(message='Enter a valid email address'),
@@ -96,6 +96,10 @@ class RegisterUserForm(Form):
password = password()
class InviteUserForm(Form):
email_address = email_address('Their email address')
class TwoFactorForm(Form):
def __init__(self, validate_code_func, *args, **kwargs):
'''

View File

@@ -34,63 +34,3 @@ def send_email(service_id):
@login_required
def check_email(service_id):
return render_template('views/check-email.html')
@main.route("/services/<service_id>/manage-users")
@login_required
def manage_users(service_id):
users = [
{
'name': 'Henry Hadlow',
'permission_send_messages': True,
'permission_manage_service': False,
'permission_manage_api_keys': False
},
{
'name': 'Pete Herlihy',
'permission_send_messages': False,
'permission_manage_service': False,
'permission_manage_api_keys': False,
},
{
'name': 'Chris Hill-Scott',
'permission_send_messages': True,
'permission_manage_service': True,
'permission_manage_api_keys': True
},
{
'name': 'Martyn Inglis',
'permission_send_messages': True,
'permission_manage_service': True,
'permission_manage_api_keys': True
}
]
invited_users = [
{
'email_localpart': 'caley.smolska',
'permission_send_messages': True,
'permission_manage_service': False,
'permission_manage_api_keys': False
},
{
'email_localpart': 'ash.stephens',
'permission_send_messages': False,
'permission_manage_service': False,
'permission_manage_api_keys': False
},
{
'email_localpart': 'nicholas.staples',
'permission_send_messages': True,
'permission_manage_service': True,
'permission_manage_api_keys': True
},
{
'email_localpart': 'adam.shimali',
'permission_send_messages': True,
'permission_manage_service': True,
'permission_manage_api_keys': True
}
]
return render_template('views/manage-users.html', service_id=service_id, users=users, invited_users=invited_users)

View File

@@ -0,0 +1,141 @@
from flask import (
request,
render_template,
redirect,
abort,
url_for,
flash
)
from flask_login import login_required, current_user
from app.main import main
from app.main.dao import users_dao
from app.main.forms import InviteUserForm
from app.main.dao.services_dao import get_service_by_id_or_404
from app import user_api_client
fake_users = [
{
'name': 'Henry Hadlow',
'email_localpart': 'henry.hadlow',
'permission_send_messages': True,
'permission_manage_service': False,
'permission_manage_api_keys': False,
'active': True
},
{
'name': 'Pete Herlihy',
'email_localpart': 'pete.herlihy',
'permission_send_messages': False,
'permission_manage_service': False,
'permission_manage_api_keys': False,
'active': True
},
{
'name': 'Chris Hill-Scott',
'email_localpart': 'chris.hill-scott',
'permission_send_messages': True,
'permission_manage_service': True,
'permission_manage_api_keys': True,
'active': True
},
{
'name': 'Martyn Inglis',
'email_localpart': 'martyn.inglis',
'permission_send_messages': True,
'permission_manage_service': True,
'permission_manage_api_keys': True,
'active': True
},
{
'email_localpart': 'caley.smolska',
'permission_send_messages': True,
'permission_manage_service': False,
'permission_manage_api_keys': False,
'active': False
},
{
'email_localpart': 'ash.stephens',
'permission_send_messages': False,
'permission_manage_service': False,
'permission_manage_api_keys': False,
'active': False
}
]
@main.route("/services/<service_id>/users")
@login_required
def manage_users(service_id):
return render_template(
'views/manage-users.html',
service_id=service_id,
users=[
dict(id=user_id, **user) for (user_id, user) in enumerate(fake_users) if user['active']
],
invited_users=[
dict(id=user_id, **user) for (user_id, user) in enumerate(fake_users) if not user['active']
]
)
@main.route("/services/<service_id>/users/invite", methods=['GET', 'POST'])
@login_required
def invite_user(service_id):
form = InviteUserForm()
if form.validate_on_submit():
flash('Invite sent to {}'.format(form.email_address.data), 'default_with_tick')
return redirect(url_for('.manage_users', service_id=service_id))
return render_template(
'views/invite-user.html',
user={},
service=get_service_by_id_or_404(service_id),
service_id=service_id,
form=form
)
@main.route("/services/<service_id>/users/<user_id>", methods=['GET', 'POST'])
@login_required
def edit_user(service_id, user_id):
if request.method == 'POST':
return redirect(url_for('.manage_users', service_id=service_id))
return render_template(
'views/invite-user.html',
user=fake_users[int(user_id)],
user_id=user_id,
service=get_service_by_id_or_404(service_id),
service_id=service_id
)
@main.route("/services/<service_id>/users/<user_id>/delete", methods=['GET', 'POST'])
@login_required
def delete_user(service_id, user_id):
if request.method == 'POST':
return redirect(url_for('.manage_users', service_id=service_id))
user = fake_users[int(user_id)]
flash(
'Are you sure you want to delete {}s account?'.format(user.get('name') or user['email_localpart']),
'delete'
)
return render_template(
'views/invite-user.html',
user=user,
user_id=user_id,
service=get_service_by_id_or_404(service_id),
service_id=service_id
)