From f13e18a92705bf7798b6deb28e8f0f30be9bffdc Mon Sep 17 00:00:00 2001 From: Sunpy Date: Fri, 26 Apr 2019 02:28:27 +0100 Subject: [PATCH] Basic login --- forms/login.py | 24 ++++++++++ main.py | 1 + requirements.txt | 1 + routes.py | 62 ++++++++++++++++++++++--- static/css/custom.css | 3 +- templates/layout/includes/side_nav.html | 4 +- templates/login.html | 39 +++++++++++++++- templates/modules/calendar.html | 21 +-------- 8 files changed, 125 insertions(+), 30 deletions(-) create mode 100644 forms/login.py diff --git a/forms/login.py b/forms/login.py new file mode 100644 index 0000000..bf9bd0a --- /dev/null +++ b/forms/login.py @@ -0,0 +1,24 @@ +from wtforms import Form, BooleanField, StringField, PasswordField, validators +from flask_login import UserMixin + +class LoginForm(Form): + email = StringField("Email", [ + validators.DataRequired(), + validators.Length(min=6, max=64) + ]) + + password = PasswordField("Password", [ + validators.DataRequired(), + validators.Length(min=6) + ]) + +class User(UserMixin): + def __init__(self, uuid): + self.id = uuid + + """ + self.name = name + self.email = email + self.password = password + """ + diff --git a/main.py b/main.py index 8c09a6f..2d65b9b 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ from flask import Flask, url_for, request from objects import glob # Global sharing of python objects in a manageable way glob.app = Flask(__name__) +glob.app.secret_key = "E2FGrJXLtOxPh70Q" import routes # All flask app routes import filters # All flask app filters diff --git a/requirements.txt b/requirements.txt index 44e7a67..7c8f664 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ Flask>=1.0.2 Flask-WTF>=0.14.2 +flask_login>=0.4.1 \ No newline at end of file diff --git a/routes.py b/routes.py index 269a169..9297aff 100644 --- a/routes.py +++ b/routes.py @@ -1,16 +1,64 @@ -from flask import render_template, url_for, request +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 objects import glob # Global sharing of python objects in a manageable way +login_manager = flask_login.LoginManager() +login_manager.init_app(glob.app) +login_manager.login_view = "login" + +logged_in_users = [] + @glob.app.route("/") @glob.app.route("/home") @glob.app.route("/dashboard") -def home(): +@flask_login.login_required +def dashboard(): return render_template("pages/dashboard.html") @glob.app.route("/login", methods = ["GET", "POST"]) -def serve_login(): - if request.method == "POST": - return "TODO: Login handle", 501 - return render_template("login.html") +def login(): + if flask_login.current_user.is_authenticated: + flash("Already logged in") + return redirect(url_for("dashboard")) + + form = LoginForm(request.form) + if request.method == "POST" and form.validate(): + # TODO: get uuid from database + uuid = 0 + if uuid < 0: + flash("Invalid login") + return render_template("login.html", form=form) + + user = User(uuid) + + flask_login.login_user(user) + logged_in_users.append(user) + + flash("Logged in") + return redirect(url_for("dashboard")) + return render_template("login.html", form=form) + +@glob.app.route("/logout") +@flask_login.login_required +def logout(): + flask_login.logout_user() + flash("Logged out") + return redirect(url_for("login")) + +@glob.app.errorhandler(401) +def unauthorized_handler_err(): + flash("Login is required") + unauthorized_handler() + +@login_manager.user_loader +def load_user(uuid): + return User(uuid) + +@login_manager.unauthorized_handler +def unauthorized_handler(): + return redirect(url_for("login")) - diff --git a/static/css/custom.css b/static/css/custom.css index 253e084..64cdbaf 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -10,4 +10,5 @@ html, body { background-color: white; border-radius: 6px; padding: 8px; -} \ No newline at end of file +} + diff --git a/templates/layout/includes/side_nav.html b/templates/layout/includes/side_nav.html index bb8fdd7..44da047 100644 --- a/templates/layout/includes/side_nav.html +++ b/templates/layout/includes/side_nav.html @@ -140,13 +140,13 @@
- Recieps + Receipt {% endblock %} \ No newline at end of file diff --git a/templates/modules/calendar.html b/templates/modules/calendar.html index 385c7b9..577ebe5 100644 --- a/templates/modules/calendar.html +++ b/templates/modules/calendar.html @@ -53,24 +53,6 @@ $(document).ready( function() { }, onMonthChange: function () { console.log('Cal-1 month changed'); - }, - nextYear: function () { - console.log('Cal-1 next year'); - }, - previousYear: function () { - console.log('Cal-1 previous year'); - }, - onYearChange: function () { - console.log('Cal-1 year changed'); - }, - nextInterval: function () { - console.log('Cal-1 next interval'); - }, - previousInterval: function () { - console.log('Cal-1 previous interval'); - }, - onIntervalChange: function () { - console.log('Cal-1 interval changed'); } }, multiDayEvents: { @@ -79,7 +61,8 @@ $(document).ready( function() { startDate: 'startDate' }, showAdjacentMonths: true, - adjacentDaysChangeMonth: false + adjacentDaysChangeMonth: false, + weekOffset: 1 }); // Bind all clndrs to the left and right arrow keys