@@ -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.
@@ -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"))
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user