"""Speicherorte und Einstellungen. Die Einstellungen liegen als JSON in %APPDATA%\\Provisionsmanager95\\einstellungen.json. Darin steht u. a. der Pfad zur Datenbank – der kann bewusst auf ein Netzlaufwerk zeigen, wenn mehrere PCs (nacheinander) mit denselben Händlerdaten arbeiten sollen. """ from __future__ import annotations import json import os import shutil from pathlib import Path APP_DIR_NAME = "Provisionsmanager95" def app_dir() -> Path: base = os.environ.get("PROVTOOL_HOME") if base: p = Path(base) elif os.name == "nt" and os.environ.get("APPDATA"): p = Path(os.environ["APPDATA"]) / APP_DIR_NAME else: p = Path.home() / ".config" / APP_DIR_NAME p.mkdir(parents=True, exist_ok=True) return p def _settings_file() -> Path: return app_dir() / "einstellungen.json" DEFAULTS = { "db_pfad": None, # None = Standard im App-Verzeichnis "export_ordner": None, "import_ordner": None, "export_kopfzeile": False, "export_summe": True, "export_anbieter_getrennt": False, # freenet + Vodafone in einer Datei "export_null_weglassen": True, } def load() -> dict: """Einstellungen lesen. Ist die Datei unlesbar (z. B. Absturz beim Schreiben), wird sie als *.defekt.json aufbewahrt und unter "defekt" gemeldet – statt still mit Standardwerten weiterzumachen (dabei ginge z. B. der Pfad zur Datenbank auf dem Netzlaufwerk verloren).""" data = dict(DEFAULTS) f = _settings_file() if f.exists(): try: data.update(json.loads(f.read_text(encoding="utf-8"))) except (OSError, ValueError): sicherung = f.with_suffix(".defekt.json") try: shutil.copyfile(f, sicherung) except OSError: pass data["defekt"] = str(sicherung) return data def save(data: dict) -> None: """Atomar: erst in eine Hilfsdatei, dann umbenennen – ein Absturz hinterlässt nie eine halbe Datei.""" data = {k: v for k, v in data.items() if k != "defekt"} f = _settings_file() tmp = f.with_suffix(".json.tmp") tmp.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8") os.replace(tmp, f) def db_path(settings: dict | None = None) -> Path: settings = settings or load() if settings.get("db_pfad"): return Path(settings["db_pfad"]) return app_dir() / "provisionen.db"