improved display and storage of Werk.Erscheinungsdatum:

- values are displayed in three separate input fields that are being validated on submit
- values are stored in the DB as either NULL or a string in format YYYY, YYYY-MM or YYYY-MM-DD
- also renamed template
This commit is contained in:
eclipse 2025-05-06 12:22:35 +02:00
parent 08f39e0d22
commit ef7947ff41
2 changed files with 49 additions and 7 deletions

View File

@ -1,5 +1,6 @@
{% extends 'base.html' %}
{% set create_mode = (werk['ID'] == 0) %}
{% block title %}
{% if create_mode %}
Neues Werk erstellen
@ -9,6 +10,27 @@ Werk bearbeiten
{% endblock title %}
{% block script %}
<script>
function validate_date() {
let t = document.getElementById("form_Erscheinungstag");
let m = document.getElementById("form_Erscheinungsmonat");
let j = document.getElementById("form_Erscheinungsjahr");
t.setCustomValidity("");
m.setCustomValidity("");
console.log("This is function validate_date(): tag/monat/jahr is " + t.value + "/" + m.value + "/" + j.value); //DEBUG
if ( t.value != "" ) {
if ( j.value == "" || m.value == "" ) {
t.setCustomValidity("wenn der Tag angegeben ist, müssen Monat und Jahr ebenfalls angegeben sein");
t.reportValidity();
}
} else if ( m.value != "" ) {
if ( j.value == "") {
m.setCustomValidity("wenn der Monat angegeben ist, muss das Jahr ebenfalls angegeben sein");
m.reportValidity();
}
}
}
</script>
{% endblock script %}
{% block heading %}
@ -65,8 +87,12 @@ Werk bearbeiten
<input id="form_Preis" name="form_Preis" aria-label="Preis" placeholder="kein Preis" value="{{ werk['Preis'] }}" />
</label>
<label>
Erscheinungsdatum
<input type="date" id="form_Erscheinungsdatum" name="form_Erscheinungsdatum" aria-label="Erscheinungsdatum" placeholder="kein Datum" value="{{ werk['Datum'] }}" />
Erscheinungsdatum (TT-MM-JJJJ, MM-JJJJ, JJJJ oder leer)
<div class="grid">
<input type="number" min="1" max="31" id="form_Erscheinungstag" name="form_Erscheinungstag" aria-label="Erscheinungstag" placeholder="Tag" value="{{ werk['Erscheinungsdatum'][8:] }}" />
<input type="number" min="1" max="12" id="form_Erscheinungsmonat" name="form_Erscheinungsmonat" aria-label="Erscheinungsmonat" placeholder="Monat" value="{{ werk['Erscheinungsdatum'][5:7] }}" />
<input type="number" min="1980" max="2100" id="form_Erscheinungsjahr" name="form_Erscheinungsjahr" aria-label="Erscheinungsjahr" placeholder="Jahr" value="{{ werk['Erscheinungsdatum'][:4] }}" />
</div>
</label>
<label>
ISBN-13
@ -100,7 +126,7 @@ Werk bearbeiten
</label>
</div>
<footer class="grid">
<button id="form_submit" type="submit" formmethod="post" formaction="{% if create_mode %}{{ url_for('werk.create') }}{% else %}{{ url_for('werk.update', id=werk['ID']) }}{% endif %}">
<button id="form_submit" type="submit" onclick="return validate_date()" formmethod="post" formaction="{% if create_mode %}{{ url_for('werk.create') }}{% else %}{{ url_for('werk.update', id=werk['ID']) }}{% endif %}">
{% if create_mode %}Eintrag speichern{% else %}Änderungen speichern{% endif %}
</button>
<button type="reset" title="Alle Felder auf den vorherigen Zustand zurücksetzen">Alles zurücksetzen</button>

View File

@ -30,7 +30,7 @@ def all():
def read(id):
# id of zero -> create new entry
if id == 0:
return render_template("views/werk_full.html", werk={"ID": 0}, reihen=db.session.scalars(select(Reihe)), verlage=db.session.scalars(select(Verlag)), werksformen=db.session.scalars(select(Werksform)))
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)))
# all other ids -> update existing entry
w = db.session.get(Werk, id)
werk = {
@ -50,10 +50,13 @@ def read(id):
"Klappentext": w.Klappentext or "",
"Anmerkungen": w.Anmerkungen or ""
}
return render_template("views/werk_full.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_detail.html", werk=werk, 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():
datum = get_datum(request.form["form_Erscheinungsjahr"], request.form["form_Erscheinungsmonat"], request.form["form_Erscheinungstag"])
print(f"/werk/create: datum is {datum}") #DEBUG
# create new entry
db.session.add(Werk(
Titel = request.form["form_Titel"],
Untertitel = request.form["form_Untertitel"] or None,
@ -61,7 +64,7 @@ def create():
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,
Erscheinungsdatum = datum,
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,
@ -76,6 +79,8 @@ def create():
@bp.route("/werk/update/<int:id>", methods=["POST"])
def update(id):
datum = get_datum(request.form["form_Erscheinungsjahr"], request.form["form_Erscheinungsmonat"], request.form["form_Erscheinungstag"])
print(f"/werk/update/{id}: datum is {datum}") #DEBUG
# get record
werk = db.session.get(Werk, id)
# update values
@ -85,7 +90,7 @@ def update(id):
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.Erscheinungsdatum = datum
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
@ -105,3 +110,14 @@ def delete(id):
db.session.commit()
flash("Eintrag erfolgreich gelöscht")
return redirect(url_for("werk.all"))
def get_datum(jahr, monat, tag):
if tag != "":
return "-".join([jahr, monat.zfill(2), tag.zfill(2)])
elif monat != "":
return "-".join([jahr, monat.zfill(2)])
elif jahr != "":
return jahr
else:
return None