From 98bce1b0da675715b2e5482c0ad61ba21135f62f Mon Sep 17 00:00:00 2001
From: Server-Bibliothek <server-bibliothek@lokal>
Date: Di, 04 Aug 2026 07:00:04 +0200
Subject: [PATCH] Add a desktop client that knows what is installed locally
---
desktop/backend/konfiguration.py | 74 +++++++++++++++++++++++++++++++++++++
1 files changed, 74 insertions(+), 0 deletions(-)
diff --git a/desktop/backend/konfiguration.py b/desktop/backend/konfiguration.py
new file mode 100644
index 0000000..252837c
--- /dev/null
+++ b/desktop/backend/konfiguration.py
@@ -0,0 +1,74 @@
+"""Einstellungen des Clients: Wo steht die Bibliothek, wohin kommen die Werkzeuge.
+
+Bewusst einstellbar statt eingebaut: Die Bibliothek zieht spaeter auf einen anderen
+Rechner um, und dann soll nicht jeder Arbeitsplatz eine neue exe brauchen.
+"""
+
+from __future__ import annotations
+
+import json
+import os
+from dataclasses import asdict, dataclass
+from pathlib import Path
+
+# Vorgabe, solange nichts eingestellt wurde. Der Rechnername ist dem einer IP
+# vorzuziehen — er ueberlebt einen Wechsel der Adresse.
+STANDARD_SERVER = "http://dhs-main-dt:3000"
+
+# Fester Ort fuer eigenstaendige Programme. Unter C:\ vererbt Windows das
+# Aenderungsrecht an angemeldete Benutzer, ein Update braucht also keine
+# Administratorrechte — anders als unter C:\Programme.
+STANDARD_WERKZEUG_ORDNER = r"C:\D+H\Software"
+
+
+@dataclass
+class Einstellungen:
+ serverAdresse: str = STANDARD_SERVER
+ werkzeugOrdner: str = STANDARD_WERKZEUG_ORDNER
+
+
+def konfigurations_verzeichnis() -> Path:
+ """Je Benutzer, nicht je Installation — die exe darf ausgetauscht werden."""
+ basis = os.environ.get("LOCALAPPDATA") or str(Path.home())
+ return Path(basis) / "Software-Bibliothek-Client"
+
+
+def _konfigurationsdatei() -> Path:
+ return konfigurations_verzeichnis() / "konfiguration.json"
+
+
+def laden() -> Einstellungen:
+ """Liest die Einstellungen; bei jedem Problem gelten die Vorgaben.
+
+ Eine kaputte Datei darf den Start nicht verhindern — der Nutzer soll die
+ Adresse in der Oberflaeche korrigieren koennen, statt vor einem toten
+ Fenster zu sitzen.
+ """
+ datei = _konfigurationsdatei()
+ if not datei.exists():
+ return Einstellungen()
+ try:
+ gelesen = json.loads(datei.read_text(encoding="utf-8"))
+ except (OSError, json.JSONDecodeError):
+ return Einstellungen()
+ if not isinstance(gelesen, dict):
+ return Einstellungen()
+ return Einstellungen(
+ serverAdresse=str(gelesen.get("serverAdresse") or STANDARD_SERVER).strip(),
+ werkzeugOrdner=str(gelesen.get("werkzeugOrdner") or STANDARD_WERKZEUG_ORDNER).strip(),
+ )
+
+
+def speichern(einstellungen: Einstellungen) -> Einstellungen:
+ """Schreibt die Einstellungen und liefert den bereinigten Stand zurueck."""
+ bereinigt = Einstellungen(
+ serverAdresse=(einstellungen.serverAdresse or "").strip().rstrip("/") or STANDARD_SERVER,
+ werkzeugOrdner=(einstellungen.werkzeugOrdner or "").strip() or STANDARD_WERKZEUG_ORDNER,
+ )
+ verzeichnis = konfigurations_verzeichnis()
+ verzeichnis.mkdir(parents=True, exist_ok=True)
+ _konfigurationsdatei().write_text(
+ json.dumps(asdict(bereinigt), indent=2, ensure_ascii=False),
+ encoding="utf-8",
+ )
+ return bereinigt
--
Gitblit v1.9.3