fix: apply persisted provider overrides on startup
This commit is contained in:
@@ -48,14 +48,24 @@ def get_provider_spec(method: str) -> Optional[PaymentProviderSpec]:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def build_provider_configs() -> Dict[str, ProviderConfigBundle]:
|
def build_provider_configs(*, force: bool = False) -> Dict[str, ProviderConfigBundle]:
|
||||||
"""Instantiate per-provider BaseSettings models declared on each SPEC.
|
"""Instantiate per-provider BaseSettings models declared on each SPEC.
|
||||||
|
|
||||||
Returns a mapping ``service_key`` → ``ProviderConfigBundle(config, presentation)``.
|
Returns a mapping ``service_key`` → ``ProviderConfigBundle(config, presentation)``.
|
||||||
For SPECs that share a service (Platega SBP + Platega Crypto), only the
|
For SPECs that share a service (Platega SBP + Platega Crypto), only the
|
||||||
first one's presentation lands in the shared bundle — per-SPEC presentation
|
first one's presentation lands in the shared bundle — per-SPEC presentation
|
||||||
overrides live separately in ``_provider_presentations`` keyed by ``spec.id``.
|
overrides live separately in ``_provider_presentations`` keyed by ``spec.id``.
|
||||||
|
|
||||||
|
Idempotent by default: if bundles already exist in the process-wide cache
|
||||||
|
we return them as-is. Pass ``force=True`` to rebuild from env (used by
|
||||||
|
tests after monkeypatching env vars). The non-force path is critical for
|
||||||
|
runtime: ``load_overrides_from_db`` builds bundles first and then writes
|
||||||
|
DB-persisted overrides into them — a later non-force rebuild from
|
||||||
|
``build_core_services`` would otherwise wipe those overrides.
|
||||||
"""
|
"""
|
||||||
|
if _provider_configs and not force:
|
||||||
|
return dict(_provider_configs)
|
||||||
|
|
||||||
from .base import provider_env_file
|
from .base import provider_env_file
|
||||||
|
|
||||||
env_file = provider_env_file()
|
env_file = provider_env_file()
|
||||||
|
|||||||
@@ -196,7 +196,17 @@ def write_appearance_backup(settings: Settings) -> None:
|
|||||||
|
|
||||||
|
|
||||||
async def load_overrides_from_db(settings: Settings, async_session_factory: sessionmaker) -> int:
|
async def load_overrides_from_db(settings: Settings, async_session_factory: sessionmaker) -> int:
|
||||||
"""Fetch overrides from the DB and apply them to the in-memory settings."""
|
"""Fetch overrides from the DB and apply them to the in-memory settings.
|
||||||
|
|
||||||
|
Provider env-configs live on per-provider BaseSettings bundles instead of
|
||||||
|
the central Settings model. Apply needs those bundles to already exist,
|
||||||
|
otherwise provider-owned overrides (e.g. ``HELEKET_ENABLED``) silently
|
||||||
|
drop on the floor. Build them up-front; the call is idempotent so the
|
||||||
|
later ``build_core_services`` invocation reuses these same instances.
|
||||||
|
"""
|
||||||
|
from bot.payment_providers import build_provider_configs
|
||||||
|
|
||||||
|
build_provider_configs()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
async with async_session_factory() as session:
|
async with async_session_factory() as session:
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ def test_payment_method_keyboard_uses_custom_telegram_text_without_changing_call
|
|||||||
monkeypatch.setenv("WATA_ENABLED", "True")
|
monkeypatch.setenv("WATA_ENABLED", "True")
|
||||||
monkeypatch.setenv("PAYMENT_WATA_TELEGRAM_LABEL_EN", "Wata custom")
|
monkeypatch.setenv("PAYMENT_WATA_TELEGRAM_LABEL_EN", "Wata custom")
|
||||||
monkeypatch.setenv("PAYMENT_WATA_TELEGRAM_EMOJI", "💸")
|
monkeypatch.setenv("PAYMENT_WATA_TELEGRAM_EMOJI", "💸")
|
||||||
build_provider_configs()
|
build_provider_configs(force=True)
|
||||||
|
|
||||||
settings = Settings(
|
settings = Settings(
|
||||||
_env_file=None,
|
_env_file=None,
|
||||||
|
|||||||
@@ -398,7 +398,7 @@ class AdminSettingsSecurityTests(unittest.IsolatedAsyncioTestCase):
|
|||||||
get_provider_bundle,
|
get_provider_bundle,
|
||||||
)
|
)
|
||||||
|
|
||||||
build_provider_configs()
|
build_provider_configs(force=True)
|
||||||
bundle = get_provider_bundle("yookassa_service")
|
bundle = get_provider_bundle("yookassa_service")
|
||||||
if bundle and bundle.config is not None:
|
if bundle and bundle.config is not None:
|
||||||
bundle.config.SECRET_KEY = "super-secret"
|
bundle.config.SECRET_KEY = "super-secret"
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ class SettingsTests(unittest.TestCase):
|
|||||||
os.environ["PAYMENT_YOOKASSA_TELEGRAM_LABEL_EN"] = "Bank card"
|
os.environ["PAYMENT_YOOKASSA_TELEGRAM_LABEL_EN"] = "Bank card"
|
||||||
os.environ["PAYMENT_YOOKASSA_TELEGRAM_EMOJI"] = "💳"
|
os.environ["PAYMENT_YOOKASSA_TELEGRAM_EMOJI"] = "💳"
|
||||||
try:
|
try:
|
||||||
build_provider_configs()
|
build_provider_configs(force=True)
|
||||||
presentation = get_spec_presentation("yookassa")
|
presentation = get_spec_presentation("yookassa")
|
||||||
self.assertIsNotNone(presentation)
|
self.assertIsNotNone(presentation)
|
||||||
self.assertEqual(presentation.WEBAPP_LABEL_RU, "Карта")
|
self.assertEqual(presentation.WEBAPP_LABEL_RU, "Карта")
|
||||||
|
|||||||
@@ -340,7 +340,7 @@ class WebAppAssetTests(unittest.IsolatedAsyncioTestCase):
|
|||||||
current_provider_configs,
|
current_provider_configs,
|
||||||
)
|
)
|
||||||
|
|
||||||
build_provider_configs()
|
build_provider_configs(force=True)
|
||||||
configs = current_provider_configs()
|
configs = current_provider_configs()
|
||||||
for service_key in ("cryptopay_service", "yookassa_service"):
|
for service_key in ("cryptopay_service", "yookassa_service"):
|
||||||
bundle = configs.get(service_key)
|
bundle = configs.get(service_key)
|
||||||
@@ -377,7 +377,7 @@ class WebAppAssetTests(unittest.IsolatedAsyncioTestCase):
|
|||||||
get_spec_presentation,
|
get_spec_presentation,
|
||||||
)
|
)
|
||||||
|
|
||||||
build_provider_configs()
|
build_provider_configs(force=True)
|
||||||
bundle = get_provider_bundle("yookassa_service")
|
bundle = get_provider_bundle("yookassa_service")
|
||||||
if bundle and bundle.config is not None:
|
if bundle and bundle.config is not None:
|
||||||
bundle.config.ENABLED = True
|
bundle.config.ENABLED = True
|
||||||
|
|||||||
Reference in New Issue
Block a user