chore: ruff format
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -2184,8 +2184,7 @@ async def confirm_delete_tariff(
|
||||
warning = ''
|
||||
if subs_count > 0:
|
||||
warning = (
|
||||
f'\n\n⚠️ <b>Внимание!</b> На этом тарифе {subs_count} неактивных подписок.\n'
|
||||
f'Они потеряют привязку к тарифу.'
|
||||
f'\n\n⚠️ <b>Внимание!</b> На этом тарифе {subs_count} неактивных подписок.\nОни потеряют привязку к тарифу.'
|
||||
)
|
||||
|
||||
await callback.message.edit_text(
|
||||
|
||||
@@ -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(
|
||||
[
|
||||
[
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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(
|
||||
'🎁 Пользователю выдан тариф по кампании на дней',
|
||||
|
||||
@@ -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=[
|
||||
|
||||
@@ -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=[
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user