implemented all CRUD operations for Texte

This commit is contained in:
eclipse 2025-04-22 11:49:30 +02:00
parent 3031a87d5d
commit 759012d218
2 changed files with 115 additions and 77 deletions

View File

@ -5,6 +5,8 @@
{% block heading %}Texte{% endblock heading %}
{% block content %}
{% include "_icons.svg" %}
<article>
<section>
<button commandfor="textmodal" command="show-modal" onclick="textmodal.showModal()">Neuer Text …</button>
@ -22,64 +24,79 @@
</tr>
</thead>
<tbody>
{% for row in rows %}
<tr>
<td>{{ row.Texte.Titel }}</td>
<td>{{ row.Texte.Untertitel }}</td>
<td>{{ row.Reihen.Reihentitel }}</td>
<td>{{ row.Textformen.Textform }}</td>
<td>{{ row.Sprachen.Sprache }}</td>
<td><a href="{{ url_for('views.text_update', id=row.Texte.ID) }}">edit</a></td>
<td><a href="{{ url_for('views.text_delete', id=row.Texte.ID) }}">delete</a></td>
{% for text in texte %}
<tr id="text-{{ text['id'] }}">
<td title="Titel">{{ text["titel"] }}</td>
<td title="Untertitel">{{ text["untertitel"] }}</td>
<td title="Reihe">{{ text["reihe"] }}</td>
<td title="Textform">{{ text["textform"] }}</td>
<td title="Sprache">{{ text["sprache"] }}</td>
<td><a onclick="showUpdateModal('{{ text["titel"] }}', '{{ text["untertitel"] }}', '{{ text["r_id"] }}', '{{ text["tf_id"] }}', '{{ text["s_id"] }}', '{{ url_for("views.text_update", id=text["id"]) }}');" title="Eintrag bearbeiten"><svg viewbox="0 0 24 24"><use href="#update" /></svg></a></td>
<td><a onclick="return confirm('Eintrag wirklich löschen?');" href="{{ url_for('views.text_delete', id=text["id"]) }}" title="Eintrag löschen"><svg viewbox="0 0 24 24"><use href="#delete" /></svg></a></td>
</tr>
{% endfor %}
</tbody>
</table>
</article>
<dialog aria-labelledby="dialog-heading" id="textmodal">
<article>
<header>
<button aria-label="close" rel="prev" onclick="textmodal.close()"></button>
<h1 id="dialog-heading">Neuer Text</h1>
</header>
<form>
<label>
Titel (erforderlich)
<input name="text_titel" placeholder="Titel" required />
</label>
<label>
Untertitel
<input name="text_untertitel" placeholder="Untertitel" />
</label>
<label>
Reihe
<select name="text_reihe" aria-label="Der Text gehört zur Reihe …">
<option selected value="">keine Reihe</option>
{% for r in reihen %}<option value="{{ r.ID }}">{{ r.Reihentitel }}</option>
{% endfor %}
</select>
</label>
<label>
Textform (erforderlich)
<select name="text_textform" aria-label="Textform" required>
<option selected disabled value="">Textform auswählen …</option>
{% for tf in textformen %}<option value="{{ tf.ID }}">{{ tf.Textform }}</option>
{% endfor %}
</select>
</label>
<label>
Sprache (erforderlich)
<select name="text_sprache" aria-label="Sprache des Textes" required>
<option selected disabled value="">Sprache auswählen …</option>
{% for s in sprachen %}<option value="{{ s.ID }}">{{ s.Sprache }}</option>
{% endfor %}
</select>
</label>
<button type="submit" formmethod="post" formaction="{{ url_for('views.text_create') }}">OK</button>
<button aria-label="close" formmethod="dialog" formnovalidate>Abbrechen</button>
</form>
</article>
</dialog>
<dialog aria-labelledby="dialog-heading" id="textmodal">
<article>
<header>
<button aria-label="close" rel="prev" onclick="textmodal.close()"></button>
<h1 id="dialog-heading">Neuer Text</h1>
</header>
<form>
<label>
Titel (erforderlich)
<input id="text_titel" name="text_titel" placeholder="Titel" required />
</label>
<label>
Untertitel
<input id="text_untertitel" name="text_untertitel" placeholder="Untertitel" />
</label>
<label>
Reihe
<select id="text_reihe" name="text_reihe" aria-label="Der Text gehört zur Reihe …">
<option selected value="">keine Reihe</option>
{% for r in reihen %}<option value="{{ r.ID }}">{{ r.Reihentitel }}</option>
{% endfor %}
</select>
</label>
<label>
Textform (erforderlich)
<select id="text_textform" name="text_textform" aria-label="Textform" required>
<option selected disabled value="">Textform auswählen …</option>
{% for tf in textformen %}<option value="{{ tf.ID }}">{{ tf.Textform }}</option>
{% endfor %}
</select>
</label>
<label>
Sprache (erforderlich)
<select id="text_sprache" name="text_sprache" aria-label="Sprache des Textes" required>
<option selected disabled value="">Sprache auswählen …</option>
{% for s in sprachen %}<option value="{{ s.ID }}">{{ s.Sprache }}</option>
{% endfor %}
</select>
</label>
<button id="text_submit" type="submit" formmethod="post" formaction="{{ url_for('views.text_create') }}">OK</button>
<button aria-label="close" formmethod="dialog" formnovalidate>Abbrechen</button>
</form>
</article>
</dialog>
<script>
function showUpdateModal(titel, untertitel, reihe, textform, sprache, formaction) {
document.getElementById("dialog-heading").textContent = "Text bearbeiten";
document.getElementById("text_titel").value = titel;
document.getElementById("text_untertitel").value = untertitel;
console.log("'reihe' is " + reihe);
// document.getElementById("text_reihe").selectedIndex = reihe;
document.querySelector('#text_reihe [value="' + reihe + '"]').selected = true;
document.getElementById("text_textform").selectedIndex = textform;
document.getElementById("text_sprache").selectedIndex = sprache;
document.getElementById("text_submit").formAction = formaction;
document.getElementById("textmodal").showModal();
}
</script>
{% endblock content %}

View File

@ -1,7 +1,7 @@
from flask import Blueprint, render_template, request, redirect, flash, url_for
from the_works.database import db
from the_works.models import Texte, Reihen, Sprachen, Textformen
from sqlalchemy import select
from sqlalchemy import select, update, insert, delete
bp = Blueprint("views", __name__)
@ -11,39 +11,60 @@ def home():
@bp.route("/texte")
def texte_show():
# 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)
)
return render_template("views/texte.html", rows=db.session.execute(stmt), reihen=db.session.scalars(select(Reihen)), textformen=db.session.scalars(select(Textformen)), sprachen=db.session.scalars(select(Sprachen)))
# 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 ""
})
return render_template("views/texte.html", texte=texte, reihen=db.session.scalars(select(Reihen)), textformen=db.session.scalars(select(Textformen)), sprachen=db.session.scalars(select(Sprachen)))
@bp.route("/texte/create", methods=["POST"])
def text_create():
db = get_db()
try:
db.execute(
"INSERT INTO texte (Titel, Untertitel, Reihe, Textform, Originalsprache) VALUES (?, ?, ?, ?, ?)",
(
request.form["text_titel"],
request.form["text_untertitel"] or None,
request.form["text_reihe"] or None,
request.form["text_textform"],
request.form["text_sprache"]
)
)
db.commit()
flash("Neuen Text in Datenbank eingetragen")
except:
flash("Fehler beim Eintragen in die Datenbank", "error")
stmt = insert(Texte).values(form_to_dict(request.form))
db.session.execute(stmt)
db.session.commit()
flash("Eintrag erfolgreich hinzugefügt")
return redirect(url_for("views.texte_show"))
@bp.route("/texte/update/<int:id>")
def text_update():
pass
@bp.route("/texte/update/<int:id>", methods=["POST"])
def text_update(id):
stmt = update(Texte).where(Texte.ID == id).values(form_to_dict(request.form))
db.session.execute(stmt)
db.session.commit()
flash("Eintrag erfolgreich geändert")
return redirect(url_for("views.texte_show"))
@bp.route("/texte/delete/<int:id>")
def text_delete():
pass
def text_delete(id):
stmt = delete(Texte).where(Texte.ID == id)
db.session.execute(stmt)
db.session.commit()
flash("Eintrag erfolgreich gelöscht")
return redirect(url_for("views.texte_show"))
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"]
}