148 lines
6.0 KiB
Python
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
|
|
|