Files

77 lines
2.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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"