refactor: keep provider presentation self-contained in spec
This commit is contained in:
@@ -462,7 +462,7 @@ def get_payment_method_keyboard(
|
||||
|
||||
for method in settings.payment_methods_order:
|
||||
spec = get_provider_spec(method)
|
||||
if not spec or not spec.button_text_key or not spec.is_enabled(settings):
|
||||
if not spec or not spec.callback_prefix or not spec.is_enabled(settings):
|
||||
continue
|
||||
callback_data = spec.callback_data(
|
||||
value=value_str,
|
||||
@@ -473,7 +473,7 @@ def get_payment_method_keyboard(
|
||||
if not callback_data:
|
||||
continue
|
||||
builder.button(
|
||||
text=provider_telegram_button_text(spec, settings, _, language=lang),
|
||||
text=provider_telegram_button_text(spec, settings, language=lang),
|
||||
callback_data=callback_data,
|
||||
)
|
||||
builder.button(
|
||||
|
||||
@@ -44,7 +44,6 @@ class PaymentProviderSpec:
|
||||
pending_status: str
|
||||
enabled: EnabledPredicate
|
||||
service_key: Optional[str] = None
|
||||
button_text_key: Optional[str] = None
|
||||
callback_prefix: Optional[str] = None
|
||||
webapp_label: Optional[str] = None
|
||||
webapp_labels: Optional[Mapping[str, str]] = None
|
||||
|
||||
@@ -365,7 +365,6 @@ SPEC = PaymentProviderSpec(
|
||||
pending_status="pending_cryptopay",
|
||||
enabled=lambda settings: settings.CRYPTOPAY_ENABLED,
|
||||
service_key="cryptopay_service",
|
||||
button_text_key="pay_with_cryptopay_button",
|
||||
callback_prefix="pay_crypto",
|
||||
router=router,
|
||||
create_service=create_service,
|
||||
|
||||
@@ -491,7 +491,6 @@ SPEC = PaymentProviderSpec(
|
||||
pending_status="pending_freekassa",
|
||||
enabled=lambda settings: settings.FREEKASSA_ENABLED,
|
||||
service_key="freekassa_service",
|
||||
button_text_key="pay_with_sbp_button",
|
||||
callback_prefix="pay_fk",
|
||||
router=router,
|
||||
create_service=create_service,
|
||||
|
||||
@@ -471,7 +471,6 @@ SPEC = PaymentProviderSpec(
|
||||
pending_status="pending_heleket",
|
||||
enabled=lambda settings: settings.HELEKET_ENABLED,
|
||||
service_key="heleket_service",
|
||||
button_text_key="pay_with_heleket_button",
|
||||
callback_prefix="pay_heleket",
|
||||
router=router,
|
||||
create_service=create_service,
|
||||
|
||||
@@ -499,7 +499,6 @@ SBP_SPEC = PaymentProviderSpec(
|
||||
pending_status="pending_platega",
|
||||
enabled=lambda settings: settings.PLATEGA_ENABLED and settings.PLATEGA_SBP_ENABLED,
|
||||
service_key="platega_service",
|
||||
button_text_key="pay_with_platega_sbp_button",
|
||||
callback_prefix="pay_platega_sbp",
|
||||
aliases=("platega",),
|
||||
router=router,
|
||||
@@ -521,7 +520,6 @@ CRYPTO_SPEC = PaymentProviderSpec(
|
||||
pending_status="pending_platega",
|
||||
enabled=lambda settings: settings.PLATEGA_ENABLED and settings.PLATEGA_CRYPTO_ENABLED,
|
||||
service_key="platega_service",
|
||||
button_text_key="pay_with_platega_crypto_button",
|
||||
callback_prefix="pay_platega_crypto",
|
||||
create_webapp_payment=create_crypto_webapp_payment,
|
||||
)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any, Callable, Dict, Iterable, List, Mapping, Optional
|
||||
from typing import Any, Dict, Iterable, List, Mapping, Optional
|
||||
|
||||
from . import cryptopay, freekassa, heleket, platega, severpay, stars, wata, yookassa
|
||||
from .base import PaymentProviderPresentation, PaymentProviderSpec, ServiceFactoryContext
|
||||
@@ -83,7 +83,6 @@ def resolve_provider_presentation(
|
||||
settings: Any = None,
|
||||
*,
|
||||
language: Optional[str] = None,
|
||||
translate: Optional[Callable[[str], str]] = None,
|
||||
) -> PaymentProviderPresentation:
|
||||
lang = _normalize_language(language, settings)
|
||||
webapp_label = (
|
||||
@@ -111,14 +110,6 @@ def resolve_provider_presentation(
|
||||
)
|
||||
telegram_emoji = telegram_emoji_override or spec.default_telegram_emoji
|
||||
|
||||
if (
|
||||
not telegram_label_override
|
||||
and not spec.telegram_labels
|
||||
and translate
|
||||
and spec.button_text_key
|
||||
):
|
||||
telegram_label = translate(spec.button_text_key)
|
||||
|
||||
return PaymentProviderPresentation(
|
||||
webapp_label=webapp_label,
|
||||
webapp_icon=webapp_icon,
|
||||
@@ -131,7 +122,6 @@ def resolve_provider_presentation(
|
||||
def provider_telegram_button_text(
|
||||
spec: PaymentProviderSpec,
|
||||
settings: Any,
|
||||
translate: Callable[[str], str],
|
||||
*,
|
||||
language: Optional[str] = None,
|
||||
) -> str:
|
||||
|
||||
@@ -434,7 +434,6 @@ SPEC = PaymentProviderSpec(
|
||||
pending_status="pending_severpay",
|
||||
enabled=lambda settings: settings.SEVERPAY_ENABLED,
|
||||
service_key="severpay_service",
|
||||
button_text_key="pay_with_severpay_button",
|
||||
callback_prefix="pay_severpay",
|
||||
router=router,
|
||||
create_service=create_service,
|
||||
|
||||
@@ -360,7 +360,6 @@ SPEC = PaymentProviderSpec(
|
||||
pending_status="pending_stars",
|
||||
enabled=lambda settings: settings.STARS_ENABLED,
|
||||
service_key="stars_service",
|
||||
button_text_key="pay_with_stars_button",
|
||||
callback_prefix="pay_stars",
|
||||
router=router,
|
||||
create_service=create_service,
|
||||
|
||||
@@ -440,7 +440,6 @@ SPEC = PaymentProviderSpec(
|
||||
pending_status="pending_wata",
|
||||
enabled=lambda settings: settings.WATA_ENABLED,
|
||||
service_key="wata_service",
|
||||
button_text_key="pay_with_wata_button",
|
||||
callback_prefix="pay_wata",
|
||||
router=router,
|
||||
create_service=create_service,
|
||||
|
||||
@@ -2514,7 +2514,6 @@ SPEC = PaymentProviderSpec(
|
||||
pending_status="pending_yookassa",
|
||||
enabled=lambda settings: settings.YOOKASSA_ENABLED,
|
||||
service_key="yookassa_service",
|
||||
button_text_key="pay_with_yookassa_button",
|
||||
callback_prefix="pay_yk",
|
||||
router=router,
|
||||
create_service=create_service,
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
"choose_payment_method": "Choose payment method:",
|
||||
"choose_payment_method_traffic": "Choose how to pay for the traffic package:",
|
||||
"pay_button": "💳 Pay",
|
||||
"pay_with_yookassa_button": "💳 YooKassa",
|
||||
"yookassa_autopay_flow_prompt": "Auto-renew is enabled. Choose how you'd like to pay:",
|
||||
"yookassa_autopay_pay_saved_card_button": "💳 Pay with saved card",
|
||||
"yookassa_autopay_pay_new_card_button": "➕ Pay with new card",
|
||||
@@ -49,16 +48,7 @@
|
||||
"yookassa_autopay_no_saved_cards": "No saved cards found. Pay with a new card or link one in Payment Methods.",
|
||||
"back_to_autopay_method_choice_button": "⬅️ Back",
|
||||
"yookassa_autopay_charge_initiated": "Charge request sent to the selected card. We'll notify you once the payment completes.",
|
||||
"pay_with_sbp_button": "📱 SBP",
|
||||
"pay_with_platega_button": "💳 Platega (SBP/Cards)",
|
||||
"pay_with_platega_sbp_button": "🏦 Pay via SBP",
|
||||
"pay_with_platega_crypto_button": "🪙 Pay with crypto",
|
||||
"pay_with_severpay_button": "💳 SeverPay",
|
||||
"pay_with_wata_button": "Wata",
|
||||
"pay_with_heleket_button": "🪙 Heleket",
|
||||
"back_to_payment_methods_button": "⬅️ Back",
|
||||
"pay_with_cryptopay_button": "💎 CryptoBot",
|
||||
"pay_with_stars_button": "🌟 Telegram Stars",
|
||||
"connect_button": "🔗 Connect",
|
||||
"cancel_button": "❌ Cancel",
|
||||
"devices_button": "📱 My Devices ({current_devices}/{max_devices})",
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
"choose_payment_method": "Выберите способ оплаты:",
|
||||
"choose_payment_method_traffic": "Выберите способ оплаты пакета трафика:",
|
||||
"pay_button": "💳 Оплатить",
|
||||
"pay_with_yookassa_button": "💳 ЮKassa",
|
||||
"yookassa_autopay_flow_prompt": "Автопродление включено. Выберите, как оплатить подписку:",
|
||||
"yookassa_autopay_pay_saved_card_button": "💳 Оплата привязанной картой",
|
||||
"yookassa_autopay_pay_new_card_button": "➕ Оплата новой картой",
|
||||
@@ -49,16 +48,7 @@
|
||||
"yookassa_autopay_no_saved_cards": "Сохранённых карт нет. Оплатите новой картой или привяжите карту в разделе «Способы оплаты».",
|
||||
"back_to_autopay_method_choice_button": "⬅️ Назад",
|
||||
"yookassa_autopay_charge_initiated": "Запрос на списание с выбранной карты отправлен. Сообщим, как только платёж завершится.",
|
||||
"pay_with_sbp_button": "📱 СБП",
|
||||
"pay_with_platega_button": "💳 Platega (СБП/карты)",
|
||||
"pay_with_platega_sbp_button": "🏦 Оплата через СБП",
|
||||
"pay_with_platega_crypto_button": "🪙 Оплата криптой",
|
||||
"pay_with_severpay_button": "💳 SeverPay",
|
||||
"pay_with_wata_button": "Wata",
|
||||
"pay_with_heleket_button": "🪙 Heleket",
|
||||
"back_to_payment_methods_button": "⬅️ Назад",
|
||||
"pay_with_cryptopay_button": "💎 CryptoBot",
|
||||
"pay_with_stars_button": "🌟 Звезды Telegram",
|
||||
"connect_button": "🔗 Подключиться",
|
||||
"devices_button": "📱 Мои устройства ({current_devices}/{max_devices})",
|
||||
"my_devices_details": "📱 <b>Список ваших устройств ({current_devices}/{max_devices})</b>\n\n{devices}\n\nВы можете отключить устройство, выбрав его в списке ниже.\n<blockquote><i>Примечание: Если вы отключили устройство, оно будет автоматически подключено заново при следующем использовании. Перед удалением убедитесь, что вы удалили подписку из приложения.</i></blockquote>",
|
||||
|
||||
@@ -75,7 +75,6 @@ def test_wata_is_registered_as_single_provider_module():
|
||||
assert spec is not None
|
||||
assert spec.service_key == "wata_service"
|
||||
assert spec.pending_status == "pending_wata"
|
||||
assert spec.button_text_key == "pay_with_wata_button"
|
||||
assert spec.callback_prefix == "pay_wata"
|
||||
assert spec.router is not None
|
||||
assert spec.create_service is not None
|
||||
@@ -175,15 +174,14 @@ def test_provider_telegram_button_text_uses_provider_defaults_until_customized()
|
||||
spec = get_provider_spec("wata")
|
||||
assert spec is not None
|
||||
|
||||
translate = lambda key: f"i18n:{key}"
|
||||
assert (
|
||||
provider_telegram_button_text(spec, SimpleNamespace(), translate, language="en")
|
||||
provider_telegram_button_text(spec, SimpleNamespace(), language="en")
|
||||
== f"{spec.default_telegram_emoji} Wata"
|
||||
)
|
||||
|
||||
settings = SimpleNamespace(PAYMENT_WATA_TELEGRAM_LABEL_EN="Pay Wata")
|
||||
assert (
|
||||
provider_telegram_button_text(spec, settings, translate, language="en")
|
||||
provider_telegram_button_text(spec, settings, language="en")
|
||||
== f"{spec.default_telegram_emoji} Pay Wata"
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user