"""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