diff --git a/app/cabinet/routes/admin_users.py b/app/cabinet/routes/admin_users.py
index 5e6eddc9..758fea3e 100644
--- a/app/cabinet/routes/admin_users.py
+++ b/app/cabinet/routes/admin_users.py
@@ -2722,11 +2722,7 @@ async def sync_user_from_panel(
if settings.is_multi_tariff_enabled():
# In multi-tariff mode, user.remnawave_uuid is None; UUIDs live on subscriptions
- sub_uuids = [
- s.remnawave_uuid
- for s in (getattr(user, 'subscriptions', None) or [])
- if s.remnawave_uuid
- ]
+ sub_uuids = [s.remnawave_uuid for s in (getattr(user, 'subscriptions', None) or []) if s.remnawave_uuid]
for _uuid in sub_uuids:
panel_user = await api.get_user_by_uuid(_uuid)
if panel_user:
diff --git a/app/handlers/admin/promo_offers.py b/app/handlers/admin/promo_offers.py
index a2491a43..ebde4123 100644
--- a/app/handlers/admin/promo_offers.py
+++ b/app/handlers/admin/promo_offers.py
@@ -2128,7 +2128,7 @@ async def send_offer_to_segment(callback: CallbackQuery, db_user: User, db: Asyn
for user in users:
if settings.is_multi_tariff_enabled():
all_squads: set[str] = set()
- for s in (getattr(user, 'subscriptions', None) or []):
+ for s in getattr(user, 'subscriptions', None) or []:
all_squads.update(s.connected_squads or [])
connected = all_squads
else:
diff --git a/app/handlers/admin/tariffs.py b/app/handlers/admin/tariffs.py
index de5fd77a..82c91569 100644
--- a/app/handlers/admin/tariffs.py
+++ b/app/handlers/admin/tariffs.py
@@ -2184,8 +2184,7 @@ async def confirm_delete_tariff(
warning = ''
if subs_count > 0:
warning = (
- f'\n\n⚠️ Внимание! На этом тарифе {subs_count} неактивных подписок.\n'
- f'Они потеряют привязку к тарифу.'
+ f'\n\n⚠️ Внимание! На этом тарифе {subs_count} неактивных подписок.\nОни потеряют привязку к тарифу.'
)
await callback.message.edit_text(
diff --git a/app/keyboards/inline.py b/app/keyboards/inline.py
index 26f990ed..7b488604 100644
--- a/app/keyboards/inline.py
+++ b/app/keyboards/inline.py
@@ -1874,9 +1874,7 @@ def get_subscription_expiring_keyboard(subscription_id: int, language: str = DEF
else texts.t('MY_SUBSCRIPTION_BUTTON', '📱 Моя подписка')
)
- extend_callback = (
- f'se:{subscription_id}' if settings.is_multi_tariff_enabled() else 'subscription_extend'
- )
+ extend_callback = f'se:{subscription_id}' if settings.is_multi_tariff_enabled() else 'subscription_extend'
return InlineKeyboardMarkup(
inline_keyboard=[
@@ -2553,7 +2551,11 @@ def get_device_selection_keyboard(
keyboard.append(row)
if settings.CONNECT_BUTTON_MODE == 'guide':
- _osl_cb = f'open_subscription_link:{sub_id}' if sub_id and settings.is_multi_tariff_enabled() else 'open_subscription_link'
+ _osl_cb = (
+ f'open_subscription_link:{sub_id}'
+ if sub_id and settings.is_multi_tariff_enabled()
+ else 'open_subscription_link'
+ )
keyboard.append(
[
InlineKeyboardButton(
@@ -2671,7 +2673,9 @@ def get_connection_guide_keyboard(
]
)
- _sc_cb = f'subscription_connect:{sub_id}' if sub_id and settings.is_multi_tariff_enabled() else 'subscription_connect'
+ _sc_cb = (
+ f'subscription_connect:{sub_id}' if sub_id and settings.is_multi_tariff_enabled() else 'subscription_connect'
+ )
keyboard.extend(
[
[
diff --git a/app/services/blocked_users_service.py b/app/services/blocked_users_service.py
index 31a39f1a..76fbaa9b 100644
--- a/app/services/blocked_users_service.py
+++ b/app/services/blocked_users_service.py
@@ -160,11 +160,7 @@ class BlockedUsersService:
async def _check_single_user(self, user: User) -> BlockCheckResult:
"""Проверяет одного пользователя."""
- sub_uuids = [
- s.remnawave_uuid
- for s in (getattr(user, 'subscriptions', None) or [])
- if s.remnawave_uuid
- ]
+ sub_uuids = [s.remnawave_uuid for s in (getattr(user, 'subscriptions', None) or []) if s.remnawave_uuid]
remnawave_uuids = sub_uuids or ([user.remnawave_uuid] if user.remnawave_uuid else [])
if not user.telegram_id:
diff --git a/app/services/broadcast_service.py b/app/services/broadcast_service.py
index fb7cc00e..59746aaa 100644
--- a/app/services/broadcast_service.py
+++ b/app/services/broadcast_service.py
@@ -543,9 +543,7 @@ async def cleanup_blocked_broadcast_users(blocked_telegram_ids: list[int]) -> No
# Проверяем, есть ли активная оплаченная подписка
from app.database.crud.subscription import is_active_paid_subscription
- sub_result = await session.execute(
- select(Subscription).where(Subscription.user_id == user.id)
- )
+ sub_result = await session.execute(select(Subscription).where(Subscription.user_id == user.id))
all_subs = sub_result.scalars().all()
if any(is_active_paid_subscription(s) for s in all_subs):
diff --git a/app/services/campaign_service.py b/app/services/campaign_service.py
index f6eeecf8..84fceaff 100644
--- a/app/services/campaign_service.py
+++ b/app/services/campaign_service.py
@@ -179,7 +179,9 @@ class AdvertisingCampaignService:
try:
await self.subscription_service.update_remnawave_user(db, existing_subscription)
except Exception as error:
- logger.error('❌ Ошибка синхронизации RemnaWave при продлении кампании', campaign_id=campaign.id, error=error)
+ logger.error(
+ '❌ Ошибка синхронизации RemnaWave при продлении кампании', campaign_id=campaign.id, error=error
+ )
logger.info(
'🎁 Подписка пользователя продлена по кампании на дней',
@@ -354,7 +356,9 @@ class AdvertisingCampaignService:
try:
await self.subscription_service.create_remnawave_user(db, new_subscription)
except Exception as error:
- logger.error('❌ Ошибка синхронизации RemnaWave для тарифа кампании', campaign_id=campaign.id, error=error)
+ logger.error(
+ '❌ Ошибка синхронизации RemnaWave для тарифа кампании', campaign_id=campaign.id, error=error
+ )
logger.info(
'🎁 Пользователю выдан тариф по кампании на дней',
diff --git a/app/services/monitoring_service.py b/app/services/monitoring_service.py
index 9b6a24b5..f4455266 100644
--- a/app/services/monitoring_service.py
+++ b/app/services/monitoring_service.py
@@ -1315,11 +1315,7 @@ class MonitoringService:
from aiogram.types import InlineKeyboardMarkup
- extend_callback = (
- f'se:{subscription.id}'
- if settings.is_multi_tariff_enabled()
- else 'subscription_extend'
- )
+ extend_callback = f'se:{subscription.id}' if settings.is_multi_tariff_enabled() else 'subscription_extend'
keyboard = InlineKeyboardMarkup(
inline_keyboard=[
[build_miniapp_or_callback_button(text='💎 Продлить подписку', callback_data=extend_callback)],
@@ -1414,16 +1410,8 @@ class MonitoringService:
from aiogram.types import InlineKeyboardMarkup
- extend_callback = (
- f'se:{subscription.id}'
- if settings.is_multi_tariff_enabled()
- else 'subscription_extend'
- )
- sub_btn_text = (
- '📱 Мои подписки'
- if settings.is_multi_tariff_enabled()
- else '📱 Моя подписка'
- )
+ extend_callback = f'se:{subscription.id}' if settings.is_multi_tariff_enabled() else 'subscription_extend'
+ sub_btn_text = '📱 Мои подписки' if settings.is_multi_tariff_enabled() else '📱 Моя подписка'
keyboard = InlineKeyboardMarkup(
inline_keyboard=[
[
@@ -1611,11 +1599,7 @@ class MonitoringService:
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
- extend_callback = (
- f'se:{subscription.id}'
- if settings.is_multi_tariff_enabled()
- else 'subscription_extend'
- )
+ extend_callback = f'se:{subscription.id}' if settings.is_multi_tariff_enabled() else 'subscription_extend'
keyboard = InlineKeyboardMarkup(
inline_keyboard=[
@@ -1707,11 +1691,7 @@ class MonitoringService:
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup
- extend_callback = (
- f'se:{subscription.id}'
- if settings.is_multi_tariff_enabled()
- else 'subscription_extend'
- )
+ extend_callback = f'se:{subscription.id}' if settings.is_multi_tariff_enabled() else 'subscription_extend'
keyboard = InlineKeyboardMarkup(
inline_keyboard=[
diff --git a/app/services/recurrent_payment_service.py b/app/services/recurrent_payment_service.py
index 028f3a6f..2b8739f7 100644
--- a/app/services/recurrent_payment_service.py
+++ b/app/services/recurrent_payment_service.py
@@ -55,9 +55,7 @@ _daily_guard = _DailyGuard()
def _build_extend_keyboard(texts, subscription_id: int | None = None) -> InlineKeyboardMarkup:
"""Клавиатура с кнопкой продления подписки для уведомлений."""
extend_callback = (
- f'se:{subscription_id}'
- if settings.is_multi_tariff_enabled() and subscription_id
- else 'subscription_extend'
+ f'se:{subscription_id}' if settings.is_multi_tariff_enabled() and subscription_id else 'subscription_extend'
)
return InlineKeyboardMarkup(
inline_keyboard=[
diff --git a/app/services/remnawave_service.py b/app/services/remnawave_service.py
index dfb7560f..45fdf4c8 100644
--- a/app/services/remnawave_service.py
+++ b/app/services/remnawave_service.py
@@ -2161,7 +2161,9 @@ class RemnaWaveService:
create_kwargs['external_squad_uuid'] = sub.tariff.external_squad_uuid
# Определяем UUID для обновления
- panel_uuid = sub.remnawave_uuid if settings.is_multi_tariff_enabled() else user.remnawave_uuid
+ panel_uuid = (
+ sub.remnawave_uuid if settings.is_multi_tariff_enabled() else user.remnawave_uuid
+ )
# Если нет UUID в базе, ищем пользователя по telegram_id в панели
if not panel_uuid and user.telegram_id:
diff --git a/app/services/remnawave_webhook_service.py b/app/services/remnawave_webhook_service.py
index 8e1697ba..ac456dcb 100644
--- a/app/services/remnawave_webhook_service.py
+++ b/app/services/remnawave_webhook_service.py
@@ -413,8 +413,7 @@ class RemnaWaveWebhookService:
# Fallback 2: all lookups exhausted
logger.warning(
- 'Webhook: подписка не найдена ни по одному методу поиска, '
- 'возвращаем (user, None)',
+ 'Webhook: подписка не найдена ни по одному методу поиска, возвращаем (user, None)',
remnawave_uuid=remnawave_uuid,
user_id=user.id,
)
@@ -447,9 +446,7 @@ class RemnaWaveWebhookService:
texts = get_texts(user.language)
button_text = texts.get('WEBHOOK_RENEW_BUTTON', 'Renew subscription')
extend_callback = (
- f'se:{subscription_id}'
- if settings.is_multi_tariff_enabled() and subscription_id
- else 'subscription_extend'
+ f'se:{subscription_id}' if settings.is_multi_tariff_enabled() and subscription_id else 'subscription_extend'
)
return InlineKeyboardMarkup(
inline_keyboard=[
@@ -928,13 +925,17 @@ class RemnaWaveWebhookService:
await self._notify_user(
user,
'WEBHOOK_SUB_DELETED',
- reply_markup=self._get_renew_keyboard(user, getattr(subscription, 'id', None) if subscription else None),
+ reply_markup=self._get_renew_keyboard(
+ user, getattr(subscription, 'id', None) if subscription else None
+ ),
)
else:
await self._notify_user(
user,
'WEBHOOK_SUB_DELETED',
- reply_markup=self._get_renew_keyboard(user, getattr(subscription, 'id', None) if subscription else None),
+ reply_markup=self._get_renew_keyboard(
+ user, getattr(subscription, 'id', None) if subscription else None
+ ),
)
async def _attempt_panel_recreation(self, db: AsyncSession, user: User, subscription: Subscription) -> bool:
@@ -1046,7 +1047,9 @@ class RemnaWaveWebhookService:
self, db: AsyncSession, user: User, subscription: Subscription | None, data: dict
) -> None:
sub_id = getattr(subscription, 'id', None) if subscription else None
- await self._notify_user(user, 'WEBHOOK_SUB_EXPIRED_24H_AGO', reply_markup=self._get_renew_keyboard(user, sub_id))
+ await self._notify_user(
+ user, 'WEBHOOK_SUB_EXPIRED_24H_AGO', reply_markup=self._get_renew_keyboard(user, sub_id)
+ )
async def _handle_first_connected(
self, db: AsyncSession, user: User, subscription: Subscription | None, data: dict
diff --git a/app/services/subscription_auto_purchase_service.py b/app/services/subscription_auto_purchase_service.py
index 2021dee9..8706298e 100644
--- a/app/services/subscription_auto_purchase_service.py
+++ b/app/services/subscription_auto_purchase_service.py
@@ -1748,8 +1748,7 @@ async def _auto_add_traffic(
subscription = await get_subscription_by_id_for_user(db, parsed_sub_id, user.id) if parsed_sub_id else None
if subscription is None and parsed_sub_id:
logger.warning(
- 'Автопокупка трафика: subscription_id из корзины не найден у пользователя, '
- 'НЕ используем эвристику',
+ 'Автопокупка трафика: subscription_id из корзины не найден у пользователя, НЕ используем эвристику',
saved_subscription_id=parsed_sub_id,
user_id=user.id,
)
@@ -2081,11 +2080,7 @@ async def try_auto_extend_expired_after_topup(
from app.database.crud.subscription import get_all_subscriptions_by_user_id
all_subs = await get_all_subscriptions_by_user_id(db, user.id)
- expired_subs = [
- s
- for s in all_subs
- if s.status == SubscriptionStatus.EXPIRED.value and not s.is_trial
- ]
+ expired_subs = [s for s in all_subs if s.status == SubscriptionStatus.EXPIRED.value and not s.is_trial]
if not expired_subs:
subscription = None
else:
@@ -2180,10 +2175,7 @@ async def try_auto_extend_expired_after_topup(
# modified in the last 60 seconds (indicates a concurrent renewal just landed).
try:
await db.refresh(subscription, attribute_names=['updated_at'])
- if (
- subscription.updated_at
- and (datetime.now(UTC) - subscription.updated_at) < timedelta(seconds=60)
- ):
+ if subscription.updated_at and (datetime.now(UTC) - subscription.updated_at) < timedelta(seconds=60):
logger.info(
'🔄 Автопродление expired: пропуск — подписка обновлена секунд назад',
format_user_id=_format_user_id(user),
@@ -2524,10 +2516,7 @@ async def try_resume_disabled_daily_after_topup(
# was modified in the last 60 seconds (indicates a concurrent charge just landed).
try:
await db.refresh(subscription, attribute_names=['updated_at'])
- if (
- subscription.updated_at
- and (datetime.now(UTC) - subscription.updated_at) < timedelta(seconds=60)
- ):
+ if subscription.updated_at and (datetime.now(UTC) - subscription.updated_at) < timedelta(seconds=60):
logger.info(
'🔄 Авто-возобновление daily: пропуск — подписка обновлена секунд назад',
format_user_id=_format_user_id(user),
diff --git a/app/services/user_cart_service.py b/app/services/user_cart_service.py
index a75d7fc7..62b87181 100644
--- a/app/services/user_cart_service.py
+++ b/app/services/user_cart_service.py
@@ -355,9 +355,7 @@ class UserCartService:
global_cart = await self.get_user_cart(user_id)
if global_cart and global_cart.get('subscription_id') is not None:
sub_id = global_cart['subscription_id']
- already_covered = any(
- c.get('subscription_id') == sub_id for c in results
- )
+ already_covered = any(c.get('subscription_id') == sub_id for c in results)
if not already_covered:
results.append(global_cart)
except Exception as e:
diff --git a/app/services/user_service.py b/app/services/user_service.py
index 8f1a4c27..d0ac4a46 100644
--- a/app/services/user_service.py
+++ b/app/services/user_service.py
@@ -758,7 +758,9 @@ class UserService:
logger.info(
'✅ RemnaWave подписка восстановлена при разблокировке',
subscription_id=sub.id,
- remnawave_uuid=sub.remnawave_uuid if settings.is_multi_tariff_enabled() else user.remnawave_uuid,
+ remnawave_uuid=sub.remnawave_uuid
+ if settings.is_multi_tariff_enabled()
+ else user.remnawave_uuid,
)
except Exception as e:
logger.error(