implemented CRUD operations for table "Werk" (excluding cover picture)

This commit is contained in:
eclipse 2025-04-24 19:06:16 +02:00
parent 2e91576a08
commit 58d7fe01df
8 changed files with 275 additions and 194 deletions

View File

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

View File

@ -1,15 +1,4 @@
<script>
function showUpdateModal(titel, untertitel, reihe, textform, sprache, formaction) {
document.getElementById("dialog-heading").textContent = "Text bearbeiten";
document.getElementById("form_Titel").value = titel;
document.getElementById("form_Untertitel").value = untertitel;
document.getElementById('form_Reihe').selectedIndex = reihe;
document.getElementById("form_Textform").selectedIndex = textform;
document.getElementById("form_Sprache").selectedIndex = sprache;
document.getElementById("form_submit").formAction = formaction;
document.getElementById("textmodal").showModal();
}
function showCreateModal() {
document.getElementById("dialog-heading").textContent = "Text hinzufügen";
document.getElementById("form_Titel").value = "";
@ -20,4 +9,15 @@
document.getElementById("form_submit").formAction = "{{ url_for('text.create') }}";
document.getElementById("textmodal").showModal();
}
function showUpdateModal(titel, untertitel, reihe, textform, sprache, formaction) {
document.getElementById("dialog-heading").textContent = "Text bearbeiten";
document.getElementById("form_Titel").value = titel;
document.getElementById("form_Untertitel").value = untertitel;
document.getElementById('form_Reihe').selectedIndex = reihe;
document.getElementById("form_Textform").selectedIndex = textform;
document.getElementById("form_Sprache").selectedIndex = sprache;
document.getElementById("form_submit").formAction = formaction;
document.getElementById("textmodal").showModal();
}
</script>

View File

@ -0,0 +1,41 @@
<script>
function showCreateModal() {
document.getElementById("dialog-heading").textContent = "Werk hinzufügen";
document.getElementById("form_Titel").value = "";
document.getElementById("form_Untertitel").value = "";
document.getElementById("form_Werksform").selectedIndex = "";
document.getElementById("form_Verlag").selectedIndex = "";
document.getElementById('form_Reihe').selectedIndex = "";
document.getElementById('form_Reihennummer').value = "";
document.getElementById('form_Erscheinungsdatum').value = "";
document.getElementById('form_ISBN_13').value = "";
document.getElementById('form_ISBN_10').value = "";
document.getElementById('form_ISSN').value = "";
document.getElementById('form_Preis').value = "";
document.getElementById('form_Titelbild').value = "";
document.getElementById('form_Klappentext').value = "";
document.getElementById('form_Anmerkungen').value = "";
document.getElementById("form_submit").formAction = "{{ url_for('werk.create') }}";
document.getElementById("werkmodal").showModal();
}
function showUpdateModal(t, u, wf, v, r, rn, ed, i13, i10, is, p, tb, k, a, fa) {
document.getElementById("dialog-heading").textContent = "Werk bearbeiten";
document.getElementById("form_Titel").value = t;
document.getElementById("form_Untertitel").value = u;
document.getElementById("form_Werksform").selectedIndex = wf;
document.getElementById("form_Verlag").selectedIndex = v;
document.getElementById('form_Reihe').selectedIndex = r;
document.getElementById('form_Reihennummer').value = rn;
document.getElementById('form_Erscheinungsdatum').value = ed;
document.getElementById('form_ISBN_13').value = i13;
document.getElementById('form_ISBN_10').value = i10;
document.getElementById('form_ISSN').value = is;
document.getElementById('form_Preis').value = p;
document.getElementById('form_Titelbild').value = tb;
document.getElementById('form_Klappentext').value = k;
document.getElementById('form_Anmerkungen').value = a;
document.getElementById("form_submit").formAction = fa;
document.getElementById("werkmodal").showModal();
}
</script>

View File

@ -10,7 +10,6 @@
{% include "views/_textmodal.js" %}
<article>
<section>
<button onclick="showCreateModal()" title="Text hinzufügen">
<!-- <svg viewbox="0 0 24 24"><use href="#create" /></svg> -->
@ -38,54 +37,70 @@
<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("text.update", id=text["id"]) }}');" title="Text 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('text.delete', id=text["id"]) }}" title="Text löschen"><svg viewbox="0 0 24 24"><use href="#delete" /></svg></a></td>
<td><a onclick="return confirm('Eintrag wirklich löschen?');" href="{{ url_for('text.delete', id=text['id']) }}" title="Text 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 id="form_Titel" name="form_Titel" aria-Label="Titel" placeholder="Titel" required />
</label>
<label>
Untertitel
<input id="form_Untertitel" name="form_Untertitel" aria-Label="Untertitel" placeholder="Untertitel" />
</label>
<label>
Reihe
<select id="form_Reihe" name="form_Reihe" aria-label="Der Text gehört zur Reihe …">
<option selected value="">keine Reihe</option>
{% for r in reihen %}<option value="{{ r.ID }}">{{ r.Titel }}</option>
{% endfor %}
</select>
</label>
<label>
Textform (erforderlich)
<select id="form_Textform" name="form_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="form_Sprache" name="form_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="form_submit" type="submit" formmethod="post" formaction="{{ url_for('text.create') }}">OK</button>
<button aria-label="close" formmethod="dialog" formnovalidate>Abbrechen</button>
<header>
<button aria-label="close" rel="prev" onclick="textmodal.close()"></button>
<h1 id="dialog-heading">Neuer Text</h1>
</header>
<fieldset>
<article>
<label>
Titel (erforderlich)
<input id="form_Titel" name="form_Titel" aria-Label="Titel" placeholder="Titel" required />
</label>
</article>
<article>
<details name="text" open>
<summary>Untertitel und Reihe</summary>
<label>
Untertitel
<input id="form_Untertitel" name="form_Untertitel" aria-Label="Untertitel" placeholder="Untertitel" />
</label>
<label>
Reihe
<select id="form_Reihe" name="form_Reihe" aria-label="Der Text gehört zur Reihe …">
<option selected value="">keine Reihe</option>
{% for r in reihen %}<option value="{{ r.ID }}">{{ r.Titel }}</option>{% endfor %}
</select>
</label>
</details>
</article>
<article>
<details name="text">
<summary>Textform und Sprache</summary>
<label>
Textform (erforderlich)
<select id="form_Textform" name="form_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="form_Sprache" name="form_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>
</details>
</article>
</fieldset>
<footer class="grid">
<button id="form_submit" type="submit" formmethod="post" formaction="{{ url_for('text.create') }}">OK</button>
<button class="secondary" aria-label="close" formmethod="dialog" formnovalidate>Abbrechen</button>
</footer>
</form>
</article>
</dialog>

View File

@ -8,9 +8,8 @@
{% include "_icons.svg" %}
{# {% include "views/_textmodal.js" %} #}
{% include "views/_werkmodal.js" %}
<article>
<section>
<button onclick="showCreateModal()" title="Werk hinzufügen">
<!-- <svg viewbox="0 0 24 24"><use href="#create" /></svg> -->
@ -37,56 +36,126 @@
<td title="Reihe">{{ werk["Reihe"] }}</td>
<td title="Verlag">{{ werk["Verlag"] }}</td>
<td title="Werksform">{{ werk["Werksform"] }}</td>
<td><a href="{{ url_for('werk.read', id=werk['id']) }}" title="Werk ansehen/bearbeiten"><svg viewbox="0 0 24 24"><use href="#read" /></svg></a></td>
<td><a href="{{ url_for('werk.delete', id=werk['id']) }}" title="Werk löschen"><svg viewbox="0 0 24 24"><use href="#delete" /></svg></a></td>
<td><a onclick="showUpdateModal('{{ werk["Titel"] }}', '{{ werk["Untertitel"] }}', '{{ werk["wf_id"] }}', '{{ werk["v_id"] }}', '{{ werk["r_id"] }}', '{{ werk["Reihennummer"] }}', '{{ werk["Erscheinungsdatum"] }}', '{{ werk["ISBN_13"] }}', '{{ werk["ISBN_10"] }}', '{{ werk["ISSN"] }}', '{{ werk["Preis"] }}', '', '{{ werk["Klappentext"] }}', '{{ werk["Anmerkungen"] }}', '{{ url_for("werk.update", id=werk["id"]) }}');" title="Werk ansehen/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('werk.delete', id=werk['id']) }}" title="Werk 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">
<dialog aria-labelledby="dialog-heading" id="werkmodal">
<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.Titel }}</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('text.create') }}">OK</button>
<button aria-label="close" formmethod="dialog" formnovalidate>Abbrechen</button>
<form id="werk_detail_form" method="post" action="#" readonly>
<header>
<button aria-label="close" rel="prev" onclick="werkmodal.close()"></button>
<h1 id="dialog-heading">Detailansicht (Werk)</h1>
</header>
<fieldset>
<article>
<label>
Titel (erforderlich)
<input id="form_Titel" name="form_Titel" aria-label="Titel" placeholder="Titel" required />
</label>
</article>
<article>
<details name="werk" open>
<summary>Untertitel und Werksform</summary>
<label>
Untertitel
<input id="form_Untertitel" name="form_Untertitel" aria-label="Untertitel" placeholder="Untertitel" />
</label>
<label>
Werksform (erforderlich)
<select id="form_Werksform" name="form_Werksform" aria-label="Werksform" required>
<option value="">keine Werksform</option>
{% for wf in werksformen %}<option value="{{ wf.ID }}">{{ wf.Werksform }}</option>{% endfor %}
</select>
</label>
</details>
</article>
<article>
<details name="werk">
<summary>Verlag und Reihe</summary>
<label>
Verlag
<select id="form_Verlag" name="form_Verlag" aria-label="Verlag">
<option selected value="">kein Verlag</option>
{% for v in verlage %}<option value="{{ v.ID }}">{{ v.Verlag }}</option>{% endfor %}
</select>
</label>
<label>
Reihe
<select id="form_Reihe" name="form_Reihe" aria-label="Der Text gehört zur Reihe …">
<option value="" >keine Reihe</option>
{% for r in reihen %}<option value="{{ r.ID }}">{{ r.Titel }}</option>{% endfor %}
</select>
</label>
<label>
Reihennummer
<input id="form_Reihennummer" name="form_Reihennummer" aria-label="Reihennummer" placeholder="keine Reihennummer" />
</label>
</details>
</article>
<article>
<details name="werk">
<summary>Preis und Erscheinungsdatum</summary>
<label>
Preis
<input id="form_Preis" name="form_Preis" aria-label="Preis" placeholder="kein Preis" />
</label>
<label>
Erscheinungsdatum
<input type="date" id="form_Erscheinungsdatum" name="form_Erscheinungsdatum" aria-label="Erscheinungsdatum" placeholder="kein Datum" />
</label>
</details>
</article>
<article>
<details name="werk">
<summary>ISBNs</summary>
<label>
ISBN-13
<input id="form_ISBN_13" name="form_ISBN_13" aria-label="ISBN-13" placeholder="keine ISBN-13" />
</label>
<label>
ISBN-10
<input id="form_ISBN_10" name="form_ISBN_10" aria-label="ISBN-10" placeholder="keine ISBN-10" />
</label>
<label>
ISSN
<input id="form_ISSN" name="form_ISSN" aria-label="ISSN" placeholder="keine ISSN" />
</label>
</details>
</article>
<article>
<details name="werk">
<summary>Titelbild und Klappentext</summary>
<label>
Titelbild
<input type="file" id="form_Titelbild" name="form_Titelbild" aria-label="Titelbild" placeholder="kein Titelbild" />
</label>
<label>
Klappentext
<textarea id="form_Klappentext" name="form_Klappentext" aria-label="Klappentext" placeholder="kein Klappentext" rows="10"></textarea>
</label>
<label>
Anmerkungen
<textarea id="form_Anmerkungen" name="form_Anmerkungen" aria-label="Anmerkungen" placeholder="keine Anmerkungen" rows="10"></textarea>
</label>
</details>
</article>
</fieldset>
<footer class="grid">
<button id="form_submit" type="submit" formmethod="post" formaction="{{ url_for('werk.create') }}">OK</button>
<button class="secondary" aria-label="close" formmethod="dialog" formnovalidate>Abbrechen</button>
</footer>
</form>
</article>
</dialog> -->
</dialog>
{% endblock content %}

View File

@ -1,51 +0,0 @@
{% extends 'base.html' %}
{% block title %}"{{ werk["Titel"] }}" Detailansicht"{% endblock title %}
{% block heading %}"{{ werk["Titel"] }}" Detailansicht{% endblock heading %}
{% block content %}
{% set ID = werk["id"] %}
<article>
<form method="post" action="{{ url_for('werk.update', id=ID) }}" readonly>
<fieldset disabled="disabled">
<label>
Titel (erforderlich)
<input id="form_Titel" name="form_Titel" aria-label="Titel" placeholder="Titel" value="{{ werk['Titel'] }}" required />
</label>
<label>
Untertitel
<input id="form_Untertitel" name="form_Untertitel" aria-label="Untertitel" placeholder="Untertitel" value="{{ werk['Untertitel'] }}" />
</label>
<label>
Verlag
<select id="form_Verlag" name="form_Verlag" aria-label="Verlag">
<option value=""{% if werk['v_id'] == '' %} selected{% endif %}>kein Verlag</option>
{% for v in verlage %}<option value="{{ v.ID }}"{% if werk['v_id'] == v.ID %} selected{% endif %}>{{ v.Verlag }}</option>
{% endfor %}
</select>
</label>
<label>
Werksform
<select id="form_Werksform" name="form_Werksform" aria-label="Werksform">
<option value=""{% if werk['wf_id'] == '' %} selected{% endif %}>keine Werksform</option>
{% for wf in werksformen %}<option value="{{ wf.ID }}"{% if werk['wf_id'] == wf.ID %} selected{% endif %}>{{ wf.Werksform }}</option>
{% endfor %}
</select>
</label>
<label>
Reihe
<select id="form_Reihe" name="form_Reihe" aria-label="Der Text gehört zur Reihe …">
<option value="" {% if werk['r_id'] == "" %}selected{% endif %}>keine Reihe</option>
{% for r in reihen %}<option value="{{ r.ID }}" {% if werk['r_id'] == r.ID %}selected{% endif %}>{{ r.Titel }}</option>
{% endfor %}
</select>
</label>
<label>
Reihennummer
<input id="form_Reihennummer" name="form_Reihennummer" aria-label="Reihennummer" placeholder="keine Reihennummer" value="{{ werk['Reihennummer'] }}" />
</label>
</fieldset>
</form>
</article>
{% endblock content %}

View File

@ -31,7 +31,7 @@ def all():
})
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", methods=["POST"])
def create():
db.session.add(Text(
Titel = request.form["form_Titel"],

View File

@ -5,80 +5,89 @@ from the_works.models import Werk, Reihe, Verlag, Werksform
bp = Blueprint("werk", __name__)
# ORM equivalent of SQL statement to select all Werk entries
read_statement = select(Werk, Reihe, Verlag, Werksform).join(Werk.reihe, isouter=True).join(Werk.verlag, isouter=True).join(Werk.werksform, isouter=True)
@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 db.session.execute(read_statement):
for row in rows:
werke.append({
"id": row.Werk.ID,
"Titel": row.Werk.Titel,
"Untertitel": row.Werk.Untertitel or "",
"Reihe": row.Reihe.Titel if row.Reihe else "",
"Verlag": row.Verlag.Verlag if row.Verlag else "",
"Werksform": row.Werksform.Werksform if row.Werksform else "",
"wf_id": row.Werksform.ID if row.Werksform else "",
"Verlag": row.Verlag.Verlag if row.Verlag else "",
"v_id": row.Verlag.ID if row.Verlag else "",
"Reihe": row.Reihe.Titel if row.Reihe else "",
"r_id": row.Reihe.ID 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": row.Werk.Titelbild or "",
"Klappentext": row.Werk.Klappentext or "",
"Anmerkungen": row.Werk.Anmerkungen or ""
})
return render_template("views/werk.html", werke=werke)
@bp.route("/werk/read/<int:id>")
def read(id):
row = db.session.execute(read_statement.where(Werk.ID == id)).one()
werk = {
"id": row.Werk.ID,
"Titel": row.Werk.Titel,
"Untertitel": row.Werk.Untertitel or "",
"Reihe": row.Reihe.Titel if row.Reihe else "",
"r_id": row.Reihe.ID if row.Reihe else "",
"Verlag": row.Verlag.Verlag if row.Verlag else "",
"v_id": row.Verlag.ID if row.Verlag else "",
"Werksform": row.Werksform.Werksform if row.Werksform else "",
"wf_id": row.Werksform.ID if row.Werksform else "",
"Reihennummer": row.Werk.Reihennummer or "",
}
return render_template("views/werk_read.html", werk=werk, reihen=db.session.scalars(select(Reihe)), verlage=db.session.scalars(select(Verlag)), werksformen=db.session.scalars(select(Werksform)))
return render_template("views/werk.html", werke=werke, reihen=db.session.scalars(select(Reihe)), verlage=db.session.scalars(select(Verlag)), werksformen=db.session.scalars(select(Werksform)))
@bp.route("/werk/create", methods=["POST"])
def create():
"""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.add(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 = request.form["form_Erscheinungsdatum"] or None,
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 = None,
Klappentext = request.form["form_Klappentext"] or None,
Anmerkungen = request.form["form_Anmerkungen"] or None
))
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
text = db.session.get(Text, id)
# get record
werk = db.session.get(Werk, 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"]
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 = request.form["form_Erscheinungsdatum"] or None
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 = None
werk.Klappentext = request.form["form_Klappentext"] or None
werk.Anmerkungen = request.form["form_Anmerkungen"] or None
# 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):
""" text = db.session.get(Text, id)
db.session.delete(text)
werk = db.session.get(Werk, id)
db.session.delete(werk)
db.session.commit()
flash("Eintrag erfolgreich gelöscht")
"""
return redirect(url_for("werk.all"))