Add providers order
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user