lizerk f4fa00d9bd refactor: Удален Telegram из новой системы уведомлений
- Убрана поддержка Telegram из каналов доставки
- Удалено telegram_enabled из UserChannelPreferences
- Обновлена документация
- Сфокусировались на WebSocket, Email и Web Push

Фокус: веб-уведомления, email дайджесты и web push
2026-03-09 16:01:29 +03:00

248 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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+