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