Files
p42.f-w/backend/app/tracking/__init__.py
T
guyg1474andClaude Opus 5.5 dd58b3d1f8 P42 Dashboard: erster Stand
FastAPI-Backend und React-Frontend mit Konten, Sendungsverfolgung,
Projekt-Artikeln, Vorrat & Einkauf mit Rezeptabgleich, Reise-Weltkarte,
Kanban-Projekten mit Priorität, Server-Monitoring und den Designs
Matrix und Blackwall. Betrieb per Docker hinter nginx (siehe DEPLOY.md).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:08:11 +02:00

51 lines
1.7 KiB
Python
Raw 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.
"""Universelle Sendungsverfolgung: erst DHL direkt, dann 17TRACK, sonst nur Erkennung + Links."""
import logging
import time
from ..config import TRACKING
from .carriers import detect_carriers, universal_link
from .dhl import track_dhl
from .seventeen import track_17
log = logging.getLogger(__name__)
CACHE_SECONDS = 120
_cache: dict[str, tuple[float, dict]] = {}
async def track(number: str) -> dict:
cached = _cache.get(number)
if cached and time.monotonic() - cached[0] < CACHE_SECONDS:
return cached[1]
candidates = detect_carriers(number)
base = {"number": number, "candidates": candidates, "universalLink": universal_link(number)}
dhl_key = TRACKING.get("dhlApiKey")
key_17 = TRACKING.get("seventeenTrackApiKey")
errors = []
if dhl_key and any(c["id"] == "dhl" for c in candidates):
try:
result = await track_dhl(number, dhl_key)
if result:
return _store(number, {**base, **result})
except Exception as e: # noqa: BLE001 – Fehler anzeigen, nächsten Anbieter probieren
log.warning("DHL-Abfrage fehlgeschlagen: %s", e)
errors.append(f"DHL: {e}")
if key_17:
try:
result = await track_17(number, key_17)
data = {**base, **result}
return _store(number, data) if result["status"] != "pending" else data
except Exception as e: # noqa: BLE001
log.warning("17TRACK-Abfrage fehlgeschlagen: %s", e)
errors.append(f"17TRACK: {e}")
return {**base, "source": None, "status": "unknown", "configured": bool(dhl_key or key_17), "errors": errors}
def _store(number: str, data: dict) -> dict:
_cache[number] = (time.monotonic(), data)
return data