from datetime import date from flask import Flask, render_template, redirect, url_for, request, flash from flask_login import ( LoginManager, login_user, logout_user, login_required, current_user, ) from config import Config from models import db, User, Fahrt, VERKEHRSMITTEL_OPTIONEN login_manager = LoginManager() login_manager.login_view = "login" def create_app(): app = Flask(__name__) app.config.from_object(Config) db.init_app(app) login_manager.init_app(app) with app.app_context(): db.create_all() register_routes(app) return app @login_manager.user_loader def load_user(user_id): return User.query.get(int(user_id)) def register_routes(app): @app.route("/") def index(): if current_user.is_authenticated: return redirect(url_for("dashboard")) return redirect(url_for("login")) @app.route("/register", methods=["GET", "POST"]) def register(): if request.method == "POST": username = request.form["username"].strip() email = request.form["email"].strip().lower() password = request.form["password"] if User.query.filter( (User.username == username) | (User.email == email) ).first(): flash("Benutzername oder E-Mail bereits vergeben.", "error") return redirect(url_for("register")) user = User(username=username, email=email) user.set_password(password) db.session.add(user) db.session.commit() login_user(user) return redirect(url_for("dashboard")) return render_template("register.html") @app.route("/login", methods=["GET", "POST"]) def login(): if request.method == "POST": username = request.form["username"].strip() password = request.form["password"] user = User.query.filter_by(username=username).first() if user is None or not user.check_password(password): flash("Login fehlgeschlagen. Bitte prüfe deine Daten.", "error") return redirect(url_for("login")) login_user(user) return redirect(url_for("dashboard")) return render_template("login.html") @app.route("/logout") @login_required def logout(): logout_user() return redirect(url_for("login")) @app.route("/dashboard") @login_required def dashboard(): fahrten = ( Fahrt.query.filter_by(user_id=current_user.id) .order_by(Fahrt.datum.desc()) .all() ) return render_template("dashboard.html", fahrten=fahrten) @app.route("/fahrt/neu", methods=["GET", "POST"]) @login_required def neue_fahrt(): if request.method == "POST": fahrt = Fahrt( user_id=current_user.id, verkehrsmittel=request.form["verkehrsmittel"], linie=request.form.get("linie", "").strip(), von=request.form["von"].strip(), nach=request.form["nach"].strip(), datum=request.form.get("datum") or date.today(), bewertung=int(request.form["bewertung"]), kommentar=request.form.get("kommentar", "").strip(), ) db.session.add(fahrt) db.session.commit() flash("Fahrt gespeichert.", "success") return redirect(url_for("dashboard")) return render_template( "add_entry.html", verkehrsmittel_optionen=VERKEHRSMITTEL_OPTIONEN, heute=date.today().isoformat(), ) @app.route("/fahrt//loeschen", methods=["POST"]) @login_required def fahrt_loeschen(fahrt_id): fahrt = Fahrt.query.get_or_404(fahrt_id) if fahrt.user_id != current_user.id: flash("Nicht erlaubt.", "error") return redirect(url_for("dashboard")) db.session.delete(fahrt) db.session.commit() flash("Fahrt gelöscht.", "success") return redirect(url_for("dashboard")) app = create_app() if __name__ == "__main__": app.run(host="0.0.0.0", port=5000, debug=True)