458b1e362a
Add TandoorClient (app/tandoor.py) with full recipe creation, image upload, and duplicate detection via the Tandoor REST API. Settings page now has separate Mealie and Tandoor sections. Import page shows both send buttons based on which services are configured. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
"""Configuration management — persists Mealie and Tandoor connection settings to a JSON file."""
|
|
|
|
import json
|
|
import os
|
|
from pathlib import Path
|
|
|
|
DATA_DIR = Path(os.environ.get("DATA_DIR", "/data"))
|
|
CONFIG_FILE = DATA_DIR / "config.json"
|
|
|
|
# Optional internal URLs for Docker-to-Docker API calls (avoids Cloudflare hairpin).
|
|
# The user-facing URLs are still used for browser links.
|
|
MEALIE_INTERNAL_URL = os.environ.get("MEALIE_INTERNAL_URL", "").strip().rstrip("/")
|
|
TANDOOR_INTERNAL_URL = os.environ.get("TANDOOR_INTERNAL_URL", "").strip().rstrip("/")
|
|
|
|
_DEFAULTS = {
|
|
"mealie_url": "",
|
|
"mealie_api_key": "",
|
|
"tandoor_url": "",
|
|
"tandoor_api_key": "",
|
|
}
|
|
|
|
|
|
def _ensure_dir():
|
|
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
def load() -> dict:
|
|
"""Return the current config dict, merged with defaults."""
|
|
cfg = dict(_DEFAULTS)
|
|
if CONFIG_FILE.exists():
|
|
try:
|
|
with open(CONFIG_FILE, "r", encoding="utf-8") as f:
|
|
cfg.update(json.load(f))
|
|
except (json.JSONDecodeError, OSError):
|
|
pass
|
|
return cfg
|
|
|
|
|
|
def save(cfg: dict):
|
|
"""Atomically persist *cfg* to disk."""
|
|
_ensure_dir()
|
|
tmp = CONFIG_FILE.with_suffix(".tmp")
|
|
with open(tmp, "w", encoding="utf-8") as f:
|
|
json.dump(cfg, f, indent=2, ensure_ascii=False)
|
|
tmp.replace(CONFIG_FILE)
|