diff --git a/app.py b/app.py index b9524fa..09b8d82 100644 --- a/app.py +++ b/app.py @@ -1,17 +1,13 @@ from flask import ( - render_template, redirect, url_for, - request, send_from_directory, ) from flask_login import ( login_required, logout_user, - login_user, current_user, ) -from forms import LoginForm from models import User from application import db, app, login_manager from application.admin.routes import admin_bp @@ -23,7 +19,7 @@ from typing import Optional # Config app.config["SECRET_KEY"] = "Stef123" -login_manager.login_view = "login" # type: ignore +login_manager.login_view = "auth.login" # type: ignore @login_manager.user_loader # type: ignore @@ -51,7 +47,7 @@ def default_return(next_page: Optional[str] = None): @app.route("/") @login_required def index(): - return redirect(url_for("login")) + return redirect(url_for("auth.login")) @app.route("/favicon.ico") @@ -59,25 +55,6 @@ def favicon(): return send_from_directory("static", "favicon.ico") -@app.route("/login", methods=["GET", "POST"]) -def login(): - if current_user.is_authenticated: - return default_return() - - form = LoginForm() - if form.validate_on_submit(): - user = User.query.filter_by(username=form.username.data).first() - if user and user.check_password(password=form.password.data): - # User found and password correct - next_page = request.args.get("next") # Get next page if given - login_user(user) # Log in the user - return default_return(next_page=next_page) - else: - pass - # invalid user - return render_template("login.html", form=form) - - @app.route("/logout") @login_required def logout(): diff --git a/application/add_meal/routes.py b/application/add_meal/routes.py index 528917b..7efdf0e 100644 --- a/application/add_meal/routes.py +++ b/application/add_meal/routes.py @@ -28,7 +28,7 @@ bp = Blueprint( @bp.before_request def login_required(): if not current_user.is_authenticated: - return redirect(url_for("login")) + return redirect(url_for("auth.login")) @bp.route("/select_meal/", methods=["GET"]) diff --git a/application/auth/routes.py b/application/auth/routes.py index 20aa991..043aaf9 100644 --- a/application/auth/routes.py +++ b/application/auth/routes.py @@ -1,13 +1,30 @@ -from flask import ( - Blueprint, -) -from application.utils import login_required +from flask import Blueprint, request, render_template +from flask_login import current_user, login_user +from forms import LoginForm +from models import User +from application.utils import default_return bp = Blueprint( - "user", + "auth", __name__, template_folder="templates", ) -bp.before_request(login_required) +@bp.route("/login", methods=["GET", "POST"]) +def login(): + if current_user.is_authenticated: + return default_return() + + form = LoginForm() + if form.validate_on_submit(): + user = User.query.filter_by(username=form.username.data).first() + if user and user.check_password(password=form.password.data): + # User found and password correct + next_page = request.args.get("next") # Get next page if given + login_user(user) # Log in the user + return default_return(next_page=next_page) + else: + pass + # invalid user + return render_template("login.html", form=form) diff --git a/application/auth/templates/login.html b/application/auth/templates/login.html new file mode 100644 index 0000000..e65d635 --- /dev/null +++ b/application/auth/templates/login.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} + +{% block content %} +
+
+

Login

+
+ {{ form.hidden_tag() }} + +
+ {{ form.username.label(class="form-label") }} + {{ form.username(class="form-control", placeholder="Enter username") }} + {% if form.username.errors %} +
+ {{ form.username.errors[0] }} +
+ {% endif %} +
+ +
+ {{ form.password.label(class="form-label") }} + {{ form.password(class="form-control", placeholder="Enter password") }} + {% if form.password.errors %} +
+ {{ form.password.errors[0] }} +
+ {% endif %} +
+ +
+ {{ form.submit(class="btn btn-primary btn-lg") }} +
+
+
+
+{% endblock%} \ No newline at end of file diff --git a/application/utils.py b/application/utils.py index aecb0a9..3cb5a5b 100644 --- a/application/utils.py +++ b/application/utils.py @@ -1,11 +1,21 @@ from flask_login import current_user from flask import redirect, url_for, flash +from typing import Optional def login_required(): if not current_user.is_authenticated: return redirect(url_for("auth.login")) - if current_user.must_change_password: + # if current_user.must_change_password: flash("You have to change your password") return redirect(url_for("auth.change_password")) return + + +def default_return(next_page: Optional[str] = None): + return redirect(url_for("user.daily_log")) + if next_page: + return redirect(next_page) + if current_user.is_admin: + return redirect(url_for("admin.food_items")) + return redirect(url_for("dashboard")) diff --git a/forms.py b/forms.py index d280a1e..70c64ab 100644 --- a/forms.py +++ b/forms.py @@ -11,7 +11,7 @@ from wtforms.validators import DataRequired, InputRequired, Optional class LoginForm(FlaskForm): username = StringField("Username", validators=[DataRequired()]) password = PasswordField("Password", validators=[DataRequired()]) - submit = SubmitField("Login") + submit = SubmitField("auth.login") class FoodItemForm(FlaskForm):