diff --git a/api.html b/api.html index 247756a..31be829 100644 --- a/api.html +++ b/api.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare diff --git a/app.py b/app.py index 8d0d39f..dee42e4 100644 --- a/app.py +++ b/app.py @@ -1,9 +1,17 @@ from flask import Flask, request, redirect -from datetime import datetime +from datetime import datetime, timezone, timedelta app = Flask(__name__) -# Kommentare im Arbeitsspeicher (gehen beim Neustart verloren -> kommt Datenbank) +# ─── Zeitzone: CEST (UTC+2) ────────────────────────────────────────────────── +BERLIN = timezone(timedelta(hours=2)) + +def jetzt(): + return datetime.now(BERLIN).strftime("%d.%m.%Y, %H:%M Uhr") + +# ─── Kommentare im Arbeitsspeicher ─────────────────────────────────────────── +# Schema: {"name": str, "text": str, "zeit": str, +# "antworten": [{"name": str, "text": str, "zeit": str}]} eintraege = [] # ───────────────────────────────────────────────────────────────────────────── @@ -66,9 +74,7 @@ def seite(inhalt):
""" + inhalt + """ @@ -82,14 +88,7 @@ def seite(inhalt): # ───────────────────────────────────────────────────────────────────────────── @app.route("/") def hello(): - return seite(""" -

Willkommen in unserer Flask-App!

-

- Diese App läuft mit Python & Flask direkt auf dem Server.
- Probier die Frage oder die - Pinnwand aus. -

-""") + return redirect("/app/pinnwand") # ───────────────────────────────────────────────────────────────────────────── @@ -97,243 +96,247 @@ def hello(): # ───────────────────────────────────────────────────────────────────────────── @app.route("/frage", methods=["GET", "POST"]) def frage(): - feedback = "" - if request.method == "POST": - antwort = request.form.get("antwort", "").strip() - if antwort == "8": - feedback = '

✔ Richtig!

' - else: - feedback = '

✘ Leider falsch. Versuch es nochmal!

' - - return seite(""" -

Rechenrätsel

-
-
- - -
-""" + feedback) + return redirect("/app/pinnwand") # ───────────────────────────────────────────────────────────────────────────── -# Route 3: Pinnwand – YouTube-Kommentar-Style (ca. 2013) +# Route 3: Pinnwand – YouTube-Kommentar-Style mit Antwort-Funktion # ───────────────────────────────────────────────────────────────────────────── PINNWAND_CSS = """ + + """ + +def esc(s): + return (s.replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace('"', """)) + + def avatar_farbe(name): - farben = ["#e53935","#8e24aa","#1e88e5","#00897b", - "#43a047","#fb8c00","#6d4c41","#546e7a"] - idx = sum(ord(c) for c in name) % len(farben) - return farben[idx] + farben = ["#e53935", "#8e24aa", "#1e88e5", "#00897b", + "#43a047", "#fb8c00", "#6d4c41", "#546e7a"] + idx = sum(ord(c) for c in name) % len(farben) + return farben[idx] + + +def render_antworten(antworten): + html = "" + for a in antworten: + farbe = avatar_farbe(a["name"]) + initial = a["name"][0].upper() + html += f""" +
+
{initial}
+
+
+ {esc(a['name'])} + {esc(a['zeit'])} +
+
{esc(a['text'])}
+
+
""" + return html + @app.route("/pinnwand", methods=["GET", "POST"]) def pinnwand(): if request.method == "POST": - name = request.form.get("name", "").strip() or "Anonym" - nachricht = request.form.get("nachricht", "").strip() - if nachricht: - eintraege.append({ - "name": name, - "text": nachricht, - "zeit": datetime.now().strftime("%d.%m.%Y, %H:%M Uhr") - }) + name = request.form.get("name", "").strip() or "Anonym" + text = request.form.get("nachricht", "").strip() + parent_raw = request.form.get("parent_id", "").strip() + if text: + if parent_raw.isdigit(): + idx = int(parent_raw) + if 0 <= idx < len(eintraege): + eintraege[idx]["antworten"].append( + {"name": name, "text": text, "zeit": jetzt()} + ) + else: + eintraege.append( + {"name": name, "text": text, "zeit": jetzt(), "antworten": []} + ) return redirect("/app/pinnwand") - # Kommentare bauen (neueste zuerst) - kommentare_html = "" - for e in reversed(eintraege): - initial = e["name"][0].upper() + # ── Kommentare rendern (neueste zuerst, echter Index für parent_id) ── + komm_html = "" + for real_idx, e in reversed(list(enumerate(eintraege))): farbe = avatar_farbe(e["name"]) - # Einfaches HTML-Escaping - name_esc = e["name"].replace("&","&").replace("<","<").replace(">",">") - text_esc = e["text"].replace("&","&").replace("<","<").replace(">",">") - kommentare_html += f""" -
+ initial = e["name"][0].upper() + n_ant = len(e["antworten"]) + + # Block: Antworten anzeigen/verbergen + antworten_block = "" + if n_ant > 0: + label = f"{n_ant} Antwort{'en' if n_ant != 1 else ''}" + antworten_block = f""" + + """ + + komm_html += f""" +
{initial}
-
- {name_esc} - vor gerade  ·  {e['zeit']} +
+ {esc(e['name'])} + {esc(e['zeit'])}
-
{text_esc}
+
{esc(e['text'])}
- +
+ + +
+
+ + + +
+ + +
+
+
+ + {antworten_block}
""" if not eintraege: - kommentare_html = '

Noch keine Kommentare. Sei der Erste! 💬

' + komm_html = '

Noch keine Kommentare. Sei der Erste! 💬

' - anzahl = len(eintraege) - anzahl_text = f"{anzahl} Kommentar{'e' if anzahl != 1 else ''}" + n = len(eintraege) + anzahl_text = f"{n} Kommentar{'e' if n != 1 else ''}" return seite(PINNWAND_CSS + f""" -
- Kommentare -
+
Kommentare
-
-
👤
+
👤
- - + +
- +
-

{anzahl_text}

- - -
- {kommentare_html} -
+
{komm_html}
""") # ───────────────────────────────────────────────────────────────────────────── if __name__ == "__main__": app.run(host="0.0.0.0", port=9002) # isa2 → Port 9002 + diff --git a/eis_projekt.html b/eis_projekt.html index 2ecd101..78862d9 100644 --- a/eis_projekt.html +++ b/eis_projekt.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare
diff --git a/galerie.html b/galerie.html index 75d73af..6e9b8c1 100644 --- a/galerie.html +++ b/galerie.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare
diff --git a/impressum.html b/impressum.html index e29383f..af1ff4d 100644 --- a/impressum.html +++ b/impressum.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare
diff --git a/index.html b/index.html index 2caa0b5..c563d95 100644 --- a/index.html +++ b/index.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare diff --git a/kanban.html b/kanban.html index 47236bb..eec8063 100644 --- a/kanban.html +++ b/kanban.html @@ -43,6 +43,7 @@ API Demo Kanban Quiz + Kommentare diff --git a/kontakt.html b/kontakt.html index fab3cf3..d30f297 100644 --- a/kontakt.html +++ b/kontakt.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare diff --git a/notenrechner.html b/notenrechner.html index 1d76ed0..799ff6c 100644 --- a/notenrechner.html +++ b/notenrechner.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare diff --git a/quiz.html b/quiz.html index 2060d43..faa335b 100644 --- a/quiz.html +++ b/quiz.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare diff --git a/team.html b/team.html index e2e3166..9231e36 100644 --- a/team.html +++ b/team.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare diff --git a/textanalyse.html b/textanalyse.html index 8f6ceb4..726dd80 100644 --- a/textanalyse.html +++ b/textanalyse.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare diff --git a/ueber_uns.html b/ueber_uns.html index 8efeb21..ea810cb 100644 --- a/ueber_uns.html +++ b/ueber_uns.html @@ -45,6 +45,7 @@ API Demo Kanban Quiz + Kommentare