# # Copyright (c) 2024 bartholin # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import sqlite3 import click from flask import current_app, g from os import getenv def init_app(app): app.teardown_appcontext(close_db) app.cli.add_command(init_db_command) @click.command("init-db") def init_db_command(): db = get_db() with current_app.open_resource("schema.sql") as f: db.executescript(f.read().decode("utf-8")) click.echo("You successfully initialized the database.") def get_db(): try: return g.db except: g.db = sqlite3.connect( current_app.config["DATABASE"], detect_types=sqlite3.PARSE_DECLTYPES ) g.db.row_factory = sqlite3.Row return g.db def close_db(e=None): db = g.pop("db", None) if db is not None: db.close() def new_nb(): res = get_db().execute( "SELECT number FROM movies ORDER BY number DESC" ).fetchone() return 1 if res == None else 1 if res["number"] == None else res["number"] + 1 def move_movie(dest, src): db = get_db() if dest == "end": num = new_nb() else: num = int(db.execute("SELECT number from movies WHERE id = ?", (dest, )).fetchone()["number"]) movies = db.execute("SELECT id FROM movies WHERE number >= ? ORDER BY number", (num, )).fetchall() nb = num + 1 for movie in movies: db.execute("UPDATE movies SET number = ? WHERE id = ?", (nb, movie["id"])) nb += 1 db.execute("UPDATE movies SET number = ? WHERE id = ?", (num, src)) db.commit() def get_movies(): return get_db().execute("SELECT id, title, year, poster, plot, watched, watchDate, score FROM movies ORDER BY number").fetchall() def get_movies_to_watch(): return get_db().execute("SELECT id, title, year, poster, plot, watched, watchDate, score FROM movies WHERE watched = 0 ORDER BY number").fetchall() def get_watched_movies(): return get_db().execute("SELECT id, title, year, poster, plot, watched, watchDate, score FROM movies WHERE watched = 1 ORDER BY watchDate DESC").fetchall() def new_movie(movie): db = get_db() movie["id"] = db.execute("INSERT INTO movies (title, year, poster, plot, number, watched) VALUES (?,?,?,?,?, 0) RETURNING id", (movie["title"], movie["year"], movie["poster"], movie["plot"], new_nb())).fetchone()["id"] db.commit() return movie def new_blank_movie(): db = get_db() id = db.execute("INSERT INTO movies DEFAULT VALUES RETURNING id").fetchone()["id"] nb = new_nb() db.execute("UPDATE movies SET number = ? WHERE id = ?", (nb, id)) db.commit() return {"id": id, "nb": nb} def delete_movie(id): db = get_db() db.execute("DELETE FROM movies WHERE id = ?", (id, )) db.commit() def update(id, field, value): db = get_db() db.execute("UPDATE movies SET " + field + " = ? WHERE id = ?", (value, id)) db.commit() def update_title(id,title): update(id, "title", title) def update_year(id,year): update(id, "year", year) def update_poster(id,poster): update(id, "poster", poster) def update_plot(id, plot): update(id, "plot", plot) def update_watched(id, watched): update(id, "watched", watched) def update_watchDate(id, watchDate): update(id, "watchDate", watchDate) def update_score(id, score): update(id, "score", score)