changed all table names to singular form; all DB transactions now use true ORM patterns

This commit is contained in:
eclipse 2025-04-22 20:43:44 +02:00
parent 2a3f4ff89a
commit df9d59d7ae
3 changed files with 56 additions and 51 deletions

View File

@ -1,27 +1,27 @@
from the_works.database import db from the_works.database import db
from sqlalchemy.orm import relationship from sqlalchemy.orm import relationship
class Texte(db.Model): class Text(db.Model):
__table__ = db.Model.metadata.tables['Texte'] __table__ = db.Model.metadata.tables['Text']
reihe = relationship("Reihen", back_populates="texte") reihe = relationship("Reihe", back_populates="texte")
textform = relationship("Textformen", back_populates="texte") textform = relationship("Textform", back_populates="texte")
sprache = relationship("Sprachen", back_populates="texte") sprache = relationship("Sprache", back_populates="texte")
def __repr__(self): def __repr__(self):
return f"Texte(ID={self.ID}, Titel={self.Titel}, Untertitel={self.Untertitel}, Reihe={self.Reihe})" return f"Text(ID={self.ID}, Titel={self.Titel}, Untertitel={self.Untertitel}, Reihe={self.Reihe})"
class Werke(db.Model): class Werk(db.Model):
__table__ = db.Model.metadata.tables['Werke'] __table__ = db.Model.metadata.tables['Werk']
class Reihen(db.Model): class Reihe(db.Model):
__table__ = db.Model.metadata.tables['Reihen'] __table__ = db.Model.metadata.tables['Reihe']
texte = relationship("Texte", back_populates="reihe") texte = relationship("Text", back_populates="reihe")
class Textformen(db.Model): class Textform(db.Model):
__table__ = db.Model.metadata.tables['Textformen'] __table__ = db.Model.metadata.tables['Textform']
texte = relationship("Texte", back_populates="textform") texte = relationship("Text", back_populates="textform")
class Sprachen(db.Model): class Sprache(db.Model):
__table__ = db.Model.metadata.tables['Sprachen'] __table__ = db.Model.metadata.tables['Sprache']
texte = relationship("Texte", back_populates="sprache") texte = relationship("Text", back_populates="sprache")

View File

@ -0,0 +1,2 @@
{% macro bla(var1, var2, var3='var3_default') -%}
{%- endmacro %}

View File

@ -1,67 +1,70 @@
from flask import Blueprint, render_template, request, redirect, flash, url_for from flask import Blueprint, render_template, request, redirect, flash, url_for
from sqlalchemy import select, insert, update, delete from sqlalchemy import select, insert, update, delete
from the_works.database import db from the_works.database import db
from the_works.models import Texte, Reihen, Sprachen, Textformen from the_works.models import Text, Reihe, Sprache, Textform
bp = Blueprint("text", __name__) bp = Blueprint("text", __name__)
@bp.route("/text")
@bp.route("/text/all") @bp.route("/text/all")
@bp.route("/text")
def read(): def read():
# build ORM equivalent of SELECT statement # build ORM equivalent of SELECT statement
stmt = ( stmt = (
select(Texte, Reihen, Textformen, Sprachen) select(Text, Reihe, Textform, Sprache)
.join(Texte.textform, isouter=True) .join(Text.textform, isouter=True)
.join(Texte.reihe, isouter=True) .join(Text.reihe, isouter=True)
.join(Texte.sprache, isouter=True) .join(Text.sprache, isouter=True)
) )
# condense result into list of dicts # condense result into list of dicts
texte = [] texte = []
for row in db.session.execute(stmt): for row in db.session.execute(stmt):
texte.append({ texte.append({
"id": row.Texte.ID, "id": row.Text.ID,
"titel": row.Texte.Titel, "titel": row.Text.Titel,
"untertitel": row.Texte.Untertitel or "", "untertitel": row.Text.Untertitel or "",
"reihe": row.Reihen.Reihentitel if row.Reihen else "", "reihe": row.Reihe.Titel if row.Reihe else "",
"r_id": str(row.Reihen.ID) if row.Reihen else "", "r_id": str(row.Reihe.ID) if row.Reihe else "",
"textform": row.Textformen.Textform if row.Textformen else "", "textform": row.Textform.Textform if row.Textform else "",
"tf_id": str(row.Textformen.ID) if row.Textformen else "", "tf_id": str(row.Textform.ID) if row.Textform else "",
"sprache": row.Sprachen.Sprache, "sprache": row.Sprache.Sprache,
"s_id": str(row.Sprachen.ID) if row.Sprachen else "" "s_id": str(row.Sprache.ID) if row.Sprache else ""
}) })
return render_template("views/text.html", texte=texte, reihen=db.session.scalars(select(Reihen)), textformen=db.session.scalars(select(Textformen)), sprachen=db.session.scalars(select(Sprachen))) return render_template("views/text.html", texte=texte, reihen=db.session.scalars(select(Reihe)), textformen=db.session.scalars(select(Textform)), sprachen=db.session.scalars(select(Sprache)))
@bp.route("/text/create", methods=["POST"]) @bp.route("/text/create", methods=["POST"])
def create(): def create():
stmt = insert(Texte).values(form_to_dict(request.form)) db.session.add(Text(
db.session.execute(stmt) Titel = request.form["text_titel"],
Untertitel = request.form["text_untertitel"] or None,
Reihe = request.form["text_reihe"] or None,
Textform = request.form["text_textform"],
Sprache = request.form["text_sprache"]
))
db.session.commit() db.session.commit()
flash("Eintrag erfolgreich hinzugefügt") flash("Eintrag erfolgreich hinzugefügt")
return redirect(url_for("views.text.read")) return redirect(url_for("text.read"))
@bp.route("/text/update/<int:id>", methods=["POST"]) @bp.route("/text/update/<int:id>", methods=["POST"])
def update(id): def update(id):
stmt = update(Texte).where(Texte.ID == id).values(form_to_dict(request.form)) # get record
db.session.execute(stmt) text = db.session.get(Text, id)
# update values
text.Titel = request.form["text_titel"]
text.Untertitel = request.form["text_untertitel"] or None
text.Reihe = request.form["text_reihe"] or None
text.Textform = request.form["text_textform"]
text.Sprache = request.form["text_sprache"]
# commit changes
db.session.commit() db.session.commit()
flash("Eintrag erfolgreich geändert") flash("Eintrag erfolgreich geändert")
return redirect(url_for("views.text.read")) return redirect(url_for("text.read"))
@bp.route("/text/delete/<int:id>") @bp.route("/text/delete/<int:id>")
def delete(id): def delete(id):
stmt = delete(Texte).where(Texte.ID == id) text = db.session.get(Text, id)
db.session.execute(stmt) db.session.delete(text)
db.session.commit() db.session.commit()
flash("Eintrag erfolgreich gelöscht") flash("Eintrag erfolgreich gelöscht")
return redirect(url_for("views.text.read")) return redirect(url_for("text.read"))
def form_to_dict(form):
return {
"Titel": form["text_titel"],
"Untertitel": form["text_untertitel"] or None,
"Reihe": form["text_reihe"] or None,
"Textform": form["text_textform"],
"Originalsprache": form["text_sprache"]
}