Apply claude db-rules
Deploy PBT / deploy (push) Successful in 14s

This commit is contained in:
2026-09-10 21:17:34 +02:00
parent 64d97aa5da
commit 0ebf13aacf
8 changed files with 50 additions and 45 deletions
+5
View File
@@ -0,0 +1,5 @@
# CLAUDE.md
## Conventions
- Database objects (tables, columns, indexes, constraints, etc.) must be named in English, using snake_case (all lowercase, words separated by underscores, e.g. `user_account`, `created_at`).
Binary file not shown.
Binary file not shown.
Binary file not shown.
+12 -12
View File
@@ -10,7 +10,7 @@ from flask_login import (
)
from config import Config
from models import db, User, Fahrt, VERKEHRSMITTEL_OPTIONEN
from models import db, User, Trip, VERKEHRSMITTEL_OPTIONEN
login_manager = LoginManager()
login_manager.login_view = "login"
@@ -91,8 +91,8 @@ def register_routes(app):
@login_required
def dashboard():
fahrten = (
Fahrt.query.filter_by(user_id=current_user.id)
.order_by(Fahrt.datum.desc())
Trip.query.filter_by(user_id=current_user.id)
.order_by(Trip.trip_date.desc())
.all()
)
return render_template("dashboard.html", fahrten=fahrten)
@@ -101,15 +101,15 @@ def register_routes(app):
@login_required
def neue_fahrt():
if request.method == "POST":
fahrt = Fahrt(
fahrt = Trip(
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(),
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()
@@ -125,7 +125,7 @@ def register_routes(app):
@app.route("/fahrt/<int:fahrt_id>/loeschen", methods=["POST"])
@login_required
def fahrt_loeschen(fahrt_id):
fahrt = Fahrt.query.get_or_404(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"))
+12 -12
View File
@@ -14,8 +14,8 @@ class User(UserMixin, db.Model):
email = db.Column(db.String(120), unique=True, nullable=False, index=True)
password_hash = db.Column(db.String(255), nullable=False)
fahrten = db.relationship(
"Fahrt", backref="user", lazy=True, cascade="all, delete-orphan"
trips = db.relationship(
"Trip", backref="user", lazy=True, cascade="all, delete-orphan"
)
def set_password(self, password: str) -> None:
@@ -36,18 +36,18 @@ VERKEHRSMITTEL_OPTIONEN = [
]
class Fahrt(db.Model):
__tablename__ = "fahrten"
class Trip(db.Model):
__tablename__ = "trips"
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False, index=True)
verkehrsmittel = db.Column(db.String(50), nullable=False)
linie = db.Column(db.String(50))
von = db.Column(db.String(120), nullable=False)
nach = db.Column(db.String(120), nullable=False)
datum = db.Column(db.Date, nullable=False, default=date.today)
bewertung = db.Column(db.Integer, nullable=False) # 1-5
kommentar = db.Column(db.Text)
transport_mode = db.Column(db.String(50), nullable=False)
line = db.Column(db.String(50))
origin = db.Column(db.String(120), nullable=False)
destination = db.Column(db.String(120), nullable=False)
trip_date = db.Column(db.Date, nullable=False, default=date.today)
rating = db.Column(db.Integer, nullable=False) # 1-5
comment = db.Column(db.Text)
erstellt_am = db.Column(db.DateTime, server_default=db.func.now())
created_at = db.Column(db.DateTime, server_default=db.func.now())
+14 -14
View File
@@ -5,8 +5,8 @@
<h2>Neue Fahrt erfassen</h2>
<form method="post">
<div class="field">
<label for="verkehrsmittel">Verkehrsmittel<span class="required">*</span></label>
<select id="verkehrsmittel" name="verkehrsmittel" required>
<label for="transport_mode">Verkehrsmittel<span class="required">*</span></label>
<select id="transport_mode" name="transport_mode" required>
{% for option in verkehrsmittel_optionen %}
<option value="{{ option }}">{{ option }}</option>
{% endfor %}
@@ -14,28 +14,28 @@
</div>
<div class="field">
<label for="linie">Linie</label>
<input type="text" id="linie" name="linie" placeholder="z.B. S3, Bus 10">
<label for="line">Linie</label>
<input type="text" id="line" name="line" placeholder="z.B. S3, Bus 10">
</div>
<div class="field">
<label for="von">Von<span class="required">*</span></label>
<input type="text" id="von" name="von" required>
<label for="origin">Von<span class="required">*</span></label>
<input type="text" id="origin" name="origin" required>
</div>
<div class="field">
<label for="nach">Nach<span class="required">*</span></label>
<input type="text" id="nach" name="nach" required>
<label for="destination">Nach<span class="required">*</span></label>
<input type="text" id="destination" name="destination" required>
</div>
<div class="field">
<label for="datum">Datum<span class="required">*</span></label>
<input type="date" id="datum" name="datum" value="{{ heute }}" required>
<label for="trip_date">Datum<span class="required">*</span></label>
<input type="date" id="trip_date" name="trip_date" value="{{ heute }}" required>
</div>
<div class="field">
<label for="bewertung">Bewertung<span class="required">*</span></label>
<select id="bewertung" name="bewertung" required>
<label for="rating">Bewertung<span class="required">*</span></label>
<select id="rating" name="rating" required>
<option value="5">★★★★★ Sehr gut</option>
<option value="4">★★★★☆ Gut</option>
<option value="3" selected>★★★☆☆ Okay</option>
@@ -45,8 +45,8 @@
</div>
<div class="field">
<label for="kommentar">Kommentar</label>
<textarea id="kommentar" name="kommentar" rows="3"></textarea>
<label for="comment">Kommentar</label>
<textarea id="comment" name="comment" rows="3"></textarea>
</div>
<button type="submit">Speichern</button>
+7 -7
View File
@@ -23,19 +23,19 @@
<tbody>
{% for f in fahrten %}
<tr>
<td>{{ f.datum.strftime("%d.%m.%Y") }}</td>
<td>{{ f.verkehrsmittel }}</td>
<td>{{ f.linie or "" }}</td>
<td>{{ f.von }} → {{ f.nach }}</td>
<td class="stars">{{ "★" * f.bewertung }}{{ "☆" * (5 - f.bewertung) }}</td>
<td>{{ f.trip_date.strftime("%d.%m.%Y") }}</td>
<td>{{ f.transport_mode }}</td>
<td>{{ f.line or "" }}</td>
<td>{{ f.origin }} → {{ f.destination }}</td>
<td class="stars">{{ "★" * f.rating }}{{ "☆" * (5 - f.rating) }}</td>
<td>
<form method="post" action="{{ url_for('fahrt_loeschen', fahrt_id=f.id) }}" onsubmit="return confirm('Fahrt wirklich löschen?');" style="margin: 0;">
<button type="submit" class="secondary" style="width: auto; padding: 0.35rem 0.7rem; font-size: 0.8rem;">Löschen</button>
</form>
</td>
</tr>
{% if f.kommentar %}
<tr><td></td><td colspan="5" style="color: var(--text-muted); font-size: 0.85rem;">{{ f.kommentar }}</td></tr>
{% if f.comment %}
<tr><td></td><td colspan="5" style="color: var(--text-muted); font-size: 0.85rem;">{{ f.comment }}</td></tr>
{% endif %}
{% endfor %}
</tbody>