Add providers order

This commit is contained in:
Boris Kovalskii
2026-02-07 08:33:24 +10:00
committed by GitHub
parent e4b79d4410
commit 1f47f723d0
2 changed files with 45 additions and 10 deletions
+8 -3
View File
@@ -27,7 +27,7 @@ from handlers.payments.currency_flow import (
shortfall_lead_text,
currency_label,
)
from handlers.payments.providers import get_providers_with_hooks
from handlers.payments.providers import get_providers_with_hooks, sort_provider_names
from handlers.texts import FAST_PAY_CHOOSE_CURRENCY, FAST_PAY_CHOOSE_PROVIDER, FASTFLOW_COUPON_APPLIED_TEMPLATE
from handlers.utils import edit_or_send_message
from logger import logger
@@ -115,6 +115,7 @@ async def try_fast_payment_flow(
cfg = providers_map.get(p_up) or {}
if cfg.get("fast") and cfg.get("enabled", True):
providers.append(p_up)
providers = sort_provider_names(providers, providers_map)
mode, one_screen = get_currency_mode()
multicurrency_mode = mode == "RUB+USD"
@@ -425,6 +426,7 @@ async def fastflow_apply_coupon(message: Message, state: FSMContext, session: An
cfg = providers_map.get(p_up) or {}
if cfg.get("fast") and cfg.get("enabled", True):
providers.append(p_up)
providers = sort_provider_names(providers, providers_map)
mode, one_screen = get_currency_mode()
multicurrency_mode = mode == "RUB+USD"
@@ -541,13 +543,16 @@ async def choose_payment_currency(callback_query: CallbackQuery, state: FSMConte
configured = [str(p) for p in (USE_NEW_PAYMENT_FLOW or [])]
providers = [p.upper() for p in configured]
filtered = [
filtered = sort_provider_names(
[
provider_upper
for provider_upper in (p.upper() for p in providers)
if (providers_map.get(provider_upper) or {}).get("currency") == currency
and (providers_map.get(provider_upper) or {}).get("fast")
and (providers_map.get(provider_upper) or {}).get("enabled", True)
]
],
providers_map,
)
await state.update_data(chosen_currency=currency)
if not filtered:
+32 -2
View File
@@ -2,63 +2,93 @@ from typing import Any
from hooks.hooks import run_hooks
PROVIDERS_BASE: dict[str, dict[str, Any]] = {
"YOOKASSA": {
"currency": "RUB",
"value": "pay_yookassa",
"fast": "process_custom_amount_input",
"order": 10,
},
"YOOMONEY": {
"currency": "RUB",
"value": "pay_yoomoney",
"fast": "process_custom_amount_input_yoomoney",
"order": 20,
},
"ROBOKASSA": {
"currency": "RUB",
"value": "pay_robokassa",
"fast": "handle_custom_amount_input",
"order": 30,
},
"KASSAI_CARDS": {
"currency": "RUB",
"value": "pay_kassai_cards",
"fast": "handle_custom_amount_input_kassai_cards",
"module": "kassai",
"order": 40,
},
"KASSAI_SBP": {
"currency": "RUB",
"value": "pay_kassai_sbp",
"fast": "handle_custom_amount_input_kassai_sbp",
"module": "kassai",
"order": 50,
},
"TRIBUTE": {
"currency": "RUB+USD",
"value": "pay_tribute",
"fast": None,
"order": 60,
},
"HELEKET": {
"currency": "USD",
"value": "pay_heleket_crypto",
"fast": "handle_custom_amount_input_heleket",
"order": 70,
},
"CRYPTOBOT": {
"currency": "USD",
"value": "pay_cryptobot",
"fast": "process_custom_amount_input",
"order": 80,
},
"FREEKASSA": {
"currency": "USD",
"value": "pay_freekassa",
"fast": None,
"order": 90,
},
"STARS": {
"currency": "STARS",
"value": "pay_stars",
"fast": "process_custom_amount_input_stars",
"order": 100,
},
}
def _get_effective_order(name: str, cfg: dict[str, Any]) -> int:
"""Возвращает эффективный порядок провайдера (админ > модуль > дефолт)."""
from core.settings.providers_order_config import PROVIDERS_ORDER
if name in PROVIDERS_ORDER:
return PROVIDERS_ORDER[name]
return cfg.get("order", 999)
def _sort_providers(providers: dict[str, dict[str, Any]]) -> dict[str, dict[str, Any]]:
"""Сортирует провайдеров по полю 'order' (меньше = выше)."""
return dict(
sorted(providers.items(), key=lambda item: _get_effective_order(item[0], item[1]))
)
def sort_provider_names(names: list[str], providers_map: dict[str, dict[str, Any]]) -> list[str]:
"""Сортирует список имён провайдеров по их 'order' из providers_map."""
return sorted(names, key=lambda n: _get_effective_order(n, providers_map.get(n) or {}))
def get_providers(flags: dict[str, bool]) -> dict[str, dict[str, Any]]:
providers: dict[str, dict[str, Any]] = {}
for name, base in PROVIDERS_BASE.items():
@@ -81,4 +111,4 @@ async def get_providers_with_hooks(flags: dict[str, bool]) -> dict[str, dict[str
base = dict(providers.get(name, {}))
base.update(patch)
providers[name] = base
return providers
return _sort_providers(providers)