diff --git a/app.py b/app.py new file mode 100644 index 0000000..d5f03e8 --- /dev/null +++ b/app.py @@ -0,0 +1,13 @@ +from application import app +from flask import render_template + + +# home route +@app.route("/") +def index(): + return render_template("home.html") + + +# App deployment +if __name__ == "__main__": + app.run(debug=True, port=5000) diff --git a/application/__init__.py b/application/__init__.py new file mode 100644 index 0000000..8bb7f47 --- /dev/null +++ b/application/__init__.py @@ -0,0 +1,39 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from flask_migrate import Migrate +from flask_login import LoginManager # type: ignore + +# App Config +app = Flask(__name__) +app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///services.sqlite" +app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False # Wat is dit? +app.config["SECRET_KEY"] = "bvjchsygvduycgsyugc" # Andere secret key + +# Object Relational Management +db = SQLAlchemy() +db.init_app(app) + +migrate = Migrate(app, db) + +# bp import +from application.auth.views import auth_blueprint + +# from application.strike.views import strike_blueprint + +# Login manager +from application.auth.models import User + +login_manager = LoginManager() +login_manager.init_app(app) # type: ignore +login_manager.login_view = "auth.login" # type: ignore + + +@login_manager.user_loader # type: ignore +def load_user(user_id): # type: ignore + return User.query.get(int(user_id)) # type: ignore + + +# Blueprint magic + +# app.register_blueprint(strike_blueprint, url_prefix="/staking") +app.register_blueprint(auth_blueprint, url_prefix="/auth") diff --git a/application/__pycache__/__init__.cpython-312.pyc b/application/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..295154d Binary files /dev/null and b/application/__pycache__/__init__.cpython-312.pyc differ diff --git a/application/auth/__pycache__/forms.cpython-312.pyc b/application/auth/__pycache__/forms.cpython-312.pyc new file mode 100644 index 0000000..4a3f074 Binary files /dev/null and b/application/auth/__pycache__/forms.cpython-312.pyc differ diff --git a/application/auth/__pycache__/models.cpython-312.pyc b/application/auth/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000..4a61f2a Binary files /dev/null and b/application/auth/__pycache__/models.cpython-312.pyc differ diff --git a/application/auth/__pycache__/views.cpython-312.pyc b/application/auth/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000..5a28b60 Binary files /dev/null and b/application/auth/__pycache__/views.cpython-312.pyc differ diff --git a/application/auth/forms.py b/application/auth/forms.py new file mode 100644 index 0000000..15e55b6 --- /dev/null +++ b/application/auth/forms.py @@ -0,0 +1,8 @@ +from flask_wtf import FlaskForm # type: ignore +from wtforms import StringField, SubmitField, PasswordField, validators + + +class LoginForm(FlaskForm): + username = StringField("Username", validators=[validators.DataRequired()]) + password = PasswordField("Password") + submit = SubmitField("Login") diff --git a/application/auth/models.py b/application/auth/models.py new file mode 100644 index 0000000..67dcf1a --- /dev/null +++ b/application/auth/models.py @@ -0,0 +1,8 @@ +from application import db +from flask_login import UserMixin # type: ignore + + +class User(db.Model, UserMixin): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(150), unique=True, nullable=False) + password = db.Column(db.String(150), nullable=False) diff --git a/application/auth/templates/login.html b/application/auth/templates/login.html new file mode 100644 index 0000000..9a51dc2 --- /dev/null +++ b/application/auth/templates/login.html @@ -0,0 +1,18 @@ +{% extends 'base.html' %} + +{% block title %} +Login +{% endblock %} + +{% block content %} +{% if feedback %} +
{{feedback}}
+{% endif %} + + +{% endblock %} \ No newline at end of file diff --git a/application/auth/views.py b/application/auth/views.py new file mode 100644 index 0000000..6fa467b --- /dev/null +++ b/application/auth/views.py @@ -0,0 +1,40 @@ +from flask import Blueprint, render_template, redirect, url_for, flash + +# from application import db +from application.auth.models import User +from application.auth.forms import LoginForm +from flask_login import login_required, login_user, logout_user # type: ignore +from werkzeug.security import check_password_hash + +auth_blueprint = Blueprint("auth", __name__, template_folder="templates") + +# Routes + + +@auth_blueprint.route("/login", methods=["GET", "POST"]) +def login(): + login_form = LoginForm() + feedback = None + + if login_form.validate_on_submit(): # type: ignore + username = login_form.username.data + password = login_form.password.data + user = User.query.filter_by(username=username).first() # type: ignore + + if user and check_password_hash( + user.password, password # type: ignore + ): + login_user(user) # type: ignore + return redirect(url_for("staking.strikers")) + else: + feedback = "Foutieve login." + + return render_template("login.html", form=login_form, feedback=feedback) + + +@auth_blueprint.route("/logout") +@login_required +def logout(): + logout_user() + flash("Je bent nu uitgelogd.") + return redirect(url_for("index")) diff --git a/application/templates/base.html b/application/templates/base.html new file mode 100644 index 0000000..3d081ec --- /dev/null +++ b/application/templates/base.html @@ -0,0 +1,41 @@ + + + + + + +