style: apply ruff format to payment integrations
CI ruff format --check failed on 13 files. Applied ruff format to bring them in line with project formatting (line wrapping, trailing commas, quote consistency). No functional changes.
This commit is contained in:
+2
-10
@@ -2295,11 +2295,7 @@ class Settings(BaseSettings):
|
|||||||
return html.escape(self.get_antilopay_sberpay_display_name())
|
return html.escape(self.get_antilopay_sberpay_display_name())
|
||||||
|
|
||||||
def is_jupiter_enabled(self) -> bool:
|
def is_jupiter_enabled(self) -> bool:
|
||||||
return (
|
return self.JUPITER_ENABLED and self.JUPITER_TOKEN is not None and self.JUPITER_SECRET is not None
|
||||||
self.JUPITER_ENABLED
|
|
||||||
and self.JUPITER_TOKEN is not None
|
|
||||||
and self.JUPITER_SECRET is not None
|
|
||||||
)
|
|
||||||
|
|
||||||
def get_jupiter_display_name(self) -> str:
|
def get_jupiter_display_name(self) -> str:
|
||||||
name = (self.JUPITER_DISPLAY_NAME or '').strip()
|
name = (self.JUPITER_DISPLAY_NAME or '').strip()
|
||||||
@@ -2319,11 +2315,7 @@ class Settings(BaseSettings):
|
|||||||
return html.escape(self.get_jupiter_sbp_display_name())
|
return html.escape(self.get_jupiter_sbp_display_name())
|
||||||
|
|
||||||
def is_donut_enabled(self) -> bool:
|
def is_donut_enabled(self) -> bool:
|
||||||
return (
|
return self.DONUT_ENABLED and self.DONUT_TOKEN is not None and self.DONUT_SECRET is not None
|
||||||
self.DONUT_ENABLED
|
|
||||||
and self.DONUT_TOKEN is not None
|
|
||||||
and self.DONUT_SECRET is not None
|
|
||||||
)
|
|
||||||
|
|
||||||
def get_donut_display_name(self) -> str:
|
def get_donut_display_name(self) -> str:
|
||||||
name = (self.DONUT_DISPLAY_NAME or '').strip()
|
name = (self.DONUT_DISPLAY_NAME or '').strip()
|
||||||
|
|||||||
@@ -54,9 +54,7 @@ async def get_antilopay_payment_by_order_id(db: AsyncSession, order_id: str) ->
|
|||||||
return result.scalar_one_or_none()
|
return result.scalar_one_or_none()
|
||||||
|
|
||||||
|
|
||||||
async def get_antilopay_payment_by_invoice_id(
|
async def get_antilopay_payment_by_invoice_id(db: AsyncSession, antilopay_payment_id: str) -> AntilopayPayment | None:
|
||||||
db: AsyncSession, antilopay_payment_id: str
|
|
||||||
) -> AntilopayPayment | None:
|
|
||||||
"""Получает платеж по ID от Antilopay."""
|
"""Получает платеж по ID от Antilopay."""
|
||||||
result = await db.execute(
|
result = await db.execute(
|
||||||
select(AntilopayPayment).where(AntilopayPayment.antilopay_payment_id == antilopay_payment_id)
|
select(AntilopayPayment).where(AntilopayPayment.antilopay_payment_id == antilopay_payment_id)
|
||||||
|
|||||||
@@ -54,13 +54,9 @@ async def get_donut_payment_by_order_id(db: AsyncSession, order_id: str) -> Donu
|
|||||||
return result.scalar_one_or_none()
|
return result.scalar_one_or_none()
|
||||||
|
|
||||||
|
|
||||||
async def get_donut_payment_by_invoice_id(
|
async def get_donut_payment_by_invoice_id(db: AsyncSession, donut_transaction_id: str) -> DonutPayment | None:
|
||||||
db: AsyncSession, donut_transaction_id: str
|
|
||||||
) -> DonutPayment | None:
|
|
||||||
"""Получает платёж по transaction_id, выданному Donut."""
|
"""Получает платёж по transaction_id, выданному Donut."""
|
||||||
result = await db.execute(
|
result = await db.execute(select(DonutPayment).where(DonutPayment.donut_transaction_id == donut_transaction_id))
|
||||||
select(DonutPayment).where(DonutPayment.donut_transaction_id == donut_transaction_id)
|
|
||||||
)
|
|
||||||
return result.scalar_one_or_none()
|
return result.scalar_one_or_none()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -54,9 +54,7 @@ async def get_jupiter_payment_by_order_id(db: AsyncSession, order_id: str) -> Ju
|
|||||||
return result.scalar_one_or_none()
|
return result.scalar_one_or_none()
|
||||||
|
|
||||||
|
|
||||||
async def get_jupiter_payment_by_invoice_id(
|
async def get_jupiter_payment_by_invoice_id(db: AsyncSession, jupiter_transaction_id: str) -> JupiterPayment | None:
|
||||||
db: AsyncSession, jupiter_transaction_id: str
|
|
||||||
) -> JupiterPayment | None:
|
|
||||||
"""Получает платёж по transaction_id, выданному Jupiter."""
|
"""Получает платёж по transaction_id, выданному Jupiter."""
|
||||||
result = await db.execute(
|
result = await db.execute(
|
||||||
select(JupiterPayment).where(JupiterPayment.jupiter_transaction_id == jupiter_transaction_id)
|
select(JupiterPayment).where(JupiterPayment.jupiter_transaction_id == jupiter_transaction_id)
|
||||||
|
|||||||
@@ -56,9 +56,7 @@ async def get_lava_payment_by_order_id(db: AsyncSession, order_id: str) -> LavaP
|
|||||||
|
|
||||||
async def get_lava_payment_by_invoice_id(db: AsyncSession, lava_invoice_id: str) -> LavaPayment | None:
|
async def get_lava_payment_by_invoice_id(db: AsyncSession, lava_invoice_id: str) -> LavaPayment | None:
|
||||||
"""Получает платёж по invoice_id, выданному Lava."""
|
"""Получает платёж по invoice_id, выданному Lava."""
|
||||||
result = await db.execute(
|
result = await db.execute(select(LavaPayment).where(LavaPayment.lava_invoice_id == lava_invoice_id))
|
||||||
select(LavaPayment).where(LavaPayment.lava_invoice_id == lava_invoice_id)
|
|
||||||
)
|
|
||||||
return result.scalar_one_or_none()
|
return result.scalar_one_or_none()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1478,7 +1478,9 @@ class LavaPayment(Base):
|
|||||||
return self.status in ['failed', 'expired', 'cancel', 'cancelled', 'amount_mismatch', 'error']
|
return self.status in ['failed', 'expired', 'cancel', 'cancelled', 'amount_mismatch', 'error']
|
||||||
|
|
||||||
def __repr__(self) -> str: # pragma: no cover - debug helper
|
def __repr__(self) -> str: # pragma: no cover - debug helper
|
||||||
return f'<LavaPayment(id={self.id}, order_id={self.order_id}, amount={self.amount_rubles}₽, status={self.status})>'
|
return (
|
||||||
|
f'<LavaPayment(id={self.id}, order_id={self.order_id}, amount={self.amount_rubles}₽, status={self.status})>'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class PromoGroup(Base):
|
class PromoGroup(Base):
|
||||||
|
|||||||
@@ -2084,11 +2084,7 @@ def get_payment_methods_keyboard(amount_kopeks: int, language: str = DEFAULT_LAN
|
|||||||
)
|
)
|
||||||
has_direct_payment_methods = True
|
has_direct_payment_methods = True
|
||||||
|
|
||||||
if (
|
if settings.is_lava_enabled() and not settings.is_lava_card_enabled() and not settings.is_lava_sbp_enabled():
|
||||||
settings.is_lava_enabled()
|
|
||||||
and not settings.is_lava_card_enabled()
|
|
||||||
and not settings.is_lava_sbp_enabled()
|
|
||||||
):
|
|
||||||
lava_name = settings.get_lava_display_name()
|
lava_name = settings.get_lava_display_name()
|
||||||
keyboard.append(
|
keyboard.append(
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -199,9 +199,7 @@ class AuraPayService:
|
|||||||
# Сортируем ключи по алфавиту и конкатенируем значения
|
# Сортируем ключи по алфавиту и конкатенируем значения
|
||||||
# None → '' (PHP implode() converts null to empty string, not "None")
|
# None → '' (PHP implode() converts null to empty string, not "None")
|
||||||
sorted_keys = sorted(payload.keys())
|
sorted_keys = sorted(payload.keys())
|
||||||
concatenated_values = ''.join(
|
concatenated_values = ''.join(str(payload[key]) if payload[key] is not None else '' for key in sorted_keys)
|
||||||
str(payload[key]) if payload[key] is not None else '' for key in sorted_keys
|
|
||||||
)
|
|
||||||
|
|
||||||
expected = hmac.new(
|
expected = hmac.new(
|
||||||
self.secret_key.encode('utf-8'),
|
self.secret_key.encode('utf-8'),
|
||||||
|
|||||||
@@ -398,9 +398,7 @@ class AntilopayPaymentMixin:
|
|||||||
)
|
)
|
||||||
created_transaction = True
|
created_transaction = True
|
||||||
|
|
||||||
await antilopay_crud.link_antilopay_payment_to_transaction(
|
await antilopay_crud.link_antilopay_payment_to_transaction(db, payment=payment, transaction_id=transaction.id)
|
||||||
db, payment=payment, transaction_id=transaction.id
|
|
||||||
)
|
|
||||||
|
|
||||||
should_credit_balance = created_transaction or not balance_already_credited
|
should_credit_balance = created_transaction or not balance_already_credited
|
||||||
|
|
||||||
|
|||||||
@@ -115,11 +115,7 @@ class DonutPaymentMixin:
|
|||||||
|
|
||||||
transaction_id = api_result.get('transaction_id')
|
transaction_id = api_result.get('transaction_id')
|
||||||
details = api_result.get('details') or {}
|
details = api_result.get('details') or {}
|
||||||
payment_url = (
|
payment_url = api_result.get('redirect_url') or details.get('qrcode_url') or actual_return_url
|
||||||
api_result.get('redirect_url')
|
|
||||||
or details.get('qrcode_url')
|
|
||||||
or actual_return_url
|
|
||||||
)
|
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
'Donut: получен ответ API',
|
'Donut: получен ответ API',
|
||||||
@@ -374,9 +370,7 @@ class DonutPaymentMixin:
|
|||||||
)
|
)
|
||||||
created_transaction = True
|
created_transaction = True
|
||||||
|
|
||||||
await donut_crud.link_donut_payment_to_transaction(
|
await donut_crud.link_donut_payment_to_transaction(db, payment=payment, transaction_id=transaction.id)
|
||||||
db, payment=payment, transaction_id=transaction.id
|
|
||||||
)
|
|
||||||
|
|
||||||
should_credit_balance = created_transaction or not balance_already_credited
|
should_credit_balance = created_transaction or not balance_already_credited
|
||||||
|
|
||||||
|
|||||||
@@ -94,9 +94,7 @@ class JupiterPaymentMixin:
|
|||||||
callback_url = self._build_jupiter_callback_url()
|
callback_url = self._build_jupiter_callback_url()
|
||||||
customer_id = str(tg_id) if tg_id != 'guest' else f'guest-{order_id[-6:]}'
|
customer_id = str(tg_id) if tg_id != 'guest' else f'guest-{order_id[-6:]}'
|
||||||
customer_name = (
|
customer_name = (
|
||||||
getattr(user, 'first_name', None)
|
getattr(user, 'first_name', None) or getattr(user, 'username', None) or settings.JUPITER_FALLBACK_NAME
|
||||||
or getattr(user, 'username', None)
|
|
||||||
or settings.JUPITER_FALLBACK_NAME
|
|
||||||
)
|
)
|
||||||
|
|
||||||
api_result = await jupiter_service.create_payment(
|
api_result = await jupiter_service.create_payment(
|
||||||
@@ -366,9 +364,7 @@ class JupiterPaymentMixin:
|
|||||||
)
|
)
|
||||||
created_transaction = True
|
created_transaction = True
|
||||||
|
|
||||||
await jupiter_crud.link_jupiter_payment_to_transaction(
|
await jupiter_crud.link_jupiter_payment_to_transaction(db, payment=payment, transaction_id=transaction.id)
|
||||||
db, payment=payment, transaction_id=transaction.id
|
|
||||||
)
|
|
||||||
|
|
||||||
should_credit_balance = created_transaction or not balance_already_credited
|
should_credit_balance = created_transaction or not balance_already_credited
|
||||||
|
|
||||||
|
|||||||
@@ -146,9 +146,7 @@ class LavaPaymentMixin:
|
|||||||
)
|
)
|
||||||
|
|
||||||
lifetime = settings.LAVA_PAYMENT_LIFETIME_MINUTES
|
lifetime = settings.LAVA_PAYMENT_LIFETIME_MINUTES
|
||||||
expires_at = self._parse_lava_expired(expired_str) or (
|
expires_at = self._parse_lava_expired(expired_str) or (datetime.now(UTC) + timedelta(minutes=lifetime))
|
||||||
datetime.now(UTC) + timedelta(minutes=lifetime)
|
|
||||||
)
|
|
||||||
|
|
||||||
lava_crud = import_module('app.database.crud.lava')
|
lava_crud = import_module('app.database.crud.lava')
|
||||||
local_payment = await lava_crud.create_lava_payment(
|
local_payment = await lava_crud.create_lava_payment(
|
||||||
@@ -456,9 +454,7 @@ class LavaPaymentMixin:
|
|||||||
)
|
)
|
||||||
created_transaction = True
|
created_transaction = True
|
||||||
|
|
||||||
await lava_crud.link_lava_payment_to_transaction(
|
await lava_crud.link_lava_payment_to_transaction(db, payment=payment, transaction_id=transaction.id)
|
||||||
db, payment=payment, transaction_id=transaction.id
|
|
||||||
)
|
|
||||||
|
|
||||||
should_credit_balance = created_transaction or not balance_already_credited
|
should_credit_balance = created_transaction or not balance_already_credited
|
||||||
|
|
||||||
|
|||||||
Vendored
+10
-10
@@ -35,13 +35,15 @@ def _enable_apple_iap(monkeypatch: pytest.MonkeyPatch) -> None:
|
|||||||
monkeypatch.setattr(
|
monkeypatch.setattr(
|
||||||
settings,
|
settings,
|
||||||
'APPLE_IAP_PRODUCTS',
|
'APPLE_IAP_PRODUCTS',
|
||||||
json.dumps({
|
json.dumps(
|
||||||
'com.bitnet.vpnclient.topup.100': 10_000,
|
{
|
||||||
'com.bitnet.vpnclient.topup.300': 30_000,
|
'com.bitnet.vpnclient.topup.100': 10_000,
|
||||||
'com.bitnet.vpnclient.topup.500': 50_000,
|
'com.bitnet.vpnclient.topup.300': 30_000,
|
||||||
'com.bitnet.vpnclient.topup.1000': 100_000,
|
'com.bitnet.vpnclient.topup.500': 50_000,
|
||||||
'com.bitnet.vpnclient.topup.3000': 300_000,
|
'com.bitnet.vpnclient.topup.1000': 100_000,
|
||||||
}),
|
'com.bitnet.vpnclient.topup.3000': 300_000,
|
||||||
|
}
|
||||||
|
),
|
||||||
raising=False,
|
raising=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -297,9 +299,7 @@ class TestVerifyAndDecodeJWS:
|
|||||||
|
|
||||||
def test_rejects_empty_x5c(self) -> None:
|
def test_rejects_empty_x5c(self) -> None:
|
||||||
service = AppleIAPService()
|
service = AppleIAPService()
|
||||||
header = (
|
header = base64.urlsafe_b64encode(json.dumps({'alg': 'ES256', 'x5c': []}).encode()).rstrip(b'=').decode()
|
||||||
base64.urlsafe_b64encode(json.dumps({'alg': 'ES256', 'x5c': []}).encode()).rstrip(b'=').decode()
|
|
||||||
)
|
|
||||||
payload = base64.urlsafe_b64encode(b'{}').rstrip(b'=').decode()
|
payload = base64.urlsafe_b64encode(b'{}').rstrip(b'=').decode()
|
||||||
sig = base64.urlsafe_b64encode(b'sig').rstrip(b'=').decode()
|
sig = base64.urlsafe_b64encode(b'sig').rstrip(b'=').decode()
|
||||||
assert service._verify_and_decode_jws(f'{header}.{payload}.{sig}') is None
|
assert service._verify_and_decode_jws(f'{header}.{payload}.{sig}') is None
|
||||||
|
|||||||
Reference in New Issue
Block a user