"""Propagation for Django services: a backend registry and the Orekit client. The public surface is :func:`get_backend`. Everything that needs a state vector asks for a backend by name (or lets ``settings.ORBITAL_PROPAGATOR_BACKEND`` decide) and talks to the :class:`odm.PropagatorBackend` seam, so no call site knows or cares which propagator answered. Two backends ship: ``sgp4`` pure Python, no service dependency. TEME plus a GMST Earth-fixed frame, and analytical theory only -- it has no drag integration, so it refuses decay work rather than returning a number nobody should trust. ``orekit`` an HTTP client to the Orekit sidecar (``services/orekit``): rigorous frames, numerical propagation, drag fitting, decay forecasts and the solar-activity ensemble. Reusable on purpose. ODMS and ``track.tmtc.yksa.space`` both propagate, both against the same sidecar, and the alternative to sharing this app is two HTTP clients that drift apart on timeouts, on 503 handling, and on what they send. Add it to ``INSTALLED_APPS`` and set ``OREKIT_SERVICE_URL``. """ from .registry import BACKENDS, get_backend, register __all__ = ["BACKENDS", "get_backend", "register"]