Basic login
This commit is contained in:
parent
49738b52eb
commit
f13e18a927
24
forms/login.py
Normal file
24
forms/login.py
Normal file
|
@ -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
|
||||
"""
|
||||
|
1
main.py
1
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
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
Flask>=1.0.2
|
||||
Flask-WTF>=0.14.2
|
||||
flask_login>=0.4.1
|
62
routes.py
62
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"))
|
||||
|
||||
|
||||
|
|
|
@ -10,4 +10,5 @@ html, body {
|
|||
background-color: white;
|
||||
border-radius: 6px;
|
||||
padding: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -140,13 +140,13 @@
|
|||
</div>
|
||||
<div>
|
||||
<a class="item" onclick="toggleCategory(this)">
|
||||
<i class="fa fa-chart-bar"></i><span>Recieps</span>
|
||||
<i class="fa fa-chart-bar"></i><span>Receipt</span>
|
||||
<i class="fas fa-chevron-right"></i>
|
||||
</a>
|
||||
<div class="downtab hidden">
|
||||
<div class="flex-column">
|
||||
<div class="page">
|
||||
<a href="#recieps-recieps">Recieps</a>
|
||||
<a href="#recieps-recieps">Receipt</a>
|
||||
</div>
|
||||
<div class="page">
|
||||
<a href="#recieps-log">Log</a>
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
{% extends "layout/bootstrap.html" %}
|
||||
|
||||
{% block content %}
|
||||
<script src="{{ url_for('static', filename='js/alerts.js') }}"></script>
|
||||
|
||||
<div class="container pt-3">
|
||||
<div class="row alert-section">
|
||||
<div class="col-md-8 mx-auto">
|
||||
|
@ -32,11 +34,46 @@
|
|||
<a class="btn btn-primary btn-lg btn-block" href="#TODO_LOGIN_EID" onclick="alertAbove(this, 'warning', 'This should redirect the user to Electronic ID page (but due to phishing, we can not demo this)')">Electronic ID</a>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<a class="btn btn-primary btn-lg btn-block" id="test" href="#TODO_LOGIN_HA" onclick="alertAbove(this, 'info', 'Unimplemented - Awaiting database')">House Account</a>
|
||||
<a class="btn btn-primary btn-lg btn-block" href="#" data-toggle="modal" data-target="#myModal">House Account</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="myModal" role="dialog">
|
||||
<div class="modal-dialog">
|
||||
<!-- Modal content-->
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h4 class="modal-title">Login</h4>
|
||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
{% macro render_field(field) %}
|
||||
<dt>{{ field.label }}
|
||||
<dd>{{ field(**kwargs)|safe }}
|
||||
{% if field.errors %}
|
||||
<ul class=errors>
|
||||
{% for error in field.errors %}
|
||||
<li>{{ error }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</dd>
|
||||
{% endmacro %}
|
||||
<form method=post>
|
||||
<dl>
|
||||
{{ render_field(form.email) }}
|
||||
{{ render_field(form.password) }}
|
||||
</dl>
|
||||
<input type=submit value="Login">
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user