Update register view form and template.

This commit is contained in:
Nicholas Staples
2016-01-05 12:41:20 +00:00
parent 99fe83503c
commit 7693ba8a18
6 changed files with 54 additions and 45 deletions

View File

@@ -14,6 +14,8 @@ def insert_user(user):
db.session.commit()
# TODO Would be better to have a generic get and update for user
# something that replicates the sql functionality.
def get_user_by_id(id):
return User.query.filter_by(id=id).first()

View File

@@ -26,6 +26,12 @@ verify_code = '^\d{5}$'
class RegisterUserForm(Form):
def __init__(self, existing_email_addresses, existing_mobile_numbers, *args, **kwargs):
self.existing_emails = existing_email_addresses
self.existing_mobiles = existing_mobile_numbers
super(RegisterUserForm, self).__init__(*args, **kwargs)
name = StringField('Full name',
validators=[DataRequired(message='Name can not be empty')])
email_address = StringField('Email address', validators=[
@@ -42,6 +48,16 @@ class RegisterUserForm(Form):
Length(10, 255, message='Password must be at least 10 characters'),
Blacklist(message='That password is blacklisted, too common')])
def validate_email_address(self, field):
# Validate email address is unique.
if field.data in self.existing_emails:
raise ValidationError('Email address already exists')
def validate_mobile_number(self, field):
# Validate mobile number is unique
if field.data in self.existing_mobiles:
raise ValidationError('Mobile number already exists')
class TwoFactorForm(Form):
sms_code = StringField('sms code', validators=[DataRequired(message='Please enter your code'),

View File

@@ -12,14 +12,19 @@ from app.main.views import send_sms_code, send_email_code
from app.models import User
@main.route("/register", methods=['GET'])
def render_register():
return render_template('views/register.html', form=RegisterUserForm())
@main.route('/register', methods=['POST'])
# TODO how do we handle duplicate unverifed email addresses?
# malicious or otherwise.
@main.route('/register', methods=['GET', 'POST'])
def process_register():
form = RegisterUserForm()
try:
existing_emails, existing_mobiles = zip(
*[(x.email_address, x.mobile_number) for x in
users_dao.get_all_users()])
except ValueError:
# Value error is raised if the db is empty.
existing_emails, existing_mobiles = [], []
form = RegisterUserForm(existing_emails, existing_mobiles)
if form.validate_on_submit():
user = User(name=form.name.data,
@@ -28,16 +33,16 @@ def process_register():
password=form.password.data,
created_at=datetime.now(),
role_id=1)
try:
users_dao.insert_user(user)
send_sms_code(user_id=user.id, mobile_number=form.mobile_number.data)
send_email_code(user_id=user.id, email=form.email_address.data)
session['expiry_date'] = str(datetime.now() + timedelta(hours=1))
session['user_id'] = user.id
except AdminApiClientException as e:
return jsonify(admin_api_client_error=e.value)
except SQLAlchemyError:
return jsonify(database_error='encountered database error'), 400
else:
return jsonify(form.errors), 400
return redirect('/verify')
users_dao.insert_user(user)
# TODO possibly there should be some exception handling
# for sending sms and email codes.
# How do we report to the user there is a problem with
# sending codes apart from service unavailable?
# at the moment i believe http 500 is fine.
send_sms_code(user_id=user.id, mobile_number=form.mobile_number.data)
send_email_code(user_id=user.id, email=form.email_address.data)
session['expiry_date'] = str(datetime.now() + timedelta(hours=1))
session['user_id'] = user.id
return redirect('/verify')
return render_template('views/register.html', form=form)