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
+13 -8
View File
@@ -27,7 +27,7 @@ from handlers.payments.currency_flow import (
shortfall_lead_text, shortfall_lead_text,
currency_label, 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.texts import FAST_PAY_CHOOSE_CURRENCY, FAST_PAY_CHOOSE_PROVIDER, FASTFLOW_COUPON_APPLIED_TEMPLATE
from handlers.utils import edit_or_send_message from handlers.utils import edit_or_send_message
from logger import logger from logger import logger
@@ -115,6 +115,7 @@ async def try_fast_payment_flow(
cfg = providers_map.get(p_up) or {} cfg = providers_map.get(p_up) or {}
if cfg.get("fast") and cfg.get("enabled", True): if cfg.get("fast") and cfg.get("enabled", True):
providers.append(p_up) providers.append(p_up)
providers = sort_provider_names(providers, providers_map)
mode, one_screen = get_currency_mode() mode, one_screen = get_currency_mode()
multicurrency_mode = mode == "RUB+USD" 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 {} cfg = providers_map.get(p_up) or {}
if cfg.get("fast") and cfg.get("enabled", True): if cfg.get("fast") and cfg.get("enabled", True):
providers.append(p_up) providers.append(p_up)
providers = sort_provider_names(providers, providers_map)
mode, one_screen = get_currency_mode() mode, one_screen = get_currency_mode()
multicurrency_mode = mode == "RUB+USD" 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 [])] configured = [str(p) for p in (USE_NEW_PAYMENT_FLOW or [])]
providers = [p.upper() for p in configured] providers = [p.upper() for p in configured]
filtered = [ filtered = sort_provider_names(
provider_upper [
for provider_upper in (p.upper() for p in providers) provider_upper
if (providers_map.get(provider_upper) or {}).get("currency") == currency for provider_upper in (p.upper() for p in providers)
and (providers_map.get(provider_upper) or {}).get("fast") if (providers_map.get(provider_upper) or {}).get("currency") == currency
and (providers_map.get(provider_upper) or {}).get("enabled", True) 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) await state.update_data(chosen_currency=currency)
if not filtered: if not filtered:
+32 -2
View File
@@ -2,63 +2,93 @@ from typing import Any
from hooks.hooks import run_hooks from hooks.hooks import run_hooks
PROVIDERS_BASE: dict[str, dict[str, Any]] = { PROVIDERS_BASE: dict[str, dict[str, Any]] = {
"YOOKASSA": { "YOOKASSA": {
"currency": "RUB", "currency": "RUB",
"value": "pay_yookassa", "value": "pay_yookassa",
"fast": "process_custom_amount_input", "fast": "process_custom_amount_input",
"order": 10,
}, },
"YOOMONEY": { "YOOMONEY": {
"currency": "RUB", "currency": "RUB",
"value": "pay_yoomoney", "value": "pay_yoomoney",
"fast": "process_custom_amount_input_yoomoney", "fast": "process_custom_amount_input_yoomoney",
"order": 20,
}, },
"ROBOKASSA": { "ROBOKASSA": {
"currency": "RUB", "currency": "RUB",
"value": "pay_robokassa", "value": "pay_robokassa",
"fast": "handle_custom_amount_input", "fast": "handle_custom_amount_input",
"order": 30,
}, },
"KASSAI_CARDS": { "KASSAI_CARDS": {
"currency": "RUB", "currency": "RUB",
"value": "pay_kassai_cards", "value": "pay_kassai_cards",
"fast": "handle_custom_amount_input_kassai_cards", "fast": "handle_custom_amount_input_kassai_cards",
"module": "kassai", "module": "kassai",
"order": 40,
}, },
"KASSAI_SBP": { "KASSAI_SBP": {
"currency": "RUB", "currency": "RUB",
"value": "pay_kassai_sbp", "value": "pay_kassai_sbp",
"fast": "handle_custom_amount_input_kassai_sbp", "fast": "handle_custom_amount_input_kassai_sbp",
"module": "kassai", "module": "kassai",
"order": 50,
}, },
"TRIBUTE": { "TRIBUTE": {
"currency": "RUB+USD", "currency": "RUB+USD",
"value": "pay_tribute", "value": "pay_tribute",
"fast": None, "fast": None,
"order": 60,
}, },
"HELEKET": { "HELEKET": {
"currency": "USD", "currency": "USD",
"value": "pay_heleket_crypto", "value": "pay_heleket_crypto",
"fast": "handle_custom_amount_input_heleket", "fast": "handle_custom_amount_input_heleket",
"order": 70,
}, },
"CRYPTOBOT": { "CRYPTOBOT": {
"currency": "USD", "currency": "USD",
"value": "pay_cryptobot", "value": "pay_cryptobot",
"fast": "process_custom_amount_input", "fast": "process_custom_amount_input",
"order": 80,
}, },
"FREEKASSA": { "FREEKASSA": {
"currency": "USD", "currency": "USD",
"value": "pay_freekassa", "value": "pay_freekassa",
"fast": None, "fast": None,
"order": 90,
}, },
"STARS": { "STARS": {
"currency": "STARS", "currency": "STARS",
"value": "pay_stars", "value": "pay_stars",
"fast": "process_custom_amount_input_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]]: def get_providers(flags: dict[str, bool]) -> dict[str, dict[str, Any]]:
providers: dict[str, dict[str, Any]] = {} providers: dict[str, dict[str, Any]] = {}
for name, base in PROVIDERS_BASE.items(): 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 = dict(providers.get(name, {}))
base.update(patch) base.update(patch)
providers[name] = base providers[name] = base
return providers return _sort_providers(providers)