lazyflat/apply/language.py
EiSiMo eb73b5e415 correctness batch: atomic writes, task refs, hmac, import-star, pickle
Per review §2:

- web/db.py: new _tx() context manager wraps multi-statement writers in
  BEGIN IMMEDIATE … COMMIT/ROLLBACK (our connections run in autocommit
  mode, so plain `with _lock:` doesn't give atomicity). partnership_accept
  (UPDATE + DELETE) and cleanup_retention (3 deletes/updates) now use it.
- Fire-and-forget tasks: add module-level _bg_tasks sets in web/app.py and
  web/enrichment.py. A _spawn() helper holds a strong ref until the task
  finishes so the GC can't drop it mid-flight (CPython's event loop only
  weakly references pending tasks).
- apply/main.py: require_api_key uses hmac.compare_digest, matching web's
  check. Also imports now use explicit names instead of `from settings *`.
- apply/language.py: replace `from settings import *` + `from paths import *`
  with explicit imports — this is the pattern that caused the LANGUAGE
  NameError earlier.
- alert/utils.py: pickle-based hash_any_object → deterministic JSON+sha256.
  Cheaper, portable across Python versions, no pickle attack surface.
- web/notifications.py: /fehler links repointed to /bewerbungen (the
  former page doesn't exist).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-21 19:14:26 +02:00

19 lines
535 B
Python

import tomllib
import logging
from settings import LANGUAGE
from paths import TRANSLATIONS_FILE
logger = logging.getLogger("flat-apply")
with open(TRANSLATIONS_FILE, "rb") as f:
TRANSLATIONS = tomllib.load(f)
def get_text(message):
if message not in TRANSLATIONS.keys():
raise KeyError(f"{message} is not a valid translation.")
if LANGUAGE not in TRANSLATIONS[message].keys():
raise KeyError(f"there is no {LANGUAGE} translation for {message}.")
return TRANSLATIONS[message][LANGUAGE]
_ = get_text