Initialisierung: Übertragung aus altem Repository

This commit is contained in:
2021-07-12 00:49:07 +02:00
commit c7f0c6a1c4
80 changed files with 12063 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
{% extends 'base.html.j2' %}
{#
NateMan Nachschreibtermin-Manager
templates/klausuren/add.html.j2
Copyright © 2020 Niklas Elsbrock
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
#}
{% block title %}Klausur hinzufügen{% endblock %}
{% block header %}Klausur hinzufügen{% endblock %}
{% block js_body_end %}
var startperiod_input = document.getElementById('startperiod-input');
var endperiod_input = document.getElementById('endperiod-input');
startperiod_input.onchange = function () {
endperiod_input.min = parseInt(startperiod_input.value);
}
// beim Laden der Seite einmal ausführen
startperiod_input.onchange();
{% endblock %}
{% block content %}
<form method="post">
<div class="table-aligned">
<div>
<div>Stufe:</div>
<div>{{ stufe.name }}</div>
</div>
<div>
<div><label for="kursname-input">Kursname:</label></div>
<div><input type="text" name="kursname" id="kursname-input" placeholder="z.B. M-GK3" required autofocus></div>
</div>
<div>
<div><label for="lehrer-select">Kurslehrer(in):</label></div>
<div>
<select name="lehrer" id="lehrer-select" required>
<option value="" selected disabled>Bitte auswählen</option>
{% for l in Lehrer.query.order_by(Lehrer.kuerzel).all() %}
<option value="{{ l.id }}">{{ l.kuerzel }}</option>
{% endfor %}
</select>
</div>
</div>
<div>
<div><label for="date-input">Klausurdatum:</label></div>
<div><input type="date" name="date" id="date-input" required></div>
</div>
<div>
<div>Klausurzeitraum:</div>
<div>
<input type="number" name="startperiod" id="startperiod-input" class="small" min="0" max="2147483647"
required>{#
#}. bis
<input type="number" name="endperiod" id="endperiod-input" class="small" min="0" max="2147483647"
required>{#
#}. Stunde
</div>
</div>
</div>
<p><input type="submit" value="Hinzufügen"></p>
</form>
{% endblock %}
+348
View File
@@ -0,0 +1,348 @@
{% extends 'base.html.j2' %}
{#
NateMan Nachschreibtermin-Manager
templates/klausuren/edit.html.j2
Copyright © 2020 Niklas Elsbrock
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
#}
{% block title %}
Klausur: {{ klausur.kursname }}
({{ klausur.date_formatted() }}; {{ klausur.lehrer.kuerzel }}, {{ klausur.stufe.name }})
{% endblock %}
{% block header %}
Klausur: {{ klausur.kursname }}
({{ klausur.date_formatted() }}; {{ klausur.lehrer.kuerzel }}, {{ klausur.stufe.name }})
{% endblock %}
{# klausur #}
{# kt_list: Liste aller Klausurteilnahmen dieser Klausur #}
{# not_in_klausur_list: Liste aller Schüler dieser Stufe, die nicht in dieser Klausur sind #}
{% set lehrer_can_access = g.lehrer.can_access(klausur.stufe) %}
{% set is_bygone = klausur.is_bygone() %}
{% set no_edit = (klausur.edited or not is_bygone) and not lehrer_can_access %}
{% block js_body_end %}
var schuelerCBs = document.getElementsByClassName("schueler-cb");
for (scb of schuelerCBs) {
scb.onchange = function () {
if (this.checked) {
this.parentNode.classList.add("marked");
} else {
this.parentNode.classList.remove("marked");
}
}
// beim Laden der Seite einmal ausführen
scb.onchange();
}
{% if not no_edit %}
var noneVersaeumtCB = document.getElementById("none-versaeumt");
noneVersaeumtCB.onchange = function () {
for (scb of schuelerCBs) {
scb.disabled = this.checked;
if (this.checked) {
scb.checked = false;
scb.onchange();
}
}
};
// beim Laden der Seite einmal ausführen
noneVersaeumtCB.onchange();
{% if lehrer_can_access %}
var laengeSelect = document.getElementById("laenge-select");
var flagAsEditedCb = document.getElementById("flag-as-edited-cb");
flagAsEditedCb.onchange = function () {
laengeSelect.required = this.checked;
}
// beim Laden der Seite einmal ausführen
flagAsEditedCb.onchange();
{% endif %}
var editSubmit = document.getElementById("edit-submit");
editSubmit.onclick = function () {
if (!noneVersaeumtCB.checked) {
var ok = false;
for (scb of schuelerCBs) {
if (scb.checked) {
ok = true;
break;
}
}
if (!ok {% if lehrer_can_access %} && flagAsEditedCb.checked {% endif %}) {
alert("Bitte wählen Sie etwas aus.");
return false;
}
}
{% if not lehrer_can_access %}
return confirm("Wollen Sie wirklich speichern?\nSie können die Klausur danach nicht mehr bearbeiten.");
{% else %}
return true;
{% endif %}
};
var selectNode = document.getElementById("added-schueler");
var addNewKoopSchuelerFormNode = document.getElementById("add-new-schueler-form");
var nksNachnameInputNode = document.getElementById("new-schueler-nachname-input");
var nksVornameInputNode = document.getElementById("new-schueler-vorname-input");
selectNode.onchange = function() {
if (selectNode.value === "new-schueler") {
addNewKoopSchuelerFormNode.style.display = "";
nksNachnameInputNode.required = true;
nksVornameInputNode.required = true;
} else {
addNewKoopSchuelerFormNode.style.display = "none";
nksNachnameInputNode.required = false;
nksVornameInputNode.required = false;
}
};
// beim Laden der Seite einmal ausführen
selectNode.onchange();
{% endif %}
{% if lehrer_can_access %}
var new_startperiod_input = document.getElementById('new-startperiod-input');
var new_endperiod_input = document.getElementById('new-endperiod-input');
new_startperiod_input.onchange = function () {
new_endperiod_input.min = parseInt(new_startperiod_input.value);
}
// beim Laden der Seite einmal ausführen
new_startperiod_input.onchange();
{% endif %}
{% endblock %}
{% block content %}
{% if not is_bygone %}
<p class="warn">Diese Klausur hat noch nicht stattgefunden.</p>
{% endif %}
{% if klausur.edited %}
<p class="warn">Diese Klausur wurde bereits bearbeitet.</p>
{% endif %}
<p class="description">
{{ zeitraum(klausur) }} Stunde;
{{ Klausurteilnahme.query.filter_by(klausur_id=klausur.id).count() }} Schüler(innen)
</p>
<form method="post">
<input type="hidden" name="action" value="edit">
<p>
<label>
Länge der Klausur:
<select name="laenge" id="laenge-select" required {% if no_edit %} disabled {% endif %}>
<option value="" {% if klausur.laenge is none %} selected {% endif %}
{% if not lehrer_can_access %} disabled {% endif %}>Bitte auswählen</option>
{% for l in nateman_config['klausuren']['klausurlaengen'] %}
<option value="{{ l }}" {% if l == klausur.laenge %} selected {% endif %}>{{ l }} Minuten</option>
{% endfor %}
</select>
</label>
</p>
{% if not no_edit %}
<p>
Setzen Sie <i>entweder</i> ein Häkchen dafür, dass kein(e) Schüler(in) die Klausur versäumt hat<br>
<i>oder</i> setzen Sie ein Häkchen bei allen Schüler(inne)n, die die Klausur versäumt haben.<br>
Gehört ein(e) Schüler(in) <i>nicht</i> mehr zum Kurs, entfernen Sie diese(n) durch Anklicken von 'x'.<br>
Klicken Sie anschließend auf 'Speichern'.
</p>
{% endif %}
<p>
<label>
<input type="checkbox" id="none-versaeumt" {% if no_edit %} disabled {% endif %}
{%
if klausur.edited and Klausurteilnahme.query.filter_by(klausur=klausur).filter_by(versaeumt=True).count() == 0
%}
checked
{% endif %}>
<b>kein(e)</b> Schüler(in) hat versäumt
</label>
</p>
<p id="schueler-list">
{% for kt in kt_list %}
<label class="schueler-cb-container">
<input type="checkbox" name="s_{{ kt.schueler.id }}" id="s_{{ kt.schueler.id }}" class="schueler-cb"
{% if kt.versaeumt %} checked {% endif %} {% if no_edit %} disabled {% endif %}>
{{ kt.schueler.nachname }}, {{ kt.schueler.vorname }}
<span class="detail">
({% if kt.schueler.stammschule is not none %}{{ kt.schueler.stammschule.name }},
{% endif %}{{ kt.schueler.id }})
</span>
</label>
<input type="submit" form="remove-form" name="r_{{ kt.schueler.id }}" class="plain" value="&#xD7;"
title="entfernen" {% if no_edit %} disabled {% endif %}>
<br>
{% endfor %}
</p>
<p>
<label>
Bemerkung:
<input type="text" name="annotation" maxlength="{{ nateman_config['klausuren']['max-annotation-length'] }}"
value="{% if klausur.annotation %}{{ klausur.annotation }}{% endif %}" placeholder="optional"
{% if no_edit %} disabled {% endif %}>
</label>
</p>
{% if lehrer_can_access %}
<p>
<label>
<input type="checkbox" name="flag-as-edited" id="flag-as-edited-cb"
{% if is_bygone %} checked {% endif %}>
als bearbeitet markieren
</label>
</p>
{% endif %}
<p><input type="submit" id="edit-submit" value="Speichern" {% if no_edit %} disabled {% endif %}></p>
</form>
<form id="remove-form" method="post">
<input type="hidden" name="action" value="remove-schueler">
</form>
{% if not no_edit %}
<hr>
<form method="post">
<input type="hidden" name="action" value="add-schueler">
<p>
Fügen Sie eine(n) Schüler(in) hinzu, falls der/die Schüler(in) nicht bereits<br>
automatisch in der obigen Liste aufgeführt sein sollte.<br>
Nach dem Hinzufügen kann der/die Schüler(in) als versäumend markiert werden.
</p>
<h3>Schüler(in) hinzufügen:
<select name="added-schueler" id="added-schueler" required>
<option value="" selected disabled>Bitte auswählen</option>
<option value="new-schueler">Neue(n) Schüler(in) hinzufügen...</option>
{% for schueler in not_in_klausur_list %}
<option value="{{ schueler.id }}">{{ schueler.nachname }}, {{ schueler.vorname }}
({% if schueler.stammschule is not none %}{{ schueler.stammschule.name }}, {% endif %}{{ schueler.id }})
</option>
{% endfor %}
</select>
</h3>
<div id="add-new-schueler-form">
<p>
Bevor Sie eine(n) neue(n) Schüler(in) hinzufügen, überprüfen Sie bitte,
ob diese(r) nicht bereits in der obigen Auswahl vorhanden ist.<br>
<b>Tipp:</b> In den meisten Browsern können Sie bei geöffneter Auswahl
den Nachnamen eingeben, um nach einem/einer Schüler(in) zu suchen.
</p>
<div class="table-aligned">
<div>
<div><label for="new-schueler-nachname-input">Nachname:</label></div>
<div><input type="text" name="new-schueler-nachname" id="new-schueler-nachname-input"></div>
</div>
<div>
<div><label for="new-schueler-nachname-input">Vorname:</label></div>
<div><input type="text" name="new-schueler-vorname" id="new-schueler-vorname-input"></div>
</div>
<div>
<div><label for="new-schueler-stammschule-select">Stammschule:</label></div>
<div>
<select name="new-schueler-stammschule" id="new-schueler-stammschule-select">
<option value="" selected>(kein(e) Koop-Schüler(in))</option>
{% for ks in Koopschule.query.all() %}
<option value="{{ ks.kuerzel }}">{{ ks.name }}</option>
{% endfor %}
</select>
</div>
</div>
</div>
</div>
<fieldset>
<label><input type="radio" name="add-to" value="klausur">Hinzufügen zu dieser Klausur</label><br>
<label><input type="radio" name="add-to" value="kurs" checked>Hinzufügen zu allen Klausuren dieses Kurses</label>
</fieldset>
<p><input type="submit" value="Hinzufügen"></p>
</form>
{% if lehrer_can_access %}
<hr>
<h3>Erweiterte Einstellungen</h3>
<form method="post">
<input type="hidden" name="action" value="edit-advanced">
<div class="table-aligned">
<div>
<div><label for="new-lehrer-select">Kurslehrer(in):</label></div>
<div>
<select name="new-lehrer" id="new-lehrer-select">
{% for l in Lehrer.query.order_by(Lehrer.kuerzel).all() %}
<option value="{{ l.id }}" {% if l == klausur.lehrer %}selected{% endif %}>{{ l.kuerzel }}</option>
{% endfor %}
</select>
</div>
</div>
<div>
<div><label for="new-date-input">Klausurdatum:</label></div>
<div>
<input type="date" name="new-date" id="new-date-input"
value="{{ klausur.date.strftime('%Y-%m-%d') }}" required>
</div>
</div>
<div>
<div>Klausurzeitraum:</div>
<div>
<input type="number" name="new-startperiod" id="new-startperiod-input" class="small" min="0"
max="2147483647" value="{{ klausur.startperiod }}" required>{#
#}. bis
<input type="number" name="new-endperiod" id="new-endperiod-input" class="small" min="0" max="2147483647"
value="{{ klausur.endperiod }}" required>{#
#}. Stunde
</div>
</div>
</div>
<p><input type="submit" value="Speichern"></p>
</form>
<form method="post">
<input type="hidden" name="action" value="delete">
<p>
<input type="submit" value="Diese Klausur löschen"
onclick="return confirm('Soll diese Klausur wirklich gelöscht werden?')">
</p>
</form>
{% endif %}
{% endif %}
{% endblock %}
+91
View File
@@ -0,0 +1,91 @@
{% extends 'base.html.j2' %}
{#
NateMan Nachschreibtermin-Manager
templates/klausuren/mine.html.j2
Copyright © 2020 Niklas Elsbrock
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
#}
{% block title %}Meine Klausuren{% endblock %}
{% block header %}Meine Klausuren{% endblock %}
{# klausuren_anstehend #}
{# klausuren_vergangen #}
{% block content %}
<h3>vergangen:</h3>
{% if klausuren_vergangen|length == 0 %}
<p>keine</p>
{% else %}
<table>
<thead>
<tr>
<th>Datum</th>
<th>Stufe</th>
<th>Kurs</th>
<th>Zeitraum</th>
<th>bearbeitet</th>
</tr>
</thead>
<tbody>
{% for kv in klausuren_vergangen %}
<tr class="clickable" tabindex="0" data-href="{{ url_for('klausuren.edit', klausur_id=kv.id) }}">
<td>{{ kv.date_formatted() }}</td>
<td>{{ kv.stufe.name }}</td>
<td>{{ kv.kursname }}</td>
<td>{{ zeitraum(kv) }} Std.</td>
{% if kv.edited %}
<td class="positive-status">ja</td>
{% else %}
<td class="negative-status">nein</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
<h3>anstehend:</h3>
{% if klausuren_anstehend|length == 0 %}
<p>keine</p>
{% else %}
<table>
<thead>
<tr>
<th>Datum</th>
<th>Stufe</th>
<th>Kurs</th>
<th>Zeitraum</th>
</tr>
</thead>
<tbody>
{% for ka in klausuren_anstehend %}
<tr class="clickable" tabindex="0" data-href="{{ url_for('klausuren.edit', klausur_id=ka.id) }}">
<td>{{ ka.date_formatted() }}</td>
<td>{{ ka.stufe.name }}</td>
<td>{{ ka.kursname }}</td>
<td>{{ zeitraum(ka) }} Std.</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% endblock %}
+113
View File
@@ -0,0 +1,113 @@
{% extends 'base.html.j2' %}
{#
NateMan Nachschreibtermin-Manager
templates/klausuren/stufe.html.j2
Copyright © 2020 Niklas Elsbrock
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
#}
{% block title %}Klausuren {{ stufe.name }}{% endblock %}
{% block header %}Klausuren {{ stufe.name }}{% endblock %}
{# stufe #}
{# dates_anstehend #}
{# dates_vergangen #}
{% set lehrer_can_access = g.lehrer is not none and g.lehrer.can_access(stufe) %}
{% set klausur_count = dates_anstehend | length + dates_vergangen | length %}
{% set beratungslehrer_list = Lehrer.query.filter_by(beraet=stufe).all() %}
{% block content %}
<p class="description">
Beratungslehrer(innen):
{% if beratungslehrer_list|length == 0 %}
keine
{% else %}
{% for l in beratungslehrer_list %}
{{ l.kuerzel }}{% if l.email is not none %} &lt;<a href="mailto:{{ l.email }}">{{ l.email }}</a>&gt;{% endif %}<!--
-->{% if not loop.last %},{% endif %}
{% endfor %}
{% endif %}
</p>
{% if lehrer_can_access %}
<p><a href="{{ url_for('klausuren.add', stufe_name=stufe.name) }}" data-icon="&#xf0fe;">Klausur hinzufügen</a></p>
{% endif %}
{% if klausur_count != 0 %}
<p><a href="#heute" data-icon="&#xf103;">zu heute springen</a></p>
{% endif %}
{% if klausur_count == 0 %}
<p>keine</p>
{% else %}
{% for dates_list in (dates_anstehend, dates_vergangen) %}
{% if loop.index0 == 1 %}
<div id="heute" class="labeled-hr" data-icon="&#xf073;">heute ({{ util.format_date(datetime.now()) }})</div>
{% endif %}
{% for date in dates_list %}
{% set date_klausur_list = Klausur.query.filter_by(stufe=stufe, date=date).all() %}
{% set date_iso = date.strftime('%Y-%m-%d') %}
<h3>
<span>
{{ util.format_date(date) }}:
<a class="scroll-anchor" name="{{ date_iso }}" href="#{{ date_iso }}"></a>
</span>
</h3>
<table>
<thead>
<tr>
<th>Lehrer(in)</th>
<th>Kurs</th>
<th>Zeitraum</th>
{% if lehrer_can_access %}
<th>bearbeitet</th>
<th>Bemerkung</th>
{% endif %}
</tr>
</thead>
<tbody>
{% for k in date_klausur_list %}
<tr {% if lehrer_can_access %} class="clickable" tabindex="0"
data-href="{{ url_for('klausuren.edit', klausur_id=k.id) }}" {% endif %}>
<td>{{ k.lehrer.kuerzel }}</td>
<td>{{ k.kursname }}</td>
<td>{{ zeitraum(k) }} Std.</td>
{% if lehrer_can_access %}
{% if k.edited %}
<td class="positive-status">ja</td>
{% else %}
<td class="negative-status">nein</td>
{% endif %}
{% if k.annotation is not none %}
<td class="description">{{ k.annotation }}</td>
{% else %}
<td class="detail">keine</td>
{% endif %}
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
{% endfor %}
{% endfor %}
{% endif %}
{% endblock %}