From 66d79eeb8925637c650b272f636fcf02d3bef52d Mon Sep 17 00:00:00 2001 From: Stef Date: Thu, 3 Apr 2025 15:52:27 +0200 Subject: [PATCH] Copied structure and files from Roos --- app.py | 13 ++++++ application/__init__.py | 39 +++++++++++++++++ .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1410 bytes .../auth/__pycache__/forms.cpython-312.pyc | Bin 0 -> 724 bytes .../auth/__pycache__/models.cpython-312.pyc | Bin 0 -> 844 bytes .../auth/__pycache__/views.cpython-312.pyc | Bin 0 -> 1967 bytes application/auth/forms.py | 8 ++++ application/auth/models.py | 8 ++++ application/auth/templates/login.html | 18 ++++++++ application/auth/views.py | 40 +++++++++++++++++ application/templates/base.html | 41 ++++++++++++++++++ application/templates/home.html | 9 ++++ requirements.txt | 7 +++ 13 files changed, 183 insertions(+) create mode 100644 app.py create mode 100644 application/__init__.py create mode 100644 application/__pycache__/__init__.cpython-312.pyc create mode 100644 application/auth/__pycache__/forms.cpython-312.pyc create mode 100644 application/auth/__pycache__/models.cpython-312.pyc create mode 100644 application/auth/__pycache__/views.cpython-312.pyc create mode 100644 application/auth/forms.py create mode 100644 application/auth/models.py create mode 100644 application/auth/templates/login.html create mode 100644 application/auth/views.py create mode 100644 application/templates/base.html create mode 100644 application/templates/home.html 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 0000000000000000000000000000000000000000..295154dd21a18e6891765584aaa889ad4ceb50bc GIT binary patch literal 1410 zcmah}&1)M+6o0cTX{}xB!%AZ(cIgL6kwsH0l%9lfQDwO{u^nnFlnBAF+8wXg-IbL6 za4J)ZLJDzCG4zl^`wtZN&{MDd1A4KDL&Sg&p}q7H984}bb!J!Vn1+xCJNw@6&Aj=& zkKMmgDH)jjvG>f-V*r11BNAo@a?(Qp4?zbVSzx0&LR=Rt!4~Ucpo><_j@RRX9yuZ$NFy0N^IJCJhoC!F$o;@ySBXfMl;uN*va0F?`*($QOT-G=Km z{o9TCw&vTU<++V7O>fa}Hohj!8qqczYNunFn(CSDRs&^15ama@G?P_6y z#y5D+9bO)q4Rp*}sD{mV_=ieUA#8_J;PCoTCB%YSI|+`AVBAt|f-w~tb(+xHtqs$l zg5IPf0eg;0!yt70OnNgx+qO+|+jSHkYT`Ag-PVcahBZzFmts2{LMn$QKTegP*1SN& z>d>4+4Ab>k2TsT3S8({h!pQ}!XIW_9B6CijnY=~rpKLi65kf~WaRm7z`0xlWKTm)( zy1RI{-4h4Xm7aJ{z9Szfm;3P1p!iv2e%yyEgQ=^bxjWm33+z}Td$-XO1|Zy1?kKyJ zL&!dr$M!DmIgjMYp7bIC=+hT6pu*GayFaFTsR5*(z<3|V_uNC68cgMTsYAGMoB$#7 k1WoqQz>% literal 0 HcmV?d00001 diff --git a/application/auth/__pycache__/forms.cpython-312.pyc b/application/auth/__pycache__/forms.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a3f07459c27fedf7572e355fa41e8da2d70d0b9 GIT binary patch literal 724 zcmYjP&x_MQ6n>MWY0}-&i$51Z^kgoA_98_Vgr!}|T0~cbArPmXX*X-qbY~LF-W2xY z&D-{0kb3a{@Ul`tc0fFM@*=|O#gj9cc5x0b?@QkIz4yJz$9la6>g>MxIl6}czH6{L zm1T0asgh%$Kv4oI!U*ZyO03kzcIsd!t>8-PVi$o09ia9RP=}$pZTPr)SP9%88U#rC z?SzOI?Tn{^BiEkfJRXnQF-xcdML&&m1L}{65YvoP18Xly5>t|ATnvn=iRU9eSNIqh zU_=317BHJ46`lRk-v1PU`4W!MduwhPfL&ExrS@DcK_BcX>{I6)*R%=g?_{HRtf!aW zQ^EL{q%1(ZsuWzhQKjtWO`+Sr)2PMX~htuM{)r)GE2 z+&Q`X@N=X0YWuWtZH5<(TPmwxnO$DgZ@g~viz|&@;7Na|uR5CML#}@XSyh>CW*qA- zrL)qz>3%`KD>W`@f_LAnY?EJAP~VK$P~n%25c&$&zd>gKo!_pFZoc*ZfO?eNe;(Pl AumAu6 literal 0 HcmV?d00001 diff --git a/application/auth/__pycache__/models.cpython-312.pyc b/application/auth/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a61f2a692d895c650052da498abc4b7fd6ee796 GIT binary patch literal 844 zcmbtSzi-n(6uz?^*GVXmB0!`PNDN4LL8vf<2r-l&4MRIX5yG-$Ik_Wsd;Zb0PsLl2 zIwVudLW&q*1SJC_{{mvoP@U9?sS831EKJ}&~$^SSq} za|HtMRg&q^55c4pgkqkkkjS53GXO{6FnY5AqM^Q1IF%7QC0j!8glq2f-E=`?voF2Rq zweFh=*ID3gFwBjB5#qK8HX)UrE}JE8I8NaD*l~Etar_W5BJnB5*S8-iT5Qw48@8E` zgCw>Wy`;%n_7mJ%!R=MsjUwW;-NXw6+hxhBE!1EVUyV{KmnbvxkH!y$*#>*XYPZ_2 z^=dowgT~9o`y1opwXKD{%K0wsr@eHywp)E$dtG~X{msRX+9x)y+}moN?7cj$)L%5| z*=dnwQ|IMlYV!We&xjkZJ0$FQ0hPPR3rkX9F7AvB&N7^nF5^}{%G-2KP`Lr|1!2Cc c5W;;hw+}A;&{cS|JKwMO>N`(=0ztCy-{C&LF8}}l literal 0 HcmV?d00001 diff --git a/application/auth/__pycache__/views.cpython-312.pyc b/application/auth/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5a28b608c495ba752f63db49849ce248789c573b GIT binary patch literal 1967 zcmZ`(O>7%Q6rR~#|NpGb#zdq=xXll>id=D^1QfLbK~k!wASD%Ov9z+ilX&A@JDr_v zh;gJGdT39rRHWvB1jnG{z>y<24qR+GDA6cYThR*_lq%)Ii8t$P5-DM%oqhA(H}l@S z_r3W&m5L)6zdihWUJfDjr&t67*8bSvh2LXjA`{!l!8&#%U2Pr)NoaVYDwF zpUs#VHxu*HW^zO7>&?_%v~d8@wg1_b-oSkbNto&p{&3&Ga;A{|OF#-C9{bq#$Rf2G zjH{G1OhOGtoJG6L2#-=?T9i~7k9gEJ=9-j;=IpXtD`2kNatVch>_&6mYD_k%Q;>Pu z77K%t+aByQdAz^&0Ll{}H$7&E1?#k`)L;Sb zZHTTFzT_Xu<*83+x$?#5GqZq-IE2-jrdvJ8jsFwX6dB%cLp~lOc90cxn86jO;tFn~ zg@ZaA-yCF%J_5UP+|rj9!Y6er5@4ez^`~NG=JQaX7m}y!QBUgH(k2dSyO2F;4`NFsV!0!1-~l5x7--oWfn-X7J^0TcQ(nRB%ppQ)qc+|Q1?-+d zh44+NQB+jEQFcfx@&%GYy~n z15B&vMRw@Xnbqq%sTplJysb`j)rp>Z<(~39p>7Sly_3v5n7%)~HvUSMa`9JTlp1`v}K z_5*?)HlBG%Y|x6N`h!IR=``9Ez9}eFbQTq- z9M$$GM9&LF9wr{{2TsReF$|w8Osfd85X#)0-c@3q__;0R{BA<~Zfb3+H!#vmjCPb! z|Ad=`T>m|+Q*jTUGe>TGuYB-WwTq(KMW<;J+wD{G^%GXXG`G+0gm`M}MxPVnt>|-9 z+=yqF2(7n>2Q5UZ9<|uA&te`m4AEhR!PCN-Q8|3vLlo*md~W%drK94+qeMg}ATZA+ zSLh`$h^Ny17N$KJWBe3N{(&a{2_sy1g5G(Gu6EJYC+OYh*`c+|KaT(M^;Y(?)%0E* zNttb&>*CzQ+IsHi@VeT;xgH*WDP{3A-j|W|!JaSfT{uEoJ)Gac>Ptz+V*-*9)47)l IEdAjA1M*A8cK`qY literal 0 HcmV?d00001 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 %} + +
+ {{ form.hidden_tag() }} + {{ form.username.label }} {{ form.username() }}
+ {{ form.password.label }} {{ form.password() }}
+ {{ form.submit() }} +
+{% 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 @@ + + + + + + + {% block title %}{% endblock %} + + + + + + + +
+ {% block content %} + {% endblock %} +
+ + + + \ No newline at end of file diff --git a/application/templates/home.html b/application/templates/home.html new file mode 100644 index 0000000..c602bf9 --- /dev/null +++ b/application/templates/home.html @@ -0,0 +1,9 @@ +{% extends 'base.html' %} + +{% block title %} +Staak-app +{% endblock %} + +{% block content %} +

Welkom bij de staak-app!

+{% endblock %} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index c152f85..ca53bb7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,12 +1,19 @@ +alembic==1.15.2 blinker==1.9.0 click==8.1.8 colorama==0.4.6 Flask==3.1.0 Flask-Login==0.6.3 +Flask-Migrate==4.1.0 +Flask-SQLAlchemy==3.1.1 Flask-WTF==1.2.2 +greenlet==3.1.1 itsdangerous==2.2.0 Jinja2==3.1.6 +Mako==1.3.9 MarkupSafe==3.0.2 pillow==11.1.0 +SQLAlchemy==2.0.40 +typing_extensions==4.13.0 Werkzeug==3.1.3 WTForms==3.2.1