Service name uniqueness handled in all cases and tests passing.

This commit is contained in:
Nicholas Staples
2016-03-10 14:29:31 +00:00
parent adf08fd00e
commit 6ea8491b39
4 changed files with 106 additions and 9 deletions

View File

@@ -205,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 cant 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):

View File

@@ -18,7 +18,8 @@ from notifications_python_client.errors 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
@@ -57,7 +58,7 @@ def service_name_change(service_id):
else:
raise e
form = ServiceNameForm()
form = ServiceNameForm(find_all_service_names)
if form.validate_on_submit():
session['service_name_change'] = form.name.data
@@ -89,10 +90,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',