added first view for table "Werk"

This commit is contained in:
eclipse 2025-04-23 09:36:59 +02:00
parent df9d59d7ae
commit 03cd3f4767
5 changed files with 189 additions and 7 deletions

View File

@ -26,9 +26,10 @@ def create_app():
init_db(app)
# register blueprints
from the_works.views import home, text
from the_works.views import home, text, werk
app.register_blueprint(text.bp)
app.register_blueprint(home.bp)
app.register_blueprint(werk.bp)
# load debug toolbar
toolbar = DebugToolbarExtension(app)

View File

@ -3,25 +3,41 @@ from sqlalchemy.orm import relationship
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")
reihe = relationship("Reihe", back_populates="text")
textform = relationship("Textform", back_populates="text")
sprache = relationship("Sprache", back_populates="text")
def __repr__(self):
return f"Text(ID={self.ID}, Titel={self.Titel}, Untertitel={self.Untertitel}, Reihe={self.Reihe})"
class Werk(db.Model):
__table__ = db.Model.metadata.tables['Werk']
reihe = relationship("Reihe", back_populates="werk")
verlag = relationship("Verlag", back_populates="werk")
werksform = relationship("Werksform", back_populates="werk")
def __repr__(self):
return f"Werk(ID={self.ID}, Titel={self.Titel}, Untertitel={self.Untertitel}, Erscheinungsdatum={self.Erscheinungsdatum})"
class Reihe(db.Model):
__table__ = db.Model.metadata.tables['Reihe']
texte = relationship("Text", back_populates="reihe")
text = relationship("Text", back_populates="reihe")
werk = relationship("Werk", back_populates="reihe")
class Textform(db.Model):
__table__ = db.Model.metadata.tables['Textform']
texte = relationship("Text", back_populates="textform")
text = relationship("Text", back_populates="textform")
class Sprache(db.Model):
__table__ = db.Model.metadata.tables['Sprache']
texte = relationship("Text", back_populates="sprache")
text = relationship("Text", back_populates="sprache")
class Verlag(db.Model):
__table__ = db.Model.metadata.tables['Verlag']
werk = relationship("Werk", back_populates="verlag")
class Werksform(db.Model):
__table__ = db.Model.metadata.tables['Werksform']
werk = relationship("Werk", back_populates="werksform")

View File

@ -2,5 +2,6 @@
<ul>
<li><a href="{{ url_for('home.home') }}">Home</a></li>
<li><a href="{{ url_for('text.read') }}">Texte</a></li>
<li><a href="{{ url_for('werk.read') }}">Werke</a></li>
</ul>
</nav>

View File

@ -0,0 +1,92 @@
{% extends 'base.html' %}
{% block title %}Werke{% endblock title %}
{% block heading %}Werke{% endblock heading %}
{% block content %}
{% include "_icons.svg" %}
{# {% include "views/_textmodal.js" %} #}
<article>
<section>
<button onclick="showCreateModal()" title="Werk hinzufügen">
<!-- <svg viewbox="0 0 24 24"><use href="#create" /></svg> -->
Neu …
</button>
</section>
<table>
<thead>
<tr>
<th>Titel</th>
<th>Untertitel</th>
<th>Reihe</th>
<th>Verlag</th>
<th>Werksform</th>
<th colspan="2">Aktionen</th>
</tr>
</thead>
<tbody>
{% for werk in werke %}
<tr id="werk-{{ werk['id'] }}">
<td title="Titel">{{ werk["titel"] }}</td>
<td title="Untertitel">{{ werk["untertitel"] }}</td>
<td title="Reihe">{{ werk["reihe"] }}</td>
<td title="Verlag">{{ werk["verlag"] }}</td>
<td title="Werksform">{{ werk["werksform"] }}</td>
<td><a onclick="showUpdateModal('{{ werk["titel"] }}', '{{ werk["untertitel"] }}', '{{ werk["r_id"] }}', '{{ werk["v_id"] }}', '{{ werk["wf_id"] }}', '{{ url_for("werk.update", id=werk["id"]) }}');" title="Werk 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">
<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>
</article>
</dialog> -->
{% endblock content %}

72
the_works/views/werk.py Normal file
View File

@ -0,0 +1,72 @@
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 Werk, Reihe, Verlag, Werksform
bp = Blueprint("werk", __name__)
@bp.route("/werk/all")
@bp.route("/werk")
def read():
# build ORM equivalent of SELECT statement
stmt = (
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(stmt):
werke.append({
"id": row.Werk.ID,
"titel": row.Werk.Titel,
"untertitel": row.Werk.Untertitel or "",
"reihe": row.Reihe.Titel if row.Reihe else "",
"r_id": str(row.Reihe.ID) if row.Reihe else "",
"verlag": row.Verlag.Verlag if row.Verlag else "",
"v_id": str(row.Verlag.ID) if row.Verlag else "",
"werksform": row.Werksform.Werksform if row.Werksform else "",
"wf_id": str(row.Werksform.ID) if row.Werksform else ""
})
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.commit()
flash("Eintrag erfolgreich hinzugefügt")
"""
return redirect(url_for("werk.read"))
@bp.route("/werk/update/<int:id>", methods=["POST"])
def update(id):
"""# 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("werk.read"))
@bp.route("/werk/delete/<int:id>")
def delete(id):
""" text = db.session.get(Text, id)
db.session.delete(text)
db.session.commit()
flash("Eintrag erfolgreich gelöscht")
"""
return redirect(url_for("werk.read"))