Herausgeber can now be added, edited, and removed from Werk entries

This commit is contained in:
eclipse 2025-05-08 10:24:11 +02:00
parent 260b444966
commit d7d66a14c4
3 changed files with 55 additions and 7 deletions

View File

@ -4,6 +4,7 @@ from sqlalchemy.ext.associationproxy import association_proxy
class Text(db.Model):
__table__ = db.Model.metadata.tables['Text']
reihe = relationship("Reihe", back_populates="text")
textform = relationship("Textform", back_populates="text")
sprache = relationship("Sprache", back_populates="text")
@ -19,6 +20,8 @@ class Werk(db.Model):
veroeffentlichung = relationship("Veroeffentlichung", back_populates="werk")
werk_genre = relationship("Werk_Genre", back_populates="werk", cascade="save-update, merge, delete, delete-orphan")
genres = association_proxy("werk_genre", "Genre")
werk_herausgeber = relationship("Werk_Herausgeber", back_populates="werk", cascade="save-update, merge, delete, delete-orphan")
herausgeber = association_proxy("werk_herausgeber", "Herausgeber")
class Veroeffentlichung(db.Model):
__table__ = db.Model.metadata.tables['Veroeffentlichung']
@ -60,6 +63,7 @@ class Pseudonym(db.Model):
class Herausgeber(db.Model):
__table__ = db.Model.metadata.tables['Herausgeber']
werk_herausgeber = relationship("Werk_Herausgeber", back_populates="herausgeber")
class Text_Genre(db.Model):
__table__ = db.Model.metadata.tables['Text_Genre']
@ -77,3 +81,11 @@ class Werk_Genre(db.Model):
def __init__(self, genre: int):
self.Genre = genre
class Werk_Herausgeber(db.Model):
__table__ = db.Model.metadata.tables['Werk_Herausgeber']
werk = relationship("Werk", back_populates="werk_herausgeber")
herausgeber = relationship("Herausgeber", back_populates="werk_herausgeber")
def __init__(self, hrsg: int):
self.Herausgeber = hrsg

View File

@ -114,13 +114,39 @@ Werk bearbeiten
</div>
</section>
<hr />
<section>
<fieldset>
<legend>Herausgeber:in(nen)</legend>
<div class="grid">
{% for column in hrsg | slice(4) %}
<div>
{% for h in column %}
<label>
<input id="form_Herausgeber_{{ h.ID }}" name="form_Herausgeber" type="checkbox" value="{{ h.ID }}" {% if h.ID in werk["Herausgeber"] %} checked {% endif %}/>
{{ h.Name }}
</label>
{% endfor %}
</div>
{% endfor %}
</div>
</fieldset>
</section>
<hr />
<section>
<fieldset>
<legend>Genre(s)</legend>
{% for g in genres %}
<input id="form_Genres_{{ g.ID }}" name="form_Genres" type="checkbox" value="{{ g.ID }}" {% if g.ID in werk["Genres"] %} checked {% endif %}/>
<label for="form_Genres_{{ g.ID }}">{{ g.Genre }}</label>
{% endfor %}
<div class="grid">
{% for column in genres | slice(4) %}
<div>
{% for g in column %}
<label>
<input id="form_Genres_{{ g.ID }}" name="form_Genres" type="checkbox" value="{{ g.ID }}" {% if g.ID in werk["Genres"] %} checked {% endif %}/>
{{ g.Genre }}
</label>
{% endfor %}
</div>
{% endfor %}
</div>
</fieldset>
</section>
<hr />

View File

@ -1,7 +1,7 @@
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, Werk_Genre, Genre
from the_works.models import Werk, Reihe, Verlag, Werksform, Werk_Genre, Genre, Werk_Herausgeber, Herausgeber
bp = Blueprint("werk", __name__)
@ -32,7 +32,7 @@ def all():
def read(id):
# id of zero -> create new entry
if id == 0:
return render_template("views/werk_detail.html", werk={"ID": 0, "Erscheinungsdatum": ""}, reihen=db.session.scalars(select(Reihe)), verlage=db.session.scalars(select(Verlag)), werksformen=db.session.scalars(select(Werksform)), genres=db.session.scalars(select(Genre)))
return render_template("views/werk_detail.html", werk={"ID": 0, "Erscheinungsdatum": ""}, reihen=db.session.scalars(select(Reihe)), verlage=db.session.scalars(select(Verlag)), werksformen=db.session.scalars(select(Werksform)), genres=db.session.scalars(select(Genre)), hrsg=db.session.scalars(select(Herausgeber)))
# all other ids -> update existing entry
w = db.session.get(Werk, id)
werk = {
@ -51,9 +51,10 @@ def read(id):
"Titelbild": "",
"Klappentext": w.Klappentext or "",
"Anmerkungen": w.Anmerkungen or "",
"Herausgeber": w.herausgeber,
"Genres": w.genres
}
return render_template("views/werk_detail.html", werk=werk, reihen=db.session.scalars(select(Reihe)), verlage=db.session.scalars(select(Verlag)), werksformen=db.session.scalars(select(Werksform)), genres=db.session.scalars(select(Genre)))
return render_template("views/werk_detail.html", werk=werk, reihen=db.session.scalars(select(Reihe)), verlage=db.session.scalars(select(Verlag)), werksformen=db.session.scalars(select(Werksform)), genres=db.session.scalars(select(Genre)), hrsg=db.session.scalars(select(Herausgeber)))
@bp.route("/werk/create", methods=["POST"])
def create():
@ -75,6 +76,8 @@ def create():
)
for g in request.form.getlist("form_Genres"):
werk.genres.append(g)
for h in request.form.getlist("form_Herausgeber"):
werk.herausgeber.append(h)
db.session.add(werk)
db.session.commit()
flash("Eintrag erfolgreich hinzugefügt")
@ -108,6 +111,13 @@ def update(id):
for g in form_set - set(werk.genres):
werk.genres.append(g)
# update herausgeber list by removing names not in form selection and adding selected ones not currently in list
form_set = set(map(lambda h: int(h), request.form.getlist("form_Herausgeber")))
for h in set(werk.herausgeber) - form_set:
werk.herausgeber.remove(h)
for h in form_set - set(werk.herausgeber):
werk.herausgeber.append(h)
# commit changes
db.session.commit()
flash("Eintrag erfolgreich geändert")