- Убрана поддержка Telegram из каналов доставки - Удалено telegram_enabled из UserChannelPreferences - Обновлена документация - Сфокусировались на WebSocket, Email и Web Push Фокус: веб-уведомления, email дайджесты и web push
248 lines
7.0 KiB
Markdown
248 lines
7.0 KiB
Markdown
# Django Universal Notifications
|
||
|
||
Универсальная переиспользуемая система уведомлений для Django 5.2+
|
||
|
||
## ✨ Особенности
|
||
|
||
- 🎯 **Простота** - 2 модели вместо 6
|
||
- 🔄 **Универсальность** - GenericForeignKey для любых объектов
|
||
- 📡 **Multi-channel** - WebSocket, Email, Web Push
|
||
- ⚡ **Производительность** - оптимизированные индексы и QuerySet
|
||
- 🎨 **Гибкость** - легко расширяется под любые нужды
|
||
- 🏗️ **Архитектура** - по образу django-notifications-hq
|
||
|
||
## 🚀 Быстрый старт
|
||
|
||
```python
|
||
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()
|
||
```
|
||
|
||
## 📦 Установка
|
||
|
||
1. Скопируйте приложение `notifications/` в ваш проект
|
||
2. Добавьте в `INSTALLED_APPS`:
|
||
```python
|
||
INSTALLED_APPS = [
|
||
...
|
||
'notifications',
|
||
]
|
||
```
|
||
3. Примените миграции:
|
||
```bash
|
||
python manage.py migrate notifications
|
||
```
|
||
|
||
## 📚 Документация
|
||
|
||
Полная документация: [`backend/docs/guides/NOTIFICATIONS_V2_USAGE.md`](../docs/guides/NOTIFICATIONS_V2_USAGE.md)
|
||
|
||
## 🏗️ Архитектура
|
||
|
||
### Модели
|
||
|
||
**Notification** - основная модель уведомлений
|
||
- Структура: `actor` performed `verb` on `action_object` at `target`
|
||
- GenericForeignKey для универсальности
|
||
|
||
**UserChannelPreferences** - настройки каналов доставки
|
||
- Один пользователь - одна запись
|
||
- Настройки для всех каналов (web, email, telegram, push)
|
||
|
||
### Компоненты
|
||
|
||
- `models_new.py` - модели с QuerySet методами
|
||
- `signals_new.py` - `notify.send()` API
|
||
- `channels.py` - роутинг уведомлений по каналам
|
||
- `admin_new.py` - Django Admin интерфейс
|
||
|
||
## 💡 Примеры
|
||
|
||
### Социальное взаимодействие
|
||
|
||
```python
|
||
# Лайк
|
||
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}'
|
||
)
|
||
```
|
||
|
||
### Системные уведомления
|
||
|
||
```python
|
||
# Одобрение документа
|
||
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()}
|
||
)
|
||
```
|
||
|
||
### Множественные получатели
|
||
|
||
```python
|
||
# Уведомить всю команду
|
||
notify.send(
|
||
sender=manager,
|
||
recipient=team_members, # список пользователей
|
||
verb='meeting_scheduled',
|
||
description='Team meeting tomorrow at 10:00',
|
||
action_url='/calendar/'
|
||
)
|
||
```
|
||
|
||
## ⚙️ Настройка каналов
|
||
|
||
```python
|
||
# Получить настройки пользователя
|
||
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` в настройках пользователя
|
||
|
||
### Email
|
||
|
||
Поддержка мгновенных уведомлений и дайджестов:
|
||
- `instant` - сразу при создании
|
||
- `daily` - ежедневный дайджест
|
||
- `weekly` - еженедельный дайджест
|
||
|
||
Для дайджестов используйте Celery:
|
||
```python
|
||
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
|
||
|
||
```python
|
||
# Фильтрация
|
||
user.notifications.unread() # Непрочитанные
|
||
user.notifications.read() # Прочитанные
|
||
user.notifications.active() # Активные (не удаленные)
|
||
user.notifications.deleted() # Удаленные
|
||
|
||
# Действия
|
||
user.notifications.mark_all_as_read() # Отметить все как прочитанные
|
||
notification.mark_as_read() # Отметить одно как прочитанное
|
||
```
|
||
|
||
## 🔄 Миграция со старых систем
|
||
|
||
Если мигрируете с другой системы уведомлений, см. раздел "Миграция" в полной документации.
|
||
|
||
## 🧪 Тестирование
|
||
|
||
```python
|
||
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+
|