diff --git a/app/auth/forms.py b/app/auth/forms.py index dad117d..a540495 100644 --- a/app/auth/forms.py +++ b/app/auth/forms.py @@ -1,6 +1,8 @@ from flask_wtf import FlaskForm from wtforms import StringField, PasswordField, BooleanField, SubmitField -from wtforms.validators import DataRequired, Length, Email +from wtforms.validators import DataRequired, Length, Email, Regexp, EqualTo +from wtforms import ValidationError +from ..models import User class LoginForm(FlaskForm): @@ -9,3 +11,25 @@ class LoginForm(FlaskForm): password = PasswordField('Password', validators=[DataRequired()]) remember_me = BooleanField('Keep me logged in') submit = SubmitField('Log in') + + +class RegistrationForm(FlaskForm): + 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).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.') diff --git a/app/auth/views.py b/app/auth/views.py index 07c0ffe..e892cd2 100644 --- a/app/auth/views.py +++ b/app/auth/views.py @@ -1,8 +1,9 @@ from flask import render_template, redirect, request, url_for, flash from flask_login import login_user, logout_user, login_required from . import auth +from .. import db from ..models import User -from .forms import LoginForm +from .forms import LoginForm, RegistrationForm @auth.route('/login', methods=['GET', 'POST']) @@ -26,3 +27,17 @@ def logout(): logout_user() flash('You have been logged out.') return redirect(url_for('main.index')) + + +@auth.route('/register', methods=['GET', 'POST']) +def register(): + form = RegistrationForm() + if form.validate_on_submit(): + user = User(email=form.email.data, + username=form.username.data, + password=form.password.data) + db.session.add(user) + db.session.commit() + flash('You can now login.') + return redirect(url_for('auth.login')) + return render_template('auth/register.html', form=form) \ No newline at end of file diff --git a/app/templates/auth/login.html b/app/templates/auth/login.html index 476cff5..449739f 100644 --- a/app/templates/auth/login.html +++ b/app/templates/auth/login.html @@ -9,5 +9,12 @@
{{ wtf.quick_form(form) }} +
+

+ New user? + + Click here to register + +

{% endblock %} diff --git a/app/templates/auth/register.html b/app/templates/auth/register.html new file mode 100644 index 0000000..eb14df9 --- /dev/null +++ b/app/templates/auth/register.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% import "bootstrap/wtf.html" as wtf %} + +{% block title %}Flasky - Register{% endblock %} + +{% block page_content %} + +
+ {{ wtf.quick_form(form) }} +
+{% endblock %} diff --git a/app/templates/index.html b/app/templates/index.html index 6333217..b1e8b10 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -4,6 +4,8 @@ {% block page_content %} {% endblock %} \ No newline at end of file