diff --git a/forms/login.py b/forms/login.py index b090bcf..8fb2174 100644 --- a/forms/login.py +++ b/forms/login.py @@ -6,14 +6,39 @@ from objects import glob class LoginForm(Form): email = StringField("Email", [ validators.DataRequired(), - validators.Length(min=6, max=64) + validators.Length(min=6, max=254) ]) password = PasswordField("Password", [ validators.DataRequired(), - validators.Length(min=4) + validators.Length(min=4, max=127) ]) +class RegisterForm(Form): + email = StringField("Email", [ + validators.DataRequired(), + validators.Length(min=6, max=254) + ]) + + password = PasswordField("Password", [ + validators.DataRequired(), + validators.Length(min=4, max=127), + validators.EqualTo("confirm_password", message = "Passwords must match") + ]) + confirm_password = PasswordField("Repeat Password") + + firstname = StringField("Firstname", [ + validators.DataRequired(), + validators.Length(min=2, max=30) + ]) + + surname = StringField("Surname", [ + validators.DataRequired(), + validators.Length(min=2, max=30) + ]) + + accept_tos = BooleanField("I accept the TOS", [validators.DataRequired()]) + class User(UserMixin): id = -1 email = "" @@ -43,3 +68,16 @@ class User(UserMixin): raise Exception("Invalid login") self.id, self.email, self.password, self.firstname, self.surname = user + +def register_account(email, password, firstname, surname): + conn = glob.get_sql_connection() + cur = conn.cursor() + + cur.execute(""" + INSERT INTO + Bruker (Epost, Passord, Fornavn, Etternavn) + VALUES (%s, %s, %s, %s); + """, (email, password, firstname, surname)) + + conn.commit() + cur.close() diff --git a/routes.py b/routes.py index c2e58cf..c8c3fec 100644 --- a/routes.py +++ b/routes.py @@ -2,7 +2,7 @@ from flask import render_template, url_for, request, redirect, flash, abort from wtforms import Form, BooleanField, StringField, PasswordField, validators import flask_login -from forms.login import LoginForm, User +from forms.login import LoginForm, RegisterForm, User, register_account from objects import glob # Global sharing of python objects in a manageable way @@ -40,6 +40,24 @@ def login(): return redirect(url_for("dashboard")) return render_template("login.html", form=form) +@glob.app.route("/register", methods = ["GET", "POST"]) +def register(): + if flask_login.current_user.is_authenticated: + flash("Already logged in", "info") + return redirect(url_for("dashboard")) + + form = RegisterForm(request.form) + if request.method == "POST" and form.validate(): + try: + register_account(form.email.data, form.password.data, form.firstname.data, form.surname.data) + except Exception as e: + flash(str(e), "danger") + return render_template("register.html", form=form) + + flash("User registered", "success") + return redirect(url_for("login")) + return render_template("register.html", form=form) + @glob.app.route("/logout") @flask_login.login_required def logout(): diff --git a/templates/login.html b/templates/login.html index d19e469..5bc83c8 100644 --- a/templates/login.html +++ b/templates/login.html @@ -8,8 +8,11 @@
-
+
diff --git a/templates/register.html b/templates/register.html new file mode 100644 index 0000000..a0462e7 --- /dev/null +++ b/templates/register.html @@ -0,0 +1,55 @@ +{% set title = "Register" %} + +{% extends "layout/bootstrap.html" %} + +{% block content %} +{% macro render_field(field) %} +
{{ field.label }} +
{{ field(**kwargs)|safe }} + {% if field.errors %} +
    + {% for error in field.errors %} +
  • {{ error }}
  • + {% endfor %} +
+ {% endif %} +
+{% endmacro %} + +
+
+
+
+
+

Register

+
+
+
+
+
+ {{ render_field(form.email) }} + {{ render_field(form.password) }} + {{ render_field(form.confirm_password) }} + {{ render_field(form.firstname) }} + {{ render_field(form.surname) }} + {{ render_field(form.accept_tos) }} +
+ +
+
+
+
+
+
+
+ +{% endblock %} \ No newline at end of file