Files
horror/backend/app/features.py
team3 9840230250 Benutzer, Sammlungen, Wünsche und zwei Kartenansichten
Die Runde ist jetzt benannt. Der Host pflegt die Namensliste im neuen Reiter
"Verwaltung", alle anderen wählen sich oben rechts einen aus. Der Name landet
serverseitig an Vorschlägen und Wertungen, statt aus einem Textfeld zu
kommen, in das jeder schreiben konnte, was er wollte.

Dazu zwei Sammelstellen, beide nach Person gruppiert und für alle sichtbar,
aber nur selbst bearbeitbar:
- "Sammlungen": Filme, die man sehen möchte. Getrennt vom Rad-Vorschlag,
  von dem es weiterhin einen je Person gibt.
- "Wünsche": was der Seite noch fehlt. Der Host darf hier alle Einträge
  ändern und löschen.

Die Filmliste hat jetzt zwei Ansichten. Kompakt ist die gewohnte Karte,
Details stellt Cover, Text und vier Szenenbilder nebeneinander — eine Karte
so breit wie vier kompakte oder die halbe Reihe, je nachdem was zuerst
zutrifft. Reihen und Einzelfilme sind dabei exakt gleich hoch; die
Blätterleiste liegt dafür über dem Cover statt darunter.

Die Filmansicht nutzt die Breite: links Cover, Text und Knöpfe, rechts der
Trailer, darunter die Bilder. Ein Klick zeigt ein Bild in voller Größe.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013XVnRop5c3or3B8xE2hpgZ
2026-09-03 19:30:48 +02:00

81 lines
2.1 KiB
Python

"""Was der Seite noch fehlt.
Jeder darf aufschreiben, was er sich wünscht. Alle sehen alle Wünsche,
ändern darf jeder nur die eigenen — wie bei den Filmsammlungen.
"""
from datetime import datetime, timezone
from .db import connect
SCHEMA = """
CREATE TABLE IF NOT EXISTS features (
id INTEGER PRIMARY KEY AUTOINCREMENT,
session_id TEXT NOT NULL,
text TEXT NOT NULL,
created_at TEXT NOT NULL
);
"""
MAX_LAENGE = 500
def init():
with connect() as conn:
conn.executescript(SCHEMA)
def alle(session_id):
"""Alle Wünsche, jeder mit dem Namen seines Verfassers."""
with connect() as conn:
rows = conn.execute(
"SELECT f.*, u.name FROM features f "
"LEFT JOIN user_sessions s ON s.session_id = f.session_id "
"LEFT JOIN users u ON u.id = s.user_id "
"ORDER BY f.created_at DESC"
).fetchall()
return [
{
**{k: v for k, v in dict(r).items() if k != "session_id"},
"mine": r["session_id"] == session_id,
}
for r in rows
]
def anlegen(session_id, text):
"""Gibt None zurück, wenn nichts dasteht."""
text = (text or "").strip()[:MAX_LAENGE]
if not text:
return None
with connect() as conn:
conn.execute(
"INSERT INTO features (session_id, text, created_at) VALUES (?, ?, ?)",
(
session_id,
text,
datetime.now(timezone.utc).isoformat(timespec="seconds"),
),
)
return alle(session_id)
def aendern(feature_id, text):
"""Der Host räumt auf: Tippfehler, Dopplungen, unklare Formulierungen."""
text = (text or "").strip()[:MAX_LAENGE]
if not text:
return 0
with connect() as conn:
return conn.execute(
"UPDATE features SET text = ? WHERE id = ?", (text, feature_id)
).rowcount
def loeschen(feature_id):
"""Ohne Sitzungsbindung — den Knopf zeigt die Oberfläche nur dem
Verfasser und dem Host."""
with connect() as conn:
return conn.execute(
"DELETE FROM features WHERE id = ?", (feature_id,)
).rowcount