"""Was jeder für sich sehen möchte. Alle sehen alle Sammlungen — man merkt so, worauf die anderen Lust haben. Ändern darf jeder nur die eigene. Der Vorschlag fürs Rad ist eine andere Sache: davon gibt es einen je Person, und er landet im Glücksrad. Titel und Poster kommen mit in die Zeile. Ein gemerkter Film soll lesbar bleiben, auch wenn er nie im Katalog stand oder Netflix ihn abgibt. """ import json import sqlite3 from datetime import datetime, timezone from . import users from .db import connect from .users import WEM, besitzer, gehoert_mir SCHEMA = """ CREATE TABLE IF NOT EXISTS wishlist ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, user_id INTEGER, movie_id INTEGER NOT NULL, title TEXT NOT NULL, year INTEGER, poster_path TEXT, created_at TEXT NOT NULL ); """ def init(): with connect() as conn: conn.executescript(SCHEMA) # Jeder Film einmal je Person users.je_person(conn, "wishlist", SCHEMA, "movie_id") # Was die Karte in der Detailansicht zeigt. Steht im Katalog, nicht in der # Sammlung — ein Film, der nie im Katalog war, bleibt hier leer. AUS_KATALOG = ("genres", "teaser", "overview", "runtime", "vote_average", "vote_count", "images") def alle(session_id): """Alle Sammlungen, jede mit dem Namen ihres Besitzers.""" felder = ", ".join(f"m.{f}" for f in AUS_KATALOG) with connect() as conn: rows = conn.execute( # Genres kommen aus dem Katalog. Ein Film, der nie darin stand, # hat keine — das Rad behandelt ihn dann als "nicht Horror". f"SELECT w.*, u.name, {felder} FROM wishlist w " "LEFT JOIN users u ON u.id = w.user_id " "LEFT JOIN movies m ON m.id = w.movie_id " "ORDER BY w.created_at DESC" ).fetchall() ich = besitzer(session_id) return [ { **{ k: v for k, v in dict(r).items() if k not in ("session_id", "user_id", "genres", "images") }, "genres": json.loads(r["genres"]) if r["genres"] else [], "images": json.loads(r["images"]) if r["images"] else [], "mine": gehoert_mir(r, session_id, ich), } for r in rows ] def merken(session_id, movie): """Ein zweites Mal merken ändert nichts.""" try: with connect() as conn: conn.execute( "INSERT INTO wishlist " "(session_id, user_id, movie_id, title, year, poster_path, " "created_at) VALUES (?, ?, ?, ?, ?, ?, ?)", ( session_id, besitzer(session_id), movie["id"], movie["title"], movie.get("year"), movie.get("poster_path"), datetime.now(timezone.utc).isoformat(timespec="seconds"), ), ) except sqlite3.IntegrityError: pass return alle(session_id) def vergessen(session_id, movie_id): ich = besitzer(session_id) with connect() as conn: return conn.execute( f"DELETE FROM wishlist WHERE {WEM} AND movie_id = ?", (ich, ich, session_id, movie_id), ).rowcount def ids(session_id): """movie_ids der gemerkten Filme, für die Detailansicht.""" ich = besitzer(session_id) with connect() as conn: return [ r["movie_id"] for r in conn.execute( f"SELECT movie_id FROM wishlist WHERE {WEM}", (ich, ich, session_id), ) ]