Server-Bibliothek
vor 17 Std. 98bce1b0da675715b2e5482c0ad61ba21135f62f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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