- Удален импорт несуществующего web_push_models.py - Используется WebPushDevice напрямую из библиотеки - Добавлена деактивация устройств при ошибках - Улучшено логирование отправки
Django Universal Notifications
Универсальная переиспользуемая система уведомлений для Django 5.2+
✨ Особенности
- 🎯 Простота - 2 модели вместо 6
- 🔄 Универсальность - GenericForeignKey для любых объектов
- 📡 Multi-channel - WebSocket, Email, Web Push
- ⚡ Производительность - оптимизированные индексы и QuerySet
- 🎨 Гибкость - легко расширяется под любые нужды
- 🏗️ Архитектура - по образу django-notifications-hq
🚀 Быстрый старт
from notifications.signals_new import notify
# Создать уведомление
notify.send(
sender=user,
recipient=other_user,
verb='liked',
description='liked your photo',
action_url='/photos/123/'
)
# Получить уведомления
unread = user.notifications.unread()
# Отметить как прочитанное
notification.mark_as_read()
📦 Установка
- Скопируйте приложение
notifications/в ваш проект - Добавьте в
INSTALLED_APPS:INSTALLED_APPS = [ ... 'notifications', ] - Примените миграции:
python manage.py migrate notifications
📚 Документация
Полная документация: backend/docs/guides/NOTIFICATIONS_V2_USAGE.md
🏗️ Архитектура
Модели
Notification - основная модель уведомлений
- Структура:
actorperformedverbonaction_objectattarget - GenericForeignKey для универсальности
UserChannelPreferences - настройки каналов доставки
- Один пользователь - одна запись
- Настройки для всех каналов (web, email, telegram, push)
Компоненты
models_new.py- модели с QuerySet методамиsignals_new.py-notify.send()APIchannels.py- роутинг уведомлений по каналамadmin_new.py- Django Admin интерфейс
💡 Примеры
Социальное взаимодействие
# Лайк
notify.send(
sender=user,
recipient=post.author,
verb='liked',
target=post,
description=f'liked your post "{post.title}"',
action_url=f'/posts/{post.id}/'
)
# Комментарий
notify.send(
sender=commenter,
recipient=post.author,
verb='commented',
action_object=comment,
target=post,
description='commented on your post',
action_url=f'/posts/{post.id}/#comment-{comment.id}'
)
Системные уведомления
# Одобрение документа
notify.send(
sender=approver,
recipient=document.author,
verb='document_approved',
action_object=document,
description=f'Document #{document.id} approved',
action_url=f'/documents/{document.id}/',
data={'approved_by': approver.get_full_name()}
)
Множественные получатели
# Уведомить всю команду
notify.send(
sender=manager,
recipient=team_members, # список пользователей
verb='meeting_scheduled',
description='Team meeting tomorrow at 10:00',
action_url='/calendar/'
)
⚙️ Настройка каналов
# Получить настройки пользователя
prefs = user.channel_preferences
# Включить/выключить каналы
prefs.email_enabled = True
prefs.push_enabled = False
prefs.save()
# Режим "Не беспокоить"
prefs.dnd_enabled = True
prefs.dnd_start_time = '22:00'
prefs.dnd_end_time = '08:00'
prefs.save()
# Отключить определенные типы
prefs.disable_verb('liked')
prefs.disable_verb('followed')
🧩 Интеграция
WebSocket (Django Channels)
Уведомления автоматически отправляются через WebSocket если:
- Django Channels установлен и настроен
web_enabled=Trueв настройках пользователя
Поддержка мгновенных уведомлений и дайджестов:
instant- сразу при созданииdaily- ежедневный дайджестweekly- еженедельный дайджест
Для дайджестов используйте Celery:
from notifications.channels import send_email_digest
send_email_digest(user, frequency='daily')
Web Push
Требуется:
django-push-notificationsустановлен- Модель
WebPushSubscription push_enabled=Trueв настройках
🎯 Рекомендуемые verb типы
Используйте стандартные типы для consistency:
Социальные:
liked,commented,shared,followed,mentioned,replied
Документы:
document_created,document_updated,document_approved,document_rejected
Заявки:
request_created,request_approved,request_rejected,request_completed
Календарь:
event_created,event_updated,event_reminder,event_cancelled
Система:
system_message,reminder,alert,error
📊 QuerySet API
# Фильтрация
user.notifications.unread() # Непрочитанные
user.notifications.read() # Прочитанные
user.notifications.active() # Активные (не удаленные)
user.notifications.deleted() # Удаленные
# Действия
user.notifications.mark_all_as_read() # Отметить все как прочитанные
notification.mark_as_read() # Отметить одно как прочитанное
🔄 Миграция со старых систем
Если мигрируете с другой системы уведомлений, см. раздел "Миграция" в полной документации.
🧪 Тестирование
from notifications.signals_new import notify
# Создать тестовое уведомление
notification = notify.send(
sender=user1,
recipient=user2,
verb='test',
description='Test notification'
)
assert notification.unread == True
assert notification.recipient == user2
📄 Лицензия
MIT License - используйте свободно в своих проектах
🤝 Вклад
Приложение разработано как универсальное решение и может использоваться в любых Django проектах.
Не стесняйтесь адаптировать под свои нужды!
Версия: 2.0
Django: 5.2+
Python: 3.10+