diff --git a/app/auth/forms.py b/app/auth/forms.py index 43a64679f60c1250d310e0435b7a53008e896d2b..3a71b0950ad43cd302b8a43a40a4ec3e1feadf9b 100644 --- a/app/auth/forms.py +++ b/app/auth/forms.py @@ -14,7 +14,25 @@ class LoginForm(FlaskForm): class RegistrationForm(FlaskForm): - email = StringField('Email', validators=[DataRequired(), Length(1, 64), Email()]) + email = StringField('Email', validators=[DataRequired(), Length(1, 64), + Email()]) + username = StringField('Username', validators=[ + DataRequired(), Length(1, 64), + Regexp('^[A-Za-z][A-Za-z0-9_.]*$', 0, + 'Usernames must have only letters, numbers, dots or ' + 'underscores')]) + password = PasswordField('Password', validators=[ + DataRequired(), EqualTo('password2', message='Passwords must match.')]) + password2 = PasswordField('Confirm password', validators=[DataRequired()]) + submit = SubmitField('Register') + + def validate_email(self, field): + if User.query.filter_by(email=field.data.lower()).first(): + raise ValidationError('Email already registered.') + + def validate_username(self, field): + if User.query.filter_by(username=field.data).first(): + raise ValidationError('Username already in use.') class PasswordResetRequestForm(FlaskForm): diff --git a/app/templates/auth/login.html.j2 b/app/templates/auth/login.html.j2 index 325e99c4a119eb4012becdd978705e1e0a15806c..3c9fdf4aed71c708c974e3ecc5fdda95640e62a8 100644 --- a/app/templates/auth/login.html.j2 +++ b/app/templates/auth/login.html.j2 @@ -10,9 +10,9 @@ <div class="card-content"> <p>Sign in into an exisiting account or register a new one!</p> <br> - <div class="card-action"> - <a class="btn" href="{{url_for('auth.register')}}">Register</a> - </div> + <div class="card-action"> + <a class="btn" href="{{url_for('auth.register')}}">Register</a> + </div> </div> </div> </div> diff --git a/app/templates/auth/register.html.j2 b/app/templates/auth/register.html.j2 index 6a85c9a9e4b5b9ce079279b8c5722b6020be9f56..52070a1a19922c3362c230d839be095e5338f1e2 100644 --- a/app/templates/auth/register.html.j2 +++ b/app/templates/auth/register.html.j2 @@ -2,33 +2,47 @@ {% block page_content %} <div class="col s12"> - <div class="row"> - <div class="card medium"> - <div class="card-content"> - <span class="card-title">Register</span> - <form> - <div class="input-field col s6"> - <input id="first-name" type="text" class="validate"> - <label for="first-name">First Name</label> - </div> - <div class="input-field col s6"> - <input id="last-name" type="text" class="validate"> - <label for="last-name">Last Name</label> - </div> - <div class="row"> - <div class="input-field col s12"> - <input id="password" type="password" class="validate"> - <label for="password">Password</label> - </div> - </div> - <div class="row"> - <div class="input-field col s12"> - <input id="email" type="email" class="validate"> - <label for="email">Email</label> - </div> - </div> - </form> - </div> + <div class="card large"> + <div class="card-content"> + <span class="card-title">Register</span> + <form method="POST"> + {{ form.hidden_tag() }} + <div class="input-field"> + <i class="material-icons prefix">account_circle</i> + {{ form.username(class='validate') }} + {{ form.username.label }} + {% for error in form.username.errors %} + <span class="helper-text" style="color:red;">{{ error }}</span> + {% endfor %} + </div> + <div class="input-field"> + <i class="material-icons prefix">vpn_key</i> + {{ form.password(class='validate') }} + {{ form.password.label }} + {% for error in form.password.errors %} + <span class="helper-text" style="color:red;">{{ error }}</span> + {% endfor %} + </div> + <div class="input-field"> + <i class="material-icons prefix">vpn_key</i> + {{ form.password2(class='validate') }} + {{ form.password2.label }} + {% for error in form.password2.errors %} + <span class="helper-text" style="color:red;">{{ error }}</span> + {% endfor %} + </div> + <div class="input-field "> + <i class="material-icons prefix">email</i> + {{ form.email(class='validate', type='email') }} + {{ form.email.label }} + {% for error in form.email.errors %} + <span class="helper-text" style="color:red;">{{ error }}</span> + {% endfor %} + </div> + <div class="card-action"> + {{ form.submit(class='btn right') }} + </div> + </form> </div> </div> </div> diff --git a/app/templates/base.html.j2 b/app/templates/base.html.j2 index 46aa1d10b12676854393c9d2785a6795810d6619..40601f1352b4ee78abe27a2a80fed7873f570a14 100644 --- a/app/templates/base.html.j2 +++ b/app/templates/base.html.j2 @@ -25,6 +25,7 @@ <li><a href="{{ url_for('auth.logout') }}"><i class="material-icons">chevron_left</i>Log out</a></li> {% else %} <li><a href="{{ url_for('auth.login') }}"><i class="material-icons">chevron_right</i>Log in</a></li> + <li><a href="{{ url_for('auth.register') }}"><i class="material-icons">chevron_right</i>Register</a></li> {% endif %} </ul> <div id="nav-settings-dropdown" class="dropdown-content grey-text text-darken-4"> diff --git a/data_dev.sqlite b/data_dev.sqlite index 531008fb53485717ae2e3a339dedeebc9fc1eb8d..75d6c1549dd45cb57958eab66cc0bea1a30ac0cc 100644 Binary files a/data_dev.sqlite and b/data_dev.sqlite differ