the_works/the_works/views/werk.py

148 lines
6.0 KiB
Python

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/<int:id>")
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/<int:id>", 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/<int:id>")
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