This commit is contained in:
team3
2026-09-16 13:21:50 +02:00
parent 90fffbe077
commit a639e40a23
3 changed files with 347 additions and 25 deletions

View File

@@ -541,12 +541,13 @@ def bewerten(
watched_id: int,
response: Response,
stars: int = Body(..., embed=True),
text: str | None = Body(None, embed=True),
filmabend_sid: str | None = Cookie(None),
):
sid = sitzung(response, filmabend_sid)
stars = max(1, min(watched.MAX_STERNE, stars))
# Der Name kommt aus der Runde, nicht aus der Anfrage
eintrag = watched.bewerten(watched_id, sid, stars, users.name_von(sid))
eintrag = watched.bewerten(watched_id, sid, stars, users.name_von(sid), text)
if not eintrag:
raise HTTPException(status_code=404, detail="Film steht nicht in der Liste")
events.senden("watched")

View File

@@ -34,11 +34,14 @@ CREATE TABLE IF NOT EXISTS ratings (
user_id INTEGER,
stars INTEGER NOT NULL,
name TEXT,
text TEXT,
created_at TEXT NOT NULL
);
"""
MAX_STERNE = 5
# Manche schreiben eine ganze Rezension — rund 600 Wörter passen hinein
MAX_TEXT = 4000
def init():
@@ -52,6 +55,10 @@ def init():
conn.execute(
"ALTER TABLE watched ADD COLUMN hidden INTEGER NOT NULL DEFAULT 0"
)
# Ein Satz zur Wertung kam später dazu
spalten = {r["name"] for r in conn.execute("PRAGMA table_info(ratings)")}
if "text" not in spalten:
conn.execute("ALTER TABLE ratings ADD COLUMN text TEXT")
def _jetzt():
@@ -65,8 +72,8 @@ def alle(session_id):
"SELECT * FROM watched ORDER BY watched_at DESC, id DESC"
).fetchall()
stimmen = conn.execute(
"SELECT id, watched_id, session_id, user_id, stars, name FROM ratings "
"ORDER BY created_at ASC"
"SELECT id, watched_id, session_id, user_id, stars, name, text "
"FROM ratings ORDER BY created_at ASC"
).fetchall()
ich = besitzer(session_id)
@@ -78,23 +85,24 @@ def alle(session_id):
for film in filme:
eigene = je_film.get(film["id"], [])
werte = [s["stars"] for s in eigene]
meine = next((s for s in eigene if gehoert_mir(s, session_id, ich)), None)
out.append(
{
**dict(film),
"ratings": [
{"id": s["id"], "stars": s["stars"], "name": s["name"]}
{
"id": s["id"],
"stars": s["stars"],
"name": s["name"],
"text": s["text"],
"mine": gehoert_mir(s, session_id, ich),
}
for s in eigene
],
"average": round(sum(werte) / len(werte), 1) if werte else None,
"count": len(werte),
"mine": next(
(
s["stars"]
for s in eigene
if gehoert_mir(s, session_id, ich)
),
None,
),
"mine": meine["stars"] if meine else None,
"mine_text": meine["text"] if meine else None,
}
)
return out
@@ -148,34 +156,50 @@ def sichtbarkeit(watched_id, versteckt):
).rowcount
def bewerten(watched_id, session_id, stars, name=None):
"""Gibt None zurück, wenn der Film gar nicht in der Liste steht."""
def bewerten(watched_id, session_id, stars, name=None, text=None):
"""Sterne und ein optionaler Satz dazu.
Kommt kein Text mit (None), bleibt der bisherige stehen — wer nur die
Sterne nachjustiert, verliert seinen Satz nicht. Ein leerer String
löscht ihn ausdrücklich.
Gibt None zurück, wenn der Film gar nicht in der Liste steht.
"""
with connect() as conn:
da = conn.execute(
"SELECT 1 FROM watched WHERE id = ?", (watched_id,)
).fetchone()
if not da:
return None
# Eine Stimme je Person — die eigene alte fliegt vorher raus
ich = besitzer(session_id)
if text is None:
alt = conn.execute(
f"SELECT text FROM ratings WHERE watched_id = ? AND {WEM}",
(watched_id, ich, ich, session_id),
).fetchone()
text = alt["text"] if alt else None
else:
text = text.strip()[:MAX_TEXT] or None
# Eine Stimme je Person — die eigene alte fliegt vorher raus
conn.execute(
f"DELETE FROM ratings WHERE watched_id = ? AND {WEM}",
(watched_id, ich, ich, session_id),
)
conn.execute(
"INSERT INTO ratings "
"(watched_id, session_id, user_id, stars, name, created_at) "
"VALUES (?, ?, ?, ?, ?, ?)",
"(watched_id, session_id, user_id, stars, name, text, created_at) "
"VALUES (?, ?, ?, ?, ?, ?, ?)",
(
watched_id,
session_id,
ich,
stars,
(name or "").strip()[:40] or None,
text,
_jetzt(),
),
)
return {"watched_id": watched_id, "stars": stars}
return {"watched_id": watched_id, "stars": stars, "text": text}
def stimme_loeschen(rating_id):