added support for DB tables "Genre" and "Pseudonym"
This commit is contained in:
parent
4bba6fdfd1
commit
4f58b076b6
@ -19,7 +19,7 @@ def create_app():
|
|||||||
init_db(app)
|
init_db(app)
|
||||||
|
|
||||||
# register blueprints
|
# register blueprints
|
||||||
from the_works.views import home, text, werk, verlag, sprache, textform, werksform
|
from the_works.views import home, text, werk, verlag, sprache, textform, werksform, genre, pseudonym
|
||||||
app.register_blueprint(text.bp)
|
app.register_blueprint(text.bp)
|
||||||
app.register_blueprint(home.bp)
|
app.register_blueprint(home.bp)
|
||||||
app.register_blueprint(werk.bp)
|
app.register_blueprint(werk.bp)
|
||||||
@ -27,6 +27,8 @@ def create_app():
|
|||||||
app.register_blueprint(sprache.bp)
|
app.register_blueprint(sprache.bp)
|
||||||
app.register_blueprint(textform.bp)
|
app.register_blueprint(textform.bp)
|
||||||
app.register_blueprint(werksform.bp)
|
app.register_blueprint(werksform.bp)
|
||||||
|
app.register_blueprint(genre.bp)
|
||||||
|
app.register_blueprint(pseudonym.bp)
|
||||||
|
|
||||||
### DEBUG
|
### DEBUG
|
||||||
toolbar = DebugToolbarExtension(app)
|
toolbar = DebugToolbarExtension(app)
|
||||||
|
|||||||
@ -42,4 +42,9 @@ class Werksform(db.Model):
|
|||||||
__table__ = db.Model.metadata.tables['Werksform']
|
__table__ = db.Model.metadata.tables['Werksform']
|
||||||
werk = relationship("Werk", back_populates="werksform")
|
werk = relationship("Werk", back_populates="werksform")
|
||||||
|
|
||||||
|
class Genre(db.Model):
|
||||||
|
__table__ = db.Model.metadata.tables['Genre']
|
||||||
|
|
||||||
|
class Pseudonym(db.Model):
|
||||||
|
__table__ = db.Model.metadata.tables['Pseudonym']
|
||||||
|
|
||||||
|
|||||||
@ -16,5 +16,7 @@
|
|||||||
<li><a href="{{ url_for('sprache.all') }}">Sprachen</a></li>
|
<li><a href="{{ url_for('sprache.all') }}">Sprachen</a></li>
|
||||||
<li><a href="{{ url_for('textform.all') }}">Textformen</a></li>
|
<li><a href="{{ url_for('textform.all') }}">Textformen</a></li>
|
||||||
<li><a href="{{ url_for('werksform.all') }}">Werksformen</a></li>
|
<li><a href="{{ url_for('werksform.all') }}">Werksformen</a></li>
|
||||||
|
<li><a href="{{ url_for('genre.all') }}">Genres</a></li>
|
||||||
|
<li><a href="{{ url_for('pseudonym.all') }}">Pseudonyme</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|||||||
103
the_works/templates/views/genre.html
Normal file
103
the_works/templates/views/genre.html
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
|
{% block title %}Genres{% endblock title %}
|
||||||
|
|
||||||
|
{% block script %}
|
||||||
|
<script>
|
||||||
|
const SCRIPT_ROOT = {{ request.script_root | tojson }};
|
||||||
|
|
||||||
|
function showCreateModal() {
|
||||||
|
// set modal heading
|
||||||
|
document.getElementById("dialog-heading").textContent = "Genre hinzufügen";
|
||||||
|
// empty text input
|
||||||
|
document.getElementById("form_Genre").value = "";
|
||||||
|
// set form action
|
||||||
|
document.getElementById("form_submit").formAction = "{{ url_for('genre.create') }}";
|
||||||
|
// show modal
|
||||||
|
document.getElementById("genremodal").showModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showUpdateModal() {
|
||||||
|
// set modal heading
|
||||||
|
document.getElementById("dialog-heading").textContent = "Genre bearbeiten";
|
||||||
|
// populate text input
|
||||||
|
document.getElementById("form_Genre").value = this.dataset.genre;
|
||||||
|
// set form action
|
||||||
|
document.getElementById("form_submit").formAction = `${SCRIPT_ROOT}/genre/update/${this.dataset.id}`;
|
||||||
|
// show modal
|
||||||
|
document.getElementById("genremodal").showModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onload = function () {
|
||||||
|
// initialise DataTable
|
||||||
|
let table = new DataTable('#genretable', {
|
||||||
|
paging: false,
|
||||||
|
order: []
|
||||||
|
});
|
||||||
|
deRole("#genretable");
|
||||||
|
|
||||||
|
// create and append "New"-button to
|
||||||
|
let button = document.createElement("button");
|
||||||
|
button.id = "create-button";
|
||||||
|
button.setAttribute("title", "Genre hinzufügen");
|
||||||
|
button.innerHTML = "Neu …";
|
||||||
|
button.addEventListener("click", showCreateModal, false);
|
||||||
|
document.getElementById("genretable_wrapper").firstElementChild.firstElementChild.appendChild(button);
|
||||||
|
|
||||||
|
// add event listeners
|
||||||
|
document.getElementById ("create-button").addEventListener("click", showCreateModal, false);
|
||||||
|
for (const el of document.querySelectorAll('.action-update') ) {
|
||||||
|
el.addEventListener("click", showUpdateModal, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>{% endblock script %}
|
||||||
|
|
||||||
|
{% block heading %}Genres{% endblock heading %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
{% include "_icons.svg" %}
|
||||||
|
|
||||||
|
<table id="genretable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Genre</th>
|
||||||
|
<th colspan="2">Aktionen</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for genre in genres %}
|
||||||
|
<tr id="genre-{{ genre['ID'] }}">
|
||||||
|
<td title="Genre">{{ genre["Genre"] }}</td>
|
||||||
|
<td class="action action-update" data-id="{{ genre['ID'] }}" data-genre="{{genre['Genre'] }}"><a href="#" title="Genre bearbeiten"><svg viewbox="0 0 24 24"><use href="#update" /></svg></a></td>
|
||||||
|
<td id="delete-{{ genre['ID'] }}" class="action"><a onclick="return confirm('Eintrag wirklich löschen?');" href="{{ url_for('genre.delete', id=genre['ID']) }}" title="Genre löschen"><svg viewbox="0 0 24 24"><use href="#delete" /></svg></a></td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<dialog aria-labelledby="dialog-heading" id="genremodal">
|
||||||
|
<article>
|
||||||
|
<form id="genre_detail_form" method="post" >
|
||||||
|
<header>
|
||||||
|
<button aria-label="close" rel="prev" onclick="genremodal.close()"></button>
|
||||||
|
<h1 id="dialog-heading">#</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<article>
|
||||||
|
<label>
|
||||||
|
Genre (erforderlich)
|
||||||
|
<input id="form_Genre" name="form_Genre" aria-Label="Genre" placeholder="Genre" required autofocus />
|
||||||
|
</label>
|
||||||
|
</article>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<footer class="grid">
|
||||||
|
<button id="form_submit" type="submit" formmethod="post" formaction="{{ url_for('genre.create') }}">OK</button>
|
||||||
|
<button class="secondary" aria-label="close" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</article>
|
||||||
|
</dialog>
|
||||||
|
{% endblock content %}
|
||||||
103
the_works/templates/views/pseudonym.html
Normal file
103
the_works/templates/views/pseudonym.html
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
|
{% block title %}Pseudonyme{% endblock title %}
|
||||||
|
|
||||||
|
{% block script %}
|
||||||
|
<script>
|
||||||
|
const SCRIPT_ROOT = {{ request.script_root | tojson }};
|
||||||
|
|
||||||
|
function showCreateModal() {
|
||||||
|
// set modal heading
|
||||||
|
document.getElementById("dialog-heading").textContent = "Pseudonym hinzufügen";
|
||||||
|
// empty text input
|
||||||
|
document.getElementById("form_Pseudonym").value = "";
|
||||||
|
// set form action
|
||||||
|
document.getElementById("form_submit").formAction = "{{ url_for('pseudonym.create') }}";
|
||||||
|
// show modal
|
||||||
|
document.getElementById("pseudonymmodal").showModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showUpdateModal() {
|
||||||
|
// set modal heading
|
||||||
|
document.getElementById("dialog-heading").textContent = "Pseudonym bearbeiten";
|
||||||
|
// populate text input
|
||||||
|
document.getElementById("form_Pseudonym").value = this.dataset.pseudonym;
|
||||||
|
// set form action
|
||||||
|
document.getElementById("form_submit").formAction = `${SCRIPT_ROOT}/pseudonym/update/${this.dataset.id}`;
|
||||||
|
// show modal
|
||||||
|
document.getElementById("pseudonymmodal").showModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onload = function () {
|
||||||
|
// initialise DataTable
|
||||||
|
let table = new DataTable('#pseudonymtable', {
|
||||||
|
paging: false,
|
||||||
|
order: []
|
||||||
|
});
|
||||||
|
deRole("#pseudonymtable");
|
||||||
|
|
||||||
|
// create and append "New"-button to
|
||||||
|
let button = document.createElement("button");
|
||||||
|
button.id = "create-button";
|
||||||
|
button.setAttribute("title", "Pseudonym hinzufügen");
|
||||||
|
button.innerHTML = "Neu …";
|
||||||
|
button.addEventListener("click", showCreateModal, false);
|
||||||
|
document.getElementById("pseudonymtable_wrapper").firstElementChild.firstElementChild.appendChild(button);
|
||||||
|
|
||||||
|
// add event listeners
|
||||||
|
document.getElementById ("create-button").addEventListener("click", showCreateModal, false);
|
||||||
|
for (const el of document.querySelectorAll('.action-update') ) {
|
||||||
|
el.addEventListener("click", showUpdateModal, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>{% endblock script %}
|
||||||
|
|
||||||
|
{% block heading %}Pseudonyme{% endblock heading %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
{% include "_icons.svg" %}
|
||||||
|
|
||||||
|
<table id="pseudonymtable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Pseudonym</th>
|
||||||
|
<th colspan="2">Aktionen</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for pseudonym in pseudonyme %}
|
||||||
|
<tr id="pseudonym-{{ pseudonym['ID'] }}">
|
||||||
|
<td title="Pseudonym">{{ pseudonym["Pseudonym"] }}</td>
|
||||||
|
<td class="action action-update" data-id="{{ pseudonym['ID'] }}" data-pseudonym="{{pseudonym['Pseudonym'] }}"><a href="#" title="Pseudonym bearbeiten"><svg viewbox="0 0 24 24"><use href="#update" /></svg></a></td>
|
||||||
|
<td id="delete-{{ pseudonym['ID'] }}" class="action"><a onclick="return confirm('Eintrag wirklich löschen?');" href="{{ url_for('pseudonym.delete', id=pseudonym['ID']) }}" title="Pseudonym löschen"><svg viewbox="0 0 24 24"><use href="#delete" /></svg></a></td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<dialog aria-labelledby="dialog-heading" id="pseudonymmodal">
|
||||||
|
<article>
|
||||||
|
<form id="pseudonym_detail_form" method="post" >
|
||||||
|
<header>
|
||||||
|
<button aria-label="close" rel="prev" onclick="pseudonymmodal.close()"></button>
|
||||||
|
<h1 id="dialog-heading">#</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<fieldset>
|
||||||
|
<article>
|
||||||
|
<label>
|
||||||
|
Pseudonym (erforderlich)
|
||||||
|
<input id="form_Pseudonym" name="form_Pseudonym" aria-Label="Pseudonym" placeholder="Pseudonym" required autofocus />
|
||||||
|
</label>
|
||||||
|
</article>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<footer class="grid">
|
||||||
|
<button id="form_submit" type="submit" formmethod="post" formaction="{{ url_for('pseudonym.create') }}">OK</button>
|
||||||
|
<button class="secondary" aria-label="close" formmethod="dialog" formnovalidate>Abbrechen</button>
|
||||||
|
</footer>
|
||||||
|
</form>
|
||||||
|
</article>
|
||||||
|
</dialog>
|
||||||
|
{% endblock content %}
|
||||||
39
the_works/views/genre.py
Normal file
39
the_works/views/genre.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
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 Genre
|
||||||
|
|
||||||
|
bp = Blueprint("genre", __name__)
|
||||||
|
|
||||||
|
@bp.route("/genre")
|
||||||
|
@bp.route("/genre/all")
|
||||||
|
def all():
|
||||||
|
return render_template("views/genre.html", genres=db.session.scalars(select(Genre)))
|
||||||
|
|
||||||
|
@bp.route("/text/genre/<int:id>")
|
||||||
|
def read(id):
|
||||||
|
return db.session.get(Genre, id)
|
||||||
|
|
||||||
|
@bp.route("/genre/create", methods=["POST"])
|
||||||
|
def create():
|
||||||
|
db.session.add(Genre(Genre = request.form["form_Genre"]))
|
||||||
|
db.session.commit()
|
||||||
|
flash("Eintrag erfolgreich hinzugefügt")
|
||||||
|
return redirect(url_for("genre.all"), code=303)
|
||||||
|
|
||||||
|
@bp.route("/genre/update/<int:id>", methods=["POST"])
|
||||||
|
def update(id):
|
||||||
|
genre = db.session.get(Genre, id)
|
||||||
|
genre.Genre = request.form["form_Genre"]
|
||||||
|
db.session.commit()
|
||||||
|
flash("Eintrag erfolgreich geändert")
|
||||||
|
return redirect(url_for("genre.all"), code=303)
|
||||||
|
|
||||||
|
@bp.route("/genre/delete/<int:id>")
|
||||||
|
def delete(id):
|
||||||
|
genre = db.session.get(Genre, id)
|
||||||
|
db.session.delete(genre)
|
||||||
|
db.session.commit()
|
||||||
|
flash("Eintrag erfolgreich gelöscht")
|
||||||
|
return redirect(url_for("genre.all"))
|
||||||
|
|
||||||
39
the_works/views/pseudonym.py
Normal file
39
the_works/views/pseudonym.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
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 Pseudonym
|
||||||
|
|
||||||
|
bp = Blueprint("pseudonym", __name__)
|
||||||
|
|
||||||
|
@bp.route("/pseudonym")
|
||||||
|
@bp.route("/pseudonym/all")
|
||||||
|
def all():
|
||||||
|
return render_template("views/pseudonym.html", pseudonyme=db.session.scalars(select(Pseudonym)))
|
||||||
|
|
||||||
|
@bp.route("/text/pseudonym/<int:id>")
|
||||||
|
def read(id):
|
||||||
|
return db.session.get(Pseudonym, id)
|
||||||
|
|
||||||
|
@bp.route("/pseudonym/create", methods=["POST"])
|
||||||
|
def create():
|
||||||
|
db.session.add(Pseudonym(Pseudonym = request.form["form_Pseudonym"]))
|
||||||
|
db.session.commit()
|
||||||
|
flash("Eintrag erfolgreich hinzugefügt")
|
||||||
|
return redirect(url_for("pseudonym.all"), code=303)
|
||||||
|
|
||||||
|
@bp.route("/pseudonym/update/<int:id>", methods=["POST"])
|
||||||
|
def update(id):
|
||||||
|
pseudonym = db.session.get(Pseudonym, id)
|
||||||
|
pseudonym.Pseudonym = request.form["form_Pseudonym"]
|
||||||
|
db.session.commit()
|
||||||
|
flash("Eintrag erfolgreich geändert")
|
||||||
|
return redirect(url_for("pseudonym.all"), code=303)
|
||||||
|
|
||||||
|
@bp.route("/pseudonym/delete/<int:id>")
|
||||||
|
def delete(id):
|
||||||
|
pseudonym = db.session.get(Pseudonym, id)
|
||||||
|
db.session.delete(pseudonym)
|
||||||
|
db.session.commit()
|
||||||
|
flash("Eintrag erfolgreich gelöscht")
|
||||||
|
return redirect(url_for("pseudonym.all"))
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user