from flask import Blueprint, render_template, request, redirect, flash, url_for from sqlalchemy import select from the_works.database import db from the_works.models import Werk, Reihe, Verlag, Werksform, Genre, Herausgeber, Titelbild bp = Blueprint("werk", __name__) @bp.route("/werk") @bp.route("/werk/all") def all(): # select all rows from table "Werk", ORM style rows = db.session.execute(select(Werk, Reihe, Verlag, Werksform).join(Werk.reihe, isouter=True).join(Werk.verlag, isouter=True).join(Werk.werksform, isouter=True)) # condense result into list of dicts werke = [] for row in rows: werke.append({ "id": row.Werk.ID, "Titel": row.Werk.Titel, "Untertitel": row.Werk.Untertitel or "", "Werksform": row.Werksform.Werksform if row.Werksform else "", "Verlag": row.Verlag.Verlag if row.Verlag else "", "Reihe": row.Reihe.Titel if row.Reihe else "", "Reihennummer": row.Werk.Reihennummer or "", "Erscheinungsdatum": row.Werk.Erscheinungsdatum or "", "ISBN_13": row.Werk.ISBN_13 or "", "ISBN_10": row.Werk.ISBN_10 or "", "ISSN": row.Werk.ISSN or "", "Preis": row.Werk.Preis or "", # "Titelbild": url_for("titelbild.thumbnail", id=row.Werk.Titelbild) if row.Werk.Titelbild else "", "Titelbild": db.session.get(Titelbild, row.Werk.Titelbild).asdict_with_urls() if row.Werk.Titelbild else "", "Klappentext": row.Werk.Klappentext or "", "Anmerkungen": row.Werk.Anmerkungen or "", "Herausgeber_list": [wh.herausgeber.Name for wh in row.Werk.herausgeber], "Genre_list": [wg.genre.Genre for wg in row.Werk.genres], }) return render_template("views/werk.html", werke=werke) @bp.route("/werk/read/") def read(id): # prepare Titelbilder as dict including URLs for thumbnail and full pic titelbilder = map(lambda t: t.asdict_with_urls(), db.session.scalars(select(Titelbild))) # id of zero -> return empty data if id == 0: return render_template("views/werk_detail.html", werk={"ID": 0, "Erscheinungsdatum": ""}, reihen=db.session.scalars(select(Reihe)), verlage=db.session.scalars(select(Verlag)), werksformen=db.session.scalars(select(Werksform)), genres=db.session.scalars(select(Genre)), hrsg=db.session.scalars(select(Herausgeber)), titelbilder=titelbilder) # all other ids -> read existing entry from DB and return as dict w = db.session.get(Werk, id) if not w: raise ValueError(f"Werk with ID {id} not found") werk = w.asdict() werk["Genres"] = w.genre_ids werk["Herausgeber"] = w.herausgeber_ids return render_template("views/werk_detail.html", werk=werk, reihen=db.session.scalars(select(Reihe)), verlage=db.session.scalars(select(Verlag)), werksformen=db.session.scalars(select(Werksform)), genres=db.session.scalars(select(Genre)), hrsg=db.session.scalars(select(Herausgeber)), titelbilder=titelbilder) @bp.route("/werk/create", methods=["POST"]) def create(): werk = Werk( Titel = request.form["form_Titel"], Untertitel = request.form["form_Untertitel"] or None, Werksform = request.form["form_Werksform"], Verlag = request.form["form_Verlag"] or None, Reihe = request.form["form_Reihe"] or None, Reihennummer = request.form["form_Reihennummer"] or None, Erscheinungsdatum = _get_datum(request.form["form_Erscheinungsjahr"], request.form["form_Erscheinungsmonat"], request.form["form_Erscheinungstag"]), ISBN_13 = request.form["form_ISBN_13"] or None, ISBN_10 = request.form["form_ISBN_10"] or None, ISSN = request.form["form_ISSN"] or None, Preis = request.form["form_Preis"] or None, Titelbild = request.form["form_Titelbild"] or None, Klappentext = request.form["form_Klappentext"] or None, Anmerkungen = request.form["form_Anmerkungen"] or None ) for g in request.form.getlist("form_Genre"): werk.genre_ids.append(g) for h in request.form.getlist("form_Herausgeber"): werk.herausgeber_ids.append(h) db.session.add(werk) db.session.commit() flash("Eintrag erfolgreich hinzugefügt") return redirect(url_for("werk.all")) @bp.route("/werk/update/", methods=["POST"]) def update(id): # get record werk = db.session.get(Werk, id) # update values werk.Titel = request.form["form_Titel"] werk.Untertitel = request.form["form_Untertitel"] or None werk.Werksform = request.form["form_Werksform"] werk.Verlag = request.form["form_Verlag"] or None werk.Reihe = request.form["form_Reihe"] or None werk.Reihennummer = request.form["form_Reihennummer"] or None werk.Erscheinungsdatum = _get_datum(request.form["form_Erscheinungsjahr"], request.form["form_Erscheinungsmonat"], request.form["form_Erscheinungstag"]) werk.ISBN_13 = request.form["form_ISBN_13"] or None werk.ISBN_10 = request.form["form_ISBN_10"] or None werk.ISSN = request.form["form_ISSN"] or None werk.Preis = request.form["form_Preis"] or None werk.Titelbild = request.form["form_Titelbild"] or None werk.Klappentext = request.form["form_Klappentext"] or None werk.Anmerkungen = request.form["form_Anmerkungen"] or None # update associated values: Genre form_set = set(map(int, request.form.getlist("form_Genre"))) for g in set(werk.genre_ids) - form_set: werk.genre_ids.remove(g) for g in form_set - set(werk.genre_ids): werk.genre_ids.append(g) # update associated values: Herausgeber form_set = set(map(int, request.form.getlist("form_Herausgeber"))) for h in set(werk.herausgeber_ids) - form_set: werk.herausgeber_ids.remove(h) for h in form_set - set(werk.herausgeber_ids): werk.herausgeber_ids.append(h) # commit changes db.session.commit() flash("Eintrag erfolgreich geändert") return redirect(url_for("werk.all")) @bp.route("/werk/delete/") def delete(id): werk = db.session.get(Werk, id) db.session.delete(werk) db.session.commit() flash("Eintrag erfolgreich gelöscht") return redirect(url_for("werk.all")) def _get_datum(jahr, monat, tag): if tag != "": return "-".join([jahr, monat.zfill(2), tag.zfill(2)]) elif monat != "": return "-".join([jahr, monat.zfill(2)]) elif jahr != "": return jahr else: return None