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