From 49cf5ebad8f4b4131553c584a8d19671b610bad6 Mon Sep 17 00:00:00 2001 From: 3252a8 <3252a8@proton.me> Date: Mon, 18 May 2026 22:03:40 +0300 Subject: [PATCH] fix: auto-append new providers to PAYMENT_METHODS_ORDER --- backend/config/settings.py | 29 +++++++++++++++++++++++++++++ tests/test_webapp_assets.py | 4 ++++ 2 files changed, 33 insertions(+) diff --git a/backend/config/settings.py b/backend/config/settings.py index a5677e1..bd4c69d 100644 --- a/backend/config/settings.py +++ b/backend/config/settings.py @@ -707,7 +707,24 @@ class Settings(BaseSettings): def payment_methods_order(self) -> List[str]: """ Ordered list of payment providers to show in the subscription payment keyboard. + + Honors PAYMENT_METHODS_ORDER from the env (user-controlled order), but + always appends any newly added provider that the user hasn't listed — + otherwise upgrading to a release that adds, say, ``heleket`` would + silently hide the new button until the operator manually updated their + .env. Toggling the button on/off stays on the per-provider ENABLED + flag, not on this list. """ + from bot.payment_providers import iter_provider_specs + + all_specs = list(iter_provider_specs()) + spec_ids: List[str] = [] + seen_ids: set = set() + for spec in all_specs: + if spec.id not in seen_ids: + spec_ids.append(spec.id) + seen_ids.add(spec.id) + default_order = [ "freekassa", "platega_sbp", @@ -719,8 +736,14 @@ class Settings(BaseSettings): "cryptopay", "heleket", ] + # Make sure default_order itself includes every registered spec. + for sid in spec_ids: + if sid not in default_order: + default_order.append(sid) + if not self.PAYMENT_METHODS_ORDER: return default_order + methods: List[str] = [] for item in self.PAYMENT_METHODS_ORDER.split(","): slug = item.strip().lower() @@ -734,6 +757,12 @@ class Settings(BaseSettings): methods.append("platega_crypto") continue methods.append(slug) + # Append any registered spec that the operator didn't list — keeps + # newly shipped providers visible after an upgrade without forcing a + # .env edit. Toggling the button is still controlled by ENABLED. + for sid in spec_ids: + if sid not in methods: + methods.append(sid) return methods or default_order @computed_field diff --git a/tests/test_webapp_assets.py b/tests/test_webapp_assets.py index 8f1e86a..48302de 100644 --- a/tests/test_webapp_assets.py +++ b/tests/test_webapp_assets.py @@ -394,11 +394,15 @@ class WebAppAssetTests(unittest.IsolatedAsyncioTestCase): POSTGRES_PASSWORD="app_password", TARIFFS_CONFIG_PATH="missing-tariffs.json", PAYMENT_METHODS_ORDER="yookassa", + STARS_ENABLED=False, ) app = {"yookassa_service": SimpleNamespace(configured=True)} methods = subscription_webapp._serialize_payment_methods(settings, app, "en") + # Only yookassa is configured/enabled; every other provider gets + # filtered out by is_visible even though they're auto-appended to the + # order list now. self.assertEqual( methods, [{"id": "yookassa", "name": "Bank card", "icon": "WalletCards"}],