Files
pbt/app.py
T
zisco 0ebf13aacf
Deploy PBT / deploy (push) Successful in 14s
Apply claude db-rules
2026-09-10 21:17:34 +02:00

142 lines
4.2 KiB
Python

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, Trip, 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 = (
Trip.query.filter_by(user_id=current_user.id)
.order_by(Trip.trip_date.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 = Trip(
user_id=current_user.id,
transport_mode=request.form["transport_mode"],
line=request.form.get("line", "").strip(),
origin=request.form["origin"].strip(),
destination=request.form["destination"].strip(),
trip_date=request.form.get("trip_date") or date.today(),
rating=int(request.form["rating"]),
comment=request.form.get("comment", "").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/<int:fahrt_id>/loeschen", methods=["POST"])
@login_required
def fahrt_loeschen(fahrt_id):
fahrt = Trip.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)