Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce22239d78 | ||
|
|
92c8abb79b |
No files matched your search
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "tesm"
|
name = "tesm"
|
||||||
version = "2.7.2"
|
version = "2.7.3"
|
||||||
description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen"
|
description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
|||||||
@@ -104,10 +104,11 @@ TESM_SETTINGS: tuple[SettingSpec, ...] = (
|
|||||||
True,
|
True,
|
||||||
"bool",
|
"bool",
|
||||||
"Unterschriften mit dem ablegenden Konto bezeugen",
|
"Unterschriften mit dem ablegenden Konto bezeugen",
|
||||||
hint="Unter jede Unterschrift kommt eine Zeile, wer das Dokument in TESM abgelegt "
|
hint="Eine Zeile unter der **ersten** Unterschrift nennt das Konto, das das "
|
||||||
"hat. Der Name in der Unterschrift ist eine Angabe des Unterschreibenden – wie "
|
"Dokument in TESM abgelegt hat. In den Dokumenteigenschaften und im "
|
||||||
"auf Papier; das Konto daneben ist belegt. Eine Passwortabfrage gibt es dafür "
|
"Änderungsprotokoll steht es ohnehin, unabhängig von diesem Schalter. Der Name in "
|
||||||
"nicht.",
|
"der Unterschrift ist eine Angabe des Unterschreibenden – wie auf Papier; das "
|
||||||
|
"Konto ist belegt. Eine Passwortabfrage gibt es dafür nicht.",
|
||||||
section="fileshare",
|
section="fileshare",
|
||||||
),
|
),
|
||||||
# -- Terminal ----------------------------------------------------------- #
|
# -- Terminal ----------------------------------------------------------- #
|
||||||
|
|||||||
@@ -84,7 +84,9 @@
|
|||||||
<div class="card__title">{{ icon('pencil', size=17) }} Unterschriften</div>
|
<div class="card__title">{{ icon('pencil', size=17) }} Unterschriften</div>
|
||||||
<div class="card__sub">
|
<div class="card__sub">
|
||||||
Der Name in der Unterschrift ist eine Angabe des Unterschreibenden – wie auf
|
Der Name in der Unterschrift ist eine Angabe des Unterschreibenden – wie auf
|
||||||
Papier. Wer das Dokument in TESM abgelegt hat, ist dagegen belegt.
|
Papier. Wer das Dokument abgelegt hat, ist dagegen belegt: in den
|
||||||
|
Dokumenteigenschaften und im Änderungsprotokoll, auf Wunsch zusätzlich
|
||||||
|
sichtbar unter der ersten Unterschrift.
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+2
-2
@@ -542,8 +542,8 @@ if [[ "$APP" == "tesm" ]]; then
|
|||||||
render_unit "$ROOT/deploy/systemd/tesm-monitor.service" "/etc/systemd/system/$MONITOR_UNIT"
|
render_unit "$ROOT/deploy/systemd/tesm-monitor.service" "/etc/systemd/system/$MONITOR_UNIT"
|
||||||
fi
|
fi
|
||||||
# Aufraeumen lief bisher nur von Hand -- also praktisch nie. Auf einer
|
# Aufraeumen lief bisher nur von Hand -- also praktisch nie. Auf einer
|
||||||
# laufenden Installation standen deshalb hunderte abgelaufene Sitzungszeilen
|
# laufenden Installation lagen deshalb hunderte abgelaufene Sitzungszeilen in
|
||||||
# in der Datenbank, und das Aenderungsprotokoll waere nie archiviert worden.
|
# der Datenbank, und das Aenderungsprotokoll waere nie archiviert worden.
|
||||||
render_unit "$ROOT/deploy/systemd/$APP-cleanup.service" "/etc/systemd/system/$CLEANUP_UNIT"
|
render_unit "$ROOT/deploy/systemd/$APP-cleanup.service" "/etc/systemd/system/$CLEANUP_UNIT"
|
||||||
render_unit "$ROOT/deploy/systemd/$APP-cleanup.timer" "/etc/systemd/system/$CLEANUP_TIMER"
|
render_unit "$ROOT/deploy/systemd/$APP-cleanup.timer" "/etc/systemd/system/$CLEANUP_TIMER"
|
||||||
[[ $UNITS_CHANGED -eq 1 ]] && systemctl daemon-reload && info "Units neu geladen" \
|
[[ $UNITS_CHANGED -eq 1 ]] && systemctl daemon-reload && info "Units neu geladen" \
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ Description=TESM -- taegliches Aufraeumen
|
|||||||
# und die Archivierung des Aenderungsprotokolls.
|
# und die Archivierung des Aenderungsprotokolls.
|
||||||
#
|
#
|
||||||
# Vorher lief das nur, wenn jemand "tesm-admin housekeeping" aufrief oder in
|
# Vorher lief das nur, wenn jemand "tesm-admin housekeeping" aufrief oder in
|
||||||
# der Diagnose darauf klickte -- also praktisch nie. Gemessen: 444 offene
|
# der Diagnose darauf klickte -- also praktisch nie. Gemessen auf einer
|
||||||
# Sitzungszeilen bei drei Benutzern.
|
# Installation nach vier Wochen: 747 Sitzungszeilen, 682 davon abgelaufen.
|
||||||
OnCalendar=*-*-* 03:30:00
|
OnCalendar=*-*-* 03:30:00
|
||||||
# Streuung, damit nicht jede Installation im Netz zur selben Sekunde loslegt.
|
# Streuung, damit nicht jede Installation im Netz zur selben Sekunde loslegt.
|
||||||
RandomizedDelaySec=15m
|
RandomizedDelaySec=15m
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ Description=TESM-Lizenzserver -- taegliches Aufraeumen
|
|||||||
# und die Archivierung des Aenderungsprotokolls.
|
# und die Archivierung des Aenderungsprotokolls.
|
||||||
#
|
#
|
||||||
# Vorher lief das nur, wenn jemand "tesm-license-admin housekeeping" aufrief oder in
|
# Vorher lief das nur, wenn jemand "tesm-license-admin housekeeping" aufrief oder in
|
||||||
# der Diagnose darauf klickte -- also praktisch nie. Gemessen: 444 offene
|
# der Diagnose darauf klickte -- also praktisch nie. Gemessen auf einer
|
||||||
# Sitzungszeilen bei drei Benutzern.
|
# Installation nach vier Wochen: 747 Sitzungszeilen, 682 davon abgelaufen.
|
||||||
OnCalendar=*-*-* 03:30:00
|
OnCalendar=*-*-* 03:30:00
|
||||||
# Streuung, damit nicht jede Installation im Netz zur selben Sekunde loslegt.
|
# Streuung, damit nicht jede Installation im Netz zur selben Sekunde loslegt.
|
||||||
RandomizedDelaySec=15m
|
RandomizedDelaySec=15m
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "tesm-core"
|
name = "tesm-core"
|
||||||
version = "2.7.2"
|
version = "2.7.3"
|
||||||
description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver"
|
description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ def create_base_app(
|
|||||||
#: Wortmarke, ohne Zeile darunter; die Marke selbst zeigen beide
|
#: Wortmarke, ohne Zeile darunter; die Marke selbst zeigen beide
|
||||||
#: Anwendungen.
|
#: Anwendungen.
|
||||||
auth_tagline: str = "",
|
auth_tagline: str = "",
|
||||||
app_version: str = "2.7.2",
|
app_version: str = "2.7.3",
|
||||||
built_in_trusted_keys: tuple[str, ...] = (),
|
built_in_trusted_keys: tuple[str, ...] = (),
|
||||||
enable_license: bool = True,
|
enable_license: bool = True,
|
||||||
template_folder: str | None = None,
|
template_folder: str | None = None,
|
||||||
|
|||||||
@@ -280,7 +280,13 @@ async function nachbearbeiten(
|
|||||||
const hoehe = (png.height / png.width) * breite;
|
const hoehe = (png.height / png.width) * breite;
|
||||||
seite.drawImage(png, { x: eintrag.x, y: eintrag.y, width: breite, height: hoehe });
|
seite.drawImage(png, { x: eintrag.x, y: eintrag.y, width: breite, height: hoehe });
|
||||||
const zeilen = [`${eintrag.name} | ${eintrag.zeit}`];
|
const zeilen = [`${eintrag.name} | ${eintrag.zeit}`];
|
||||||
if (zeuge) zeilen.push(`In TESM abgelegt durch ${zeuge}`);
|
// Der Zeugenvermerk gehoert zum Dokument, nicht zu jeder Unterschrift:
|
||||||
|
// unter drei Unterschriften stand dreimal derselbe Satz. Sichtbar
|
||||||
|
// erscheint er deshalb nur unter der ersten -- fest steht er ohnehin in
|
||||||
|
// den Dokumenteigenschaften und im Aenderungsprotokoll.
|
||||||
|
if (zeuge && eintrag === unterschriften[0]) {
|
||||||
|
zeilen.push(`In TESM abgelegt durch ${zeuge}`);
|
||||||
|
}
|
||||||
// Die Schrift waechst mit der Unterschrift: wer sie kleiner zieht, will
|
// Die Schrift waechst mit der Unterschrift: wer sie kleiner zieht, will
|
||||||
// den ganzen Block kleiner haben, nicht eine Zeichnung mit einer
|
// den ganzen Block kleiner haben, nicht eine Zeichnung mit einer
|
||||||
// Bildunterschrift in Originalgroesse daneben.
|
// Bildunterschrift in Originalgroesse daneben.
|
||||||
@@ -311,6 +317,20 @@ async function nachbearbeiten(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (unterschriften.length) {
|
||||||
|
// In den Dokumenteigenschaften -- dort sucht man so etwas, und dort steht
|
||||||
|
// es einmal statt unter jeder Unterschrift. Jeder Betrachter zeigt das
|
||||||
|
// an, auch ausserhalb von TESM.
|
||||||
|
const namen = unterschriften.map((eintrag) => eintrag.name);
|
||||||
|
const wann = unterschriften[unterschriften.length - 1].zeit;
|
||||||
|
dokument.setAuthor(namen.join(", "));
|
||||||
|
dokument.setSubject(
|
||||||
|
`Unterschrieben am ${wann}` + (zeuge ? ` | in TESM abgelegt durch ${zeuge}` : "")
|
||||||
|
);
|
||||||
|
dokument.setProducer("TESM");
|
||||||
|
dokument.setModificationDate(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
if (abschliessen) {
|
if (abschliessen) {
|
||||||
// Alle Felder werden Teil der Seite. Danach gibt es kein Formular mehr --
|
// Alle Felder werden Teil der Seite. Danach gibt es kein Formular mehr --
|
||||||
// gewollt: so kann niemand mehr etwas verstellen.
|
// gewollt: so kann niemand mehr etwas verstellen.
|
||||||
@@ -664,7 +684,9 @@ async function pdfBetrachter(behaelter, seiten, url, basis, { formulare = true }
|
|||||||
const text = document.createElement("div");
|
const text = document.createElement("div");
|
||||||
text.className = "viewer__unterschrifttext";
|
text.className = "viewer__unterschrifttext";
|
||||||
text.textContent = `${eintrag.name} | ${eintrag.zeit}`;
|
text.textContent = `${eintrag.name} | ${eintrag.zeit}`;
|
||||||
if (zeuge) text.textContent += ` / In TESM abgelegt durch ${zeuge}`;
|
if (zeuge && eintrag === unterschriften[0]) {
|
||||||
|
text.textContent += ` / In TESM abgelegt durch ${zeuge}`;
|
||||||
|
}
|
||||||
const griff = document.createElement("button");
|
const griff = document.createElement("button");
|
||||||
griff.type = "button";
|
griff.type = "button";
|
||||||
griff.className = "viewer__unterschriftgriff";
|
griff.className = "viewer__unterschriftgriff";
|
||||||
@@ -834,6 +856,8 @@ export function initFilePreview(wurzel = document) {
|
|||||||
const padAbbrechen = stueck("signabbrechen");
|
const padAbbrechen = stueck("signabbrechen");
|
||||||
const padHinweis = stueck("signhinweis");
|
const padHinweis = stueck("signhinweis");
|
||||||
const basis = rumpf.dataset.viewerPdfjs || "";
|
const basis = rumpf.dataset.viewerPdfjs || "";
|
||||||
|
// Der Anmeldename, nicht der volle Name: er ist eindeutig, und genau das
|
||||||
|
// soll die Zeile belegen.
|
||||||
const konto = rumpf.dataset.viewerKonto || "";
|
const konto = rumpf.dataset.viewerKonto || "";
|
||||||
const bezeugen = rumpf.dataset.viewerZeuge === "1";
|
const bezeugen = rumpf.dataset.viewerZeuge === "1";
|
||||||
// Die Uhr des Servers, nicht die des Tablets: eine verstellte Uhr am Geraet
|
// Die Uhr des Servers, nicht die des Tablets: eine verstellte Uhr am Geraet
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "tesm-licensing"
|
name = "tesm-licensing"
|
||||||
version = "2.7.2"
|
version = "2.7.3"
|
||||||
description = "Ed25519-basiertes Lizenz- und Aktivierungsprotokoll fuer TESM und TESM-Lizenzserver"
|
description = "Ed25519-basiertes Lizenz- und Aktivierungsprotokoll fuer TESM und TESM-Lizenzserver"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
dependencies = ["cryptography>=42"]
|
dependencies = ["cryptography>=42"]
|
||||||
|
|||||||
Reference in new issue
Block a user