mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-05-05 16:38:59 -04:00
Merge branch 'master' into error-handling
Conflicts: app/main/views/invites.py
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
from flask import url_for, abort
|
||||
from flask import url_for
|
||||
from app import notifications_api_client
|
||||
from app.utils import BrowsableItem
|
||||
from notifications_python_client.errors import HTTPError
|
||||
|
||||
|
||||
def insert_service_template(name, type_, content, service_id, subject=None):
|
||||
|
||||
@@ -98,13 +98,26 @@ class RegisterUserFromInviteForm(Form):
|
||||
email_address = HiddenField('email_address')
|
||||
|
||||
|
||||
# WTF forms does not give a handy way to customise error messages for
|
||||
# radio button fields so just overriding the default here for use
|
||||
# in permissions form.
|
||||
class CustomRadioField(RadioField):
|
||||
|
||||
def pre_validate(self, form):
|
||||
for v, _ in self.choices:
|
||||
if self.data == v:
|
||||
break
|
||||
else:
|
||||
raise ValueError(self.gettext('Choose yes or no'))
|
||||
|
||||
|
||||
class PermisisonsForm(Form):
|
||||
|
||||
# TODO fix this Radio field so we are not having to test for yes or no rather
|
||||
# use operator equality.
|
||||
send_messages = RadioField("Send messages", choices=[('yes', 'yes'), ('no', 'no')])
|
||||
manage_service = RadioField("Manage service", choices=[('yes', 'yes'), ('no', 'no')])
|
||||
manage_api_keys = RadioField("Manage API keys", choices=[('yes', 'yes'), ('no', 'no')])
|
||||
send_messages = CustomRadioField("Send messages", choices=[('yes', 'yes'), ('no', 'no')])
|
||||
manage_service = CustomRadioField("Manage service", choices=[('yes', 'yes'), ('no', 'no')])
|
||||
manage_api_keys = CustomRadioField("Manage API keys", choices=[('yes', 'yes'), ('no', 'no')])
|
||||
|
||||
|
||||
class InviteUserForm(PermisisonsForm):
|
||||
@@ -192,7 +205,24 @@ class AddServiceForm(Form):
|
||||
|
||||
|
||||
class ServiceNameForm(Form):
|
||||
name = StringField(u'New name')
|
||||
def __init__(self, names_func, *args, **kwargs):
|
||||
"""
|
||||
Keyword arguments:
|
||||
names_func -- Returns a list of unique service_names already registered
|
||||
on the system.
|
||||
"""
|
||||
self._names_func = names_func
|
||||
super(ServiceNameForm, self).__init__(*args, **kwargs)
|
||||
|
||||
name = StringField(
|
||||
u'New name',
|
||||
validators=[
|
||||
DataRequired(message='Service name can’t be empty')
|
||||
])
|
||||
|
||||
def validate_name(self, a):
|
||||
if a.data in self._names_func():
|
||||
raise ValidationError('This service name is already in use')
|
||||
|
||||
|
||||
class ConfirmPasswordForm(Form):
|
||||
|
||||
@@ -2,8 +2,8 @@ from flask import (
|
||||
redirect,
|
||||
url_for,
|
||||
session,
|
||||
render_template
|
||||
)
|
||||
flash,
|
||||
render_template)
|
||||
|
||||
|
||||
from app.main import main
|
||||
@@ -17,6 +17,7 @@ from app import (
|
||||
@main.route("/invitation/<token>")
|
||||
def accept_invite(token):
|
||||
invited_user = invite_api_client.check_token(token)
|
||||
|
||||
if invited_user.status == 'cancelled':
|
||||
from_user = user_api_client.get_user(invited_user.from_user)
|
||||
service = get_service_by_id_or_404(invited_user.service)
|
||||
@@ -24,6 +25,11 @@ def accept_invite(token):
|
||||
from_user=from_user.name,
|
||||
service_name=service['name'])
|
||||
|
||||
if invited_user.status == 'accepted':
|
||||
session.pop('invited_user', None)
|
||||
flash('You have already accepted this invitation', 'default')
|
||||
return redirect(url_for('main.service_dashboard', service_id=invited_user.service))
|
||||
|
||||
existing_user = user_api_client.get_user_by_email(invited_user.email_address)
|
||||
session['invited_user'] = invited_user.serialize()
|
||||
|
||||
|
||||
@@ -100,28 +100,6 @@ def edit_user_permissions(service_id, user_id):
|
||||
)
|
||||
|
||||
|
||||
@main.route("/services/<service_id>/users/<user_id>/delete", methods=['GET', 'POST'])
|
||||
@login_required
|
||||
@user_has_permissions('manage_users', 'manage_templates', 'manage_settings')
|
||||
def delete_user(service_id, user_id):
|
||||
user = user_api_client.get_user(user_id)
|
||||
service = get_service_by_id(service_id)
|
||||
|
||||
if request.method == 'POST':
|
||||
return redirect(url_for('.manage_users', service_id=service_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,
|
||||
service_id=service_id
|
||||
)
|
||||
|
||||
|
||||
@main.route("/services/<service_id>/cancel-invited-user/<invited_user_id>", methods=['GET'])
|
||||
@user_has_permissions('manage_users', 'manage_templates', 'manage_settings')
|
||||
def cancel_invited_user(service_id, invited_user_id):
|
||||
|
||||
@@ -28,9 +28,14 @@ def register():
|
||||
|
||||
form = RegisterUserForm()
|
||||
if form.validate_on_submit():
|
||||
return _do_registration(form)
|
||||
else:
|
||||
return render_template('views/register.html', form=form)
|
||||
registered = _do_registration(form)
|
||||
if registered:
|
||||
return redirect(url_for('main.verify'))
|
||||
else:
|
||||
flash('There was an error registering your account')
|
||||
return render_template('views/register.html', form=form), 400
|
||||
|
||||
return render_template('views/register.html', form=form)
|
||||
|
||||
|
||||
@main.route('/register-from-invite', methods=['GET', 'POST'])
|
||||
@@ -44,7 +49,11 @@ def register_from_invite():
|
||||
if form.validate_on_submit():
|
||||
if form.service.data != invited_user['service'] or form.email_address.data != invited_user['email_address']:
|
||||
abort(400)
|
||||
return _do_registration(form)
|
||||
registered = _do_registration(form)
|
||||
if registered:
|
||||
return redirect(url_for('main.verify'))
|
||||
else:
|
||||
flash('There was an error registering your account')
|
||||
|
||||
form.service.data = invited_user['service']
|
||||
form.email_address.data = invited_user['email_address']
|
||||
@@ -68,6 +77,6 @@ def _do_registration(form, service=None):
|
||||
users_dao.send_verify_code(user.id, 'email', user.email_address)
|
||||
session['expiry_date'] = str(datetime.now() + timedelta(hours=1))
|
||||
session['user_details'] = {"email": user.email_address, "id": user.id}
|
||||
return redirect(url_for('main.verify'))
|
||||
return True
|
||||
else:
|
||||
flash('There was an error registering your account')
|
||||
return False
|
||||
|
||||
@@ -12,11 +12,13 @@ from flask_login import (
|
||||
login_required,
|
||||
current_user
|
||||
)
|
||||
from notifications_python_client import HTTPError
|
||||
|
||||
from app.main.dao.services_dao import (
|
||||
get_service_by_id,
|
||||
delete_service,
|
||||
update_service
|
||||
update_service,
|
||||
find_all_service_names
|
||||
)
|
||||
|
||||
from app.main import main
|
||||
@@ -44,7 +46,7 @@ def service_settings(service_id):
|
||||
def service_name_change(service_id):
|
||||
service = get_service_by_id(service_id)['data']
|
||||
|
||||
form = ServiceNameForm()
|
||||
form = ServiceNameForm(find_all_service_names)
|
||||
|
||||
if form.validate_on_submit():
|
||||
session['service_name_change'] = form.name.data
|
||||
@@ -70,10 +72,20 @@ def service_name_change_confirm(service_id):
|
||||
|
||||
if form.validate_on_submit():
|
||||
service['name'] = session['service_name_change']
|
||||
update_service(service)
|
||||
session['service_name'] = service['name']
|
||||
session.pop('service_name_change')
|
||||
return redirect(url_for('.service_settings', service_id=service_id))
|
||||
try:
|
||||
update_service(service)
|
||||
except HTTPError as e:
|
||||
error_msg = "Duplicate service name '{}'".format(session['service_name_change'])
|
||||
if e.status_code == 400 and error_msg in e.message['name']:
|
||||
# Redirect the user back to the change service name screen
|
||||
flash('This service name is already in use', 'error')
|
||||
return redirect(url_for('main.service_name_change', service_id=service_id))
|
||||
else:
|
||||
raise e
|
||||
else:
|
||||
session['service_name'] = service['name']
|
||||
session.pop('service_name_change')
|
||||
return redirect(url_for('.service_settings', service_id=service_id))
|
||||
return render_template(
|
||||
'views/service-settings/confirm.html',
|
||||
heading='Change your service name',
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from flask import render_template, current_app, abort
|
||||
from flask_wtf import Form
|
||||
from wtforms import StringField, PasswordField, TextAreaField, FileField, validators
|
||||
from app.main.forms import CustomRadioField
|
||||
from utils.template import Template
|
||||
from app.main import main
|
||||
|
||||
@@ -17,11 +18,14 @@ def styleguide():
|
||||
code = StringField('Enter code')
|
||||
message = TextAreaField(u'Message')
|
||||
file_upload = FileField('Upload a CSV file to add your recipients’ details')
|
||||
manage_service = CustomRadioField('Manage service', choices=[('yes', 'yes'), ('no', 'no')])
|
||||
manage_templates = CustomRadioField('Manage templates', choices=[('yes', 'yes'), ('no', 'no')])
|
||||
|
||||
sms = "Your vehicle tax for ((registration number)) is due on ((date)). Renew online at www.gov.uk/vehicle-tax"
|
||||
|
||||
form = FormExamples()
|
||||
form.message.data = sms
|
||||
form.manage_service.data = 'yes'
|
||||
form.validate()
|
||||
|
||||
template = Template({'content': sms})
|
||||
|
||||
Reference in New Issue
Block a user