From 0ebf13aacf7705c62398e3a509dfc83d6376723b Mon Sep 17 00:00:00 2001 From: Markus Zimmerberger Date: Thu, 10 Sep 2026 21:17:34 +0200 Subject: [PATCH] Apply claude db-rules --- CLAUDE.md | 5 +++++ __pycache__/app.cpython-312.pyc | Bin 0 -> 8329 bytes __pycache__/config.cpython-312.pyc | Bin 0 -> 660 bytes __pycache__/models.cpython-312.pyc | Bin 0 -> 3276 bytes app.py | 24 ++++++++++++------------ models.py | 24 ++++++++++++------------ templates/add_entry.html | 28 ++++++++++++++-------------- templates/dashboard.html | 14 +++++++------- 8 files changed, 50 insertions(+), 45 deletions(-) create mode 100644 CLAUDE.md create mode 100644 __pycache__/app.cpython-312.pyc create mode 100644 __pycache__/config.cpython-312.pyc create mode 100644 __pycache__/models.cpython-312.pyc diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..8d451fc --- /dev/null +++ b/CLAUDE.md @@ -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`). diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..140bd9d17f9d6b8aea92d0d4e20c715b1418d373 GIT binary patch literal 8329 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 literal 0 HcmV?d00001 diff --git a/__pycache__/config.cpython-312.pyc b/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d02391b1ec838b77fa90e372ecb55b27499de03 GIT binary patch literal 660 zcmX@j%ge<81RXvLvmzK77#@Q-Fu($3d{zK5rZc24q%h_%L@_WixHF_MwJ@YGuV#X% zh+?c{)MR-H;`k*)gdil`ga#mgIzuW$6k`fQ6jLg576-C22s?`#Q!Irsg$Zs8TMBa& zI|+JOQdr@7IV#yS*>ABq=jWwmrr#0>a0-ccaSU;EatwBj4-N9E(kjR=E=ey+EiTNl z($_CYDv3`lD6mS-NX$!5%}sTH$%16uZt;P%2fI24xrW4hyGB+?CuNqDr0Qno=@t~_ zr<7)wWaj7TCZ^`4q!#7*X>#7;h>y=p%uS7tzr__Fp9@rx17h>U#}}3+=0Ihb@{4b= zr{7&-72YLx`Tr+Mw#y`L6+4N;Gq+n4WB=jH=21*G&i2VUdLpmtvA^Q2IQnfIna=$N{o z>Tw4oZvhP^S*K<-p>Tg9urGIjr2X9 z`RAxwkZD<(CFSkQ@Qcy7letQ|daFd3M=xobJf#sPs=7iJwijT-_P>DK<7pT=CZwr4 z#{^VYiOQPx>Yze2Vv@5(I+vGq(B+;GeMIpW#-PxMpjlpceh}eixRU$^;EW# zN6^c0SdjSbz5t}onVnp5+y{I&P9Jbmk6Q+dQgH{xvSPumYO5CSIhbG&ZJJ^j4gAO8 z;8)&45ezlX&6QceAZD*nD}5NBb9-6GPz;@|a$lT$ed}85l+F}15Y~K364Go46xq~9X*NUn?O3&(m@!r(EcM;>9;K1&-?}op}}Bl z_*7%~FQ?!5{PY`J3$5_whn~yy6s*Lf%p*ydIWFg^itn`;j|TOIq->tBv7#a4#u7it%p z!;7(&_dC^*cDQf3yi{I|uE*A5jiI|Io92D;V0f|I3cp*u)((W0lS|2!sk&NI8_qj= zGkrhtU|=!X3Z$xu_Q3IavX)$(T36T9rt_}8Ra!~51}?$BK<>uUjkYJW>T0APzJ7Jb z$pxR=I2#kU$0I~;V)^e%QgE?&ICHw@%m;hW}TtGB&EKjLoY94Q$k1Tl!2 z{OLN;r{ug|aos#SV)YYN&-~*g2N9FCN-08Z3zAkbcBx7fv|9(DI$r?;L$$NHhmk2M$j_RBlR7Uw|(C9A1V2= zt$Q!+#v^m=NU2x%?zhLV7XkA?oB8em228t;piO@-O5Ov@$BgttuyKjW-21Vc$x=viC|!D-ixxgs?YYzbV1s!o`zNY$LGGrvOM@ah&y zGU07_N>R)jfMrpU%gl?IDd9s5?n&4LP%EU#f(aLCu}~no$vh~NRsng1>5`shPQ5tK zd|66>tw^#-htWo?4;x*rSRp}w3@==vPe#{JWLaHOR~_rVHD6=o4`aU>+j^z-!leh| z!<&E{nqwVNGJzk5ij;trwl8x-$)Yi?Fcq@9bdc7Tq z*1a|F>Z$cJYiF8?`@?^_@X3W0Z!0odO@6JfQmZr*sA~vx^(=R*0aRE+p%<*IEJqe>xyG1ev}x$p13wX zF_uiH6Yoej-c2WOq!KB+ruXOWE6?}s>-sG^4tntQV~hgXaq>L>h>Jbq&OG9t|0|dL zn;8D(PpXc`t_XjHUpx<&U%r-q%;D@GFL|DIJmgM1J|5yn`Ng5-H<#Z0Cx>Ip`+oxf Cb/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")) diff --git a/models.py b/models.py index 4b72ae5..4e42dab 100644 --- a/models.py +++ b/models.py @@ -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()) diff --git a/templates/add_entry.html b/templates/add_entry.html index 8bc214d..045be49 100644 --- a/templates/add_entry.html +++ b/templates/add_entry.html @@ -5,8 +5,8 @@

Neue Fahrt erfassen

- - {% for option in verkehrsmittel_optionen %} {% endfor %} @@ -14,28 +14,28 @@
- - + +
- - + +
- - + +
- - + +
- - @@ -45,8 +45,8 @@
- - + +
diff --git a/templates/dashboard.html b/templates/dashboard.html index 8a80106..e48ce38 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -23,19 +23,19 @@ {% for f in fahrten %} - {{ f.datum.strftime("%d.%m.%Y") }} - {{ f.verkehrsmittel }} - {{ f.linie or "–" }} - {{ f.von }} → {{ f.nach }} - {{ "★" * f.bewertung }}{{ "☆" * (5 - f.bewertung) }} + {{ f.trip_date.strftime("%d.%m.%Y") }} + {{ f.transport_mode }} + {{ f.line or "–" }} + {{ f.origin }} → {{ f.destination }} + {{ "★" * f.rating }}{{ "☆" * (5 - f.rating) }}
- {% if f.kommentar %} - {{ f.kommentar }} + {% if f.comment %} + {{ f.comment }} {% endif %} {% endfor %}