From df9d59d7aedcc1f008c745382500bd0be872fd68 Mon Sep 17 00:00:00 2001 From: eclipse Date: Tue, 22 Apr 2025 20:43:44 +0200 Subject: [PATCH] changed all table names to singular form; all DB transactions now use true ORM patterns --- the_works/models.py | 34 ++++++++-------- the_works/templates/modals.html | 2 + the_works/views/text.py | 71 +++++++++++++++++---------------- 3 files changed, 56 insertions(+), 51 deletions(-) create mode 100644 the_works/templates/modals.html diff --git a/the_works/models.py b/the_works/models.py index 0de7d2e..3fbbd13 100644 --- a/the_works/models.py +++ b/the_works/models.py @@ -1,27 +1,27 @@ from the_works.database import db from sqlalchemy.orm import relationship -class Texte(db.Model): - __table__ = db.Model.metadata.tables['Texte'] - reihe = relationship("Reihen", back_populates="texte") - textform = relationship("Textformen", back_populates="texte") - sprache = relationship("Sprachen", back_populates="texte") +class Text(db.Model): + __table__ = db.Model.metadata.tables['Text'] + reihe = relationship("Reihe", back_populates="texte") + textform = relationship("Textform", back_populates="texte") + sprache = relationship("Sprache", back_populates="texte") 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): - __table__ = db.Model.metadata.tables['Werke'] +class Werk(db.Model): + __table__ = db.Model.metadata.tables['Werk'] -class Reihen(db.Model): - __table__ = db.Model.metadata.tables['Reihen'] - texte = relationship("Texte", back_populates="reihe") +class Reihe(db.Model): + __table__ = db.Model.metadata.tables['Reihe'] + texte = relationship("Text", back_populates="reihe") -class Textformen(db.Model): - __table__ = db.Model.metadata.tables['Textformen'] - texte = relationship("Texte", back_populates="textform") +class Textform(db.Model): + __table__ = db.Model.metadata.tables['Textform'] + texte = relationship("Text", back_populates="textform") -class Sprachen(db.Model): - __table__ = db.Model.metadata.tables['Sprachen'] - texte = relationship("Texte", back_populates="sprache") +class Sprache(db.Model): + __table__ = db.Model.metadata.tables['Sprache'] + texte = relationship("Text", back_populates="sprache") diff --git a/the_works/templates/modals.html b/the_works/templates/modals.html new file mode 100644 index 0000000..29656d1 --- /dev/null +++ b/the_works/templates/modals.html @@ -0,0 +1,2 @@ +{% macro bla(var1, var2, var3='var3_default') -%} +{%- endmacro %} \ No newline at end of file diff --git a/the_works/views/text.py b/the_works/views/text.py index c877d41..3b6530c 100644 --- a/the_works/views/text.py +++ b/the_works/views/text.py @@ -1,67 +1,70 @@ from flask import Blueprint, render_template, request, redirect, flash, url_for from sqlalchemy import select, insert, update, delete 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.route("/text") @bp.route("/text/all") +@bp.route("/text") def read(): # build ORM equivalent of SELECT statement stmt = ( - select(Texte, Reihen, Textformen, Sprachen) - .join(Texte.textform, isouter=True) - .join(Texte.reihe, isouter=True) - .join(Texte.sprache, isouter=True) + select(Text, Reihe, Textform, Sprache) + .join(Text.textform, isouter=True) + .join(Text.reihe, isouter=True) + .join(Text.sprache, isouter=True) ) # condense result into list of dicts texte = [] for row in db.session.execute(stmt): texte.append({ - "id": row.Texte.ID, - "titel": row.Texte.Titel, - "untertitel": row.Texte.Untertitel or "", - "reihe": row.Reihen.Reihentitel if row.Reihen else "", - "r_id": str(row.Reihen.ID) if row.Reihen else "", - "textform": row.Textformen.Textform if row.Textformen else "", - "tf_id": str(row.Textformen.ID) if row.Textformen else "", - "sprache": row.Sprachen.Sprache, - "s_id": str(row.Sprachen.ID) if row.Sprachen else "" + "id": row.Text.ID, + "titel": row.Text.Titel, + "untertitel": row.Text.Untertitel or "", + "reihe": row.Reihe.Titel if row.Reihe else "", + "r_id": str(row.Reihe.ID) if row.Reihe else "", + "textform": row.Textform.Textform if row.Textform else "", + "tf_id": str(row.Textform.ID) if row.Textform else "", + "sprache": row.Sprache.Sprache, + "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"]) def create(): - stmt = insert(Texte).values(form_to_dict(request.form)) - db.session.execute(stmt) + db.session.add(Text( + 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() flash("Eintrag erfolgreich hinzugefügt") - return redirect(url_for("views.text.read")) + return redirect(url_for("text.read")) @bp.route("/text/update/", methods=["POST"]) def update(id): - stmt = update(Texte).where(Texte.ID == id).values(form_to_dict(request.form)) - db.session.execute(stmt) + # get record + 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() flash("Eintrag erfolgreich geändert") - return redirect(url_for("views.text.read")) + return redirect(url_for("text.read")) @bp.route("/text/delete/") def delete(id): - stmt = delete(Texte).where(Texte.ID == id) - db.session.execute(stmt) + text = db.session.get(Text, id) + db.session.delete(text) db.session.commit() 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"] - }