added template and routes for DB table Veroeffentlichung

This commit is contained in:
eclipse 2025-05-16 16:11:28 +02:00
parent 3e31dbf4e0
commit 02f9d7e614
4 changed files with 164 additions and 1 deletions

View File

@ -19,7 +19,7 @@ def create_app():
init_db(app)
# register blueprints
from the_works.views import home, text, werk, verlag, sprache, textform, werksform, genre, pseudonym, reihe, herausgeber
from the_works.views import home, text, werk, verlag, sprache, textform, werksform, genre, pseudonym, reihe, herausgeber, veroeffentlichung
app.register_blueprint(home.bp)
app.register_blueprint(text.bp)
app.register_blueprint(werk.bp)
@ -31,6 +31,7 @@ def create_app():
app.register_blueprint(pseudonym.bp)
app.register_blueprint(reihe.bp)
app.register_blueprint(herausgeber.bp)
app.register_blueprint(veroeffentlichung.bp)
### DEBUG
toolbar = DebugToolbarExtension(app)

View File

@ -1,6 +1,7 @@
{% set menu = (
("Texte", url_for("text.all")),
("Werke", url_for("werk.all")),
("Veröffentlichungen", url_for("veroeffentlichung.all")),
("Basisdaten", (
("Genres", url_for("genre.all")),
("Herausgeber:innen", url_for("herausgeber.all")),

View File

@ -0,0 +1,102 @@
{% extends 'base.html' %}
{% block title %}Veröffentlichungen{% endblock title %}
{% block head %}
<link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='datatables.css') }}">
{% endblock head %}
{% block heading %}Veröffentlichungen{% endblock heading %}
{% block content %}
{% include "_icons.svg" %}
<table id="veroeffentlichung-table">
<thead>
<tr>
<th>Text</th>
<th>Werk</th>
<th>Alt. Titel</th>
<th>Alt. Untertitel</th>
<th>Pseudonym</th>
<th colspan="2">Aktionen</th>
</tr>
</thead>
<tbody>
{% for veroeffentlichung in veroeffentlichungen %}
<tr id="veroeffentlichung-{{ veroeffentlichung['id'] }}">
<td title="Text">{{ veroeffentlichung["Text"] }}</td>
<td title="Werk">{{ veroeffentlichung["Werk"] }}</td>
<td title="Alt. Titel">{{ veroeffentlichung["AltTitel"] }}</td>
<td title="Alt. Untertitel">{{ veroeffentlichung["AltUntertitel"] }}</td>
<td title="Pseudonym">{{ veroeffentlichung["Pseudonym"] }}</td>
<td class="action action-update" data-id="{{ veroeffentlichung['id'] }}" data-text="{{ veroeffentlichung['t_id'] }}" data-werk="{{ veroeffentlichung['w_id'] }}" data-alttitel="{{ veroeffentlichung['AltTitel'] }}" data-altuntertitel="{{ veroeffentlichung['AltUntertitel_id'] }}" data-pseudonym="{{ veroeffentlichung['p_id'] }}"><a href="#" title="Veröffentlichung bearbeiten"><svg viewbox="0 0 24 24"><use href="#update" /></svg></a></td>
<td id="delete-{{ veroeffentlichung['id'] }}" class="action"><a onclick="return confirm('Eintrag wirklich löschen?');" href="{{ url_for('veroeffentlichung.delete', id=veroeffentlichung['id']) }}" title="Veröffentlichung löschen"><svg viewbox="0 0 24 24"><use href="#delete" /></svg></a></td>
</tr>
{% endfor %}
</tbody>
</table>
<dialog aria-labelledby="dialog-heading" id="veroeffentlichung-modal">
<article>
<form id="veroeffentlichung_detail_form" method="post" >
<header>
<button aria-label="close" rel="prev" onclick="veroeffentlichung-modal.close()"></button>
<h1 id="dialog-heading">#</h1>
</header>
<fieldset>
<article>
<label>
<span class="required">Text</span>
<select id="form_Text" name="form_Text" aria-label="Text" placeholder="Text" required autofocus>
<option selected value="">kein Text</option>
{% for t in texte %}<option value="{{ t.ID }}">{{ t.Titel }}</option>{% endfor %}
</select>
</label>
<label>
<span class="required">Werk</span>
<select id="form_Werk" name="form_Werk" aria-label="Werk" placeholder="Werk" required>
<option selected value="">kein Werk</option>
{% for w in werke %}<option value="{{ w.ID }}">{{ w.Titel }}</option>{% endfor %}
</select>
</label>
<label>
Alternativer Titel
<input id="form_AltTitel" name="form_AltTitel" aria-Label="Alternativer Titel" placeholder="Alternativen Titel eingeben" />
</label>
<label>
Alternativer Untertitel
<input id="form_AltUntertitel" name="form_AltUntertitel" aria-Label="Alternativer Untertitel" placeholder="Alternativen Untertitel eingeben" />
</label>
<label>
<span class="required">Pseudonym</span>
<select id="form_Pseudonym" name="form_Pseudonym" aria-label="Pseudonym" placeholder="Pseudonym" required>
<option selected value="">Pseudonym auswählen</option>
{% for p in pseudonyme %}<option value="{{ p.ID }}">{{ p.Pseudonym }}</option>{% endfor %}
</select>
</label>
</article>
</fieldset>
<footer class="grid">
<button id="form_submit" type="submit" formmethod="post" formaction="{{ url_for('veroeffentlichung.create') }}">OK</button>
<button class="secondary" aria-label="close" formmethod="dialog" formnovalidate>Abbrechen</button>
</footer>
</form>
</article>
</dialog>
{% endblock content %}
{% block script %}
<script src="{{ url_for('static', filename='datatables.js') }}"></script>
<script src="{{ url_for('static', filename='the_works.js') }}"></script>
<script>
window.onload = function () {
initDataTable("veroeffentlichung-table");
initCreateButton("veroeffentlichung-table", "Veröffentlichung hinzufügen …");
initModal("veroeffentlichung-modal", ["form_Text", "form_Werk", "form_AltTitel", "form_AltUntertitel", "form_Pseudonym"], ["Neue Veröffentlichung", "Veröffentlichung bearbeiten"], ["{{ url_for('veroeffentlichung.create') }}", "{{ url_for('veroeffentlichung.update', id=-1) }}"]);
}
</script>
{% endblock script %}

View File

@ -0,0 +1,59 @@
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 Veroeffentlichung, Text, Werk, Werksform, Pseudonym
bp = Blueprint("veroeffentlichung", __name__)
@bp.route("/veroeffentlichung")
@bp.route("/veroeffentlichung/all")
def all():
rows = db.session.execute(select(Veroeffentlichung, Text, Werk, Werksform, Pseudonym).join(Veroeffentlichung.text, isouter=True).join(Veroeffentlichung.werk, isouter=True).join(Veroeffentlichung.pseudonym, isouter=True).join(Werk.werksform))
veroeffentlichungen = []
for row in rows:
veroeffentlichungen.append({
"id": row.Veroeffentlichung.ID,
"Text": row.Text.Titel,
"t_id": row.Veroeffentlichung.Text,
"Werk": row.Werk.Titel + " [" + row.Werksform.Werksform + "]",
"w_id": row.Veroeffentlichung.Werk,
"AltTitel": row.Veroeffentlichung.AltTitel or "",
"AltUntertitel": row.Veroeffentlichung.AltUntertitel or "",
"Pseudonym": row.Pseudonym.Pseudonym,
"p_id": row.Veroeffentlichung.Pseudonym,
})
return render_template("views/veroeffentlichung.html", veroeffentlichungen=veroeffentlichungen, texte=db.session.scalars(select(Text)), werke=db.session.scalars(select(Werk)), pseudonyme=db.session.scalars(select(Pseudonym)))
@bp.route("/veroeffentlichung/create", methods=["POST"])
def create():
db.session.add(Veroeffentlichung(
Text = request.form["form_Text"],
Werk = request.form["form_Werk"],
AltTitel = request.form["form_AltTitel"],
AltUntertitel = request.form["form_AltUntertitel"],
Pseudonym = request.form["form_Pseudonym"],
))
db.session.commit()
flash("Eintrag erfolgreich hinzugefügt")
return redirect(url_for("veroeffentlichung.all"), code=303)
@bp.route("/veroeffentlichung/update/<int:id>", methods=["POST"])
def update(id):
veroeffentlichung = db.session.get(Veroeffentlichung, id)
veroeffentlichung.Text = request.form["form_Text"]
veroeffentlichung.Werk = request.form["form_Werk"]
veroeffentlichung.AltTitel = request.form["form_AltTitel"]
veroeffentlichung.AltUntertitel = request.form["form_AltUntertitel"]
veroeffentlichung.Pseudonym = request.form["form_Pseudonym"]
db.session.commit()
flash("Eintrag erfolgreich geändert")
return redirect(url_for("veroeffentlichung.all"), code=303)
@bp.route("/veroeffentlichung/delete/<int:id>")
def delete(id):
veroeffentlichung = db.session.get(Veroeffentlichung, id)
db.session.delete(veroeffentlichung)
db.session.commit()
flash("Eintrag erfolgreich gelöscht")
return redirect(url_for("veroeffentlichung.all"))