feat: per-category enable/disable for admin notifications
Add ADMIN_NOTIFICATIONS_{CATEGORY}_ENABLED settings (default True) for
all 10 notification categories: purchases, renewals, trials, balance,
addons, infrastructure, errors, promo, partners, tickets.
Setting ADMIN_NOTIFICATIONS_PROMO_ENABLED=false now completely suppresses
promo notifications (promocode activations, campaign visits, promo group
changes) instead of silently falling back to the general topic.
Also fix referral_contest_service direct bot.send_message bypass —
now respects ADMIN_NOTIFICATIONS_PROMO_ENABLED setting.
This commit is contained in:
@@ -65,6 +65,18 @@ class Settings(BaseSettings):
|
||||
ADMIN_NOTIFICATIONS_PROMO_TOPIC_ID: int | None = None # Промокоды, кампании, промогруппы
|
||||
ADMIN_NOTIFICATIONS_PARTNERS_TOPIC_ID: int | None = None # Партнёрки, выводы, админ-действия
|
||||
|
||||
# Per-category enable/disable (default True for backwards compatibility)
|
||||
ADMIN_NOTIFICATIONS_PURCHASES_ENABLED: bool = True
|
||||
ADMIN_NOTIFICATIONS_RENEWALS_ENABLED: bool = True
|
||||
ADMIN_NOTIFICATIONS_TRIALS_ENABLED: bool = True
|
||||
ADMIN_NOTIFICATIONS_BALANCE_ENABLED: bool = True
|
||||
ADMIN_NOTIFICATIONS_ADDONS_ENABLED: bool = True
|
||||
ADMIN_NOTIFICATIONS_INFRASTRUCTURE_ENABLED: bool = True
|
||||
ADMIN_NOTIFICATIONS_ERRORS_ENABLED: bool = True
|
||||
ADMIN_NOTIFICATIONS_PROMO_ENABLED: bool = True
|
||||
ADMIN_NOTIFICATIONS_PARTNERS_ENABLED: bool = True
|
||||
ADMIN_NOTIFICATIONS_TICKETS_ENABLED: bool = True
|
||||
|
||||
# Настройки очереди чеков NaloGO
|
||||
NALOGO_QUEUE_CHECK_INTERVAL: int = 600 # Интервал проверки очереди (секунды, 10 мин)
|
||||
NALOGO_QUEUE_RECEIPT_DELAY: int = 3 # Задержка между отправкой чеков (секунды)
|
||||
|
||||
@@ -67,6 +67,12 @@ class AdminNotificationService:
|
||||
NotificationCategory.TICKETS: self.ticket_topic_id,
|
||||
}
|
||||
|
||||
# Per-category enabled flags (default True — backwards compatible)
|
||||
self.category_enabled: dict[NotificationCategory, bool] = {}
|
||||
for cat in NotificationCategory:
|
||||
key = f'ADMIN_NOTIFICATIONS_{cat.value.upper()}_ENABLED'
|
||||
self.category_enabled[cat] = getattr(settings, key, True)
|
||||
|
||||
async def _get_referrer_info(self, db: AsyncSession, referred_by_id: int | None) -> str:
|
||||
if not referred_by_id:
|
||||
return 'Нет'
|
||||
@@ -1266,6 +1272,11 @@ class AdminNotificationService:
|
||||
logger.warning('ADMIN_NOTIFICATIONS_CHAT_ID не настроен')
|
||||
return False
|
||||
|
||||
# Per-category suppression
|
||||
if category and not self.category_enabled.get(category, True):
|
||||
logger.debug('Уведомление подавлено (категория отключена)', category=category.value)
|
||||
return False
|
||||
|
||||
try:
|
||||
message_kwargs = {
|
||||
'chat_id': self.chat_id,
|
||||
|
||||
@@ -301,6 +301,10 @@ class ReferralContestService:
|
||||
lines.append('')
|
||||
lines.append(f'Приз: {html.escape(contest.prize_text)}')
|
||||
|
||||
# Respect per-category enable/disable
|
||||
if not getattr(settings, 'ADMIN_NOTIFICATIONS_PROMO_ENABLED', True):
|
||||
return
|
||||
|
||||
try:
|
||||
await self.bot.send_message(
|
||||
chat_id=chat_id,
|
||||
|
||||
Reference in New Issue
Block a user