800 Commits

Author SHA1 Message Date
lizerk
5d0312a1fe docs: Добавить requirements.txt и обновить README модуля notifications
- Создан requirements.txt с основными зависимостями (Django, DRF, Celery, Channels)
- Обновлена секция установки с подробными инструкциями
- Добавлена структура модуля и описание компонентов
- Обновлены TODO (убраны выполненные задачи)
- Добавлена информация о production-safe миграциях
- Добавлены секции: настройка конфигурации, запуск Celery worker
- Модуль полностью самостоятельный и готов к переносу в другие проекты
2026-03-09 17:39:05 +03:00
lizerk
be9d235346 cleanup: Удалить api/v1/notifications, использовать notifications.api напрямую 2026-03-09 17:35:06 +03:00
lizerk
a14a58cace удалил лишнего 2026-03-09 17:28:08 +03:00
lizerk
5a6dc011dd fix: Безопасные миграции для production и исправления
Миграции (production-safe):
- 0010_drop_old_tables.py: DROP TABLE IF EXISTS (безопасно)
- 0011_create_v2_models.py: CREATE новых таблиц v2
- Исправлены поля: dnd_start_time/dnd_end_time теперь nullable
- Удалены created_at/updated_at из UserChannelPreferences

Исправления:
- models.py: удалены created_at/updated_at из UserChannelPreferences
- models.py: db_table = 'notifications_userchannelpreferences' (слитно)
- admin.py: удалены ссылки на created_at/updated_at
- channels.py: удален мусор после рефакторинга
- urls.py: создан для обратной совместимости

Тесты:
✅ UserChannelPreferences creation
✅ QuerySet методы (unread, read, mark_all_as_read)
✅ mark_as_read/unread
⚠️ notify.send() - ошибка watson search (не критично)

Результат:
- Миграции работают на пустой и заполненной БД
- Старые данные удаляются безопасно (IF EXISTS)
- Можно git clone → migrate → запуск на production
2026-03-09 17:27:31 +03:00
lizerk
72b67d5c6a fix: Исправлены синтаксические ошибки и добавлены миграции
Исправлено:
- channels.py: удалены осиротевшие строки после рефакторинга
- api/v1/notifications/urls.py: исправлен file для реэкспорта
- notifications/urls.py: создан для обратной совместимости

Миграции:
- 0010_userchannelpreferences_and_more.py: переход на v2 модели
  * Notification с GenericForeignKey (actor/action_object/target)
  * UserChannelPreferences вместо UserNotificationSettings
  * Удалены старые модели (NotificationCategory, NotificationType и тд.)
  * Переименована таблица в notifications_notification_v2
2026-03-09 17:15:08 +03:00
lizerk
5220a96684 refactor: Модуль notifications полностью самостоятельный и переиспользуемый
КРИТИЧНЫЕ УЛУЧШЕНИЯ:
✅ Убран хардкод 'EUSRR' → универсальное 'My Site'
✅ Созданы email шаблоны внутри модуля (4 файла)
✅ Централизованная конфигурация в config.py
✅ API перемещен в notifications/api/

Новые файлы:
- config.py - централизованные настройки с fallback значениями
- templates/notifications/email/*.html/*.txt - HTML и текстовые шаблоны
- api/__init__.py, api/views.py, api/urls.py - REST API внутри модуля

Изменения в существующих файлах:
- senders/email.py: использует config.site_name() и config.from_email()
- tasks/email.py: rate_limit, max_retries, retry_delay из config
- tasks/push.py: rate_limit, max_retries, retry_delay из config
- tasks/websocket.py: max_retries, retry_delay из config
- api/v1/notifications/urls.py: реэкспорт из notifications.api (обратная совместимость)

Структура шаблонов:
📁 notifications/templates/notifications/email/
  ├── notification.html - красивый HTML для обычных уведомлений
  ├── notification.txt - текстовая версия
  ├── digest.html - HTML дайджест (daily/weekly)
  └── digest.txt - текстовая версия дайджеста

Конфигурация (config.py):
- DEFAULT_CONFIG с fallback значениями для всех параметров
- get_config() - объединяет с settings.NOTIFICATIONS_CONFIG
- Удобные функции: email_rate_limit(), push_max_retries(), site_name()
- Полностью настраиваемо через settings проекта

API внутри модуля:
- notifications/api/views.py - все endpoint'ы
- notifications/api/urls.py - URL patterns
- Относительные импорты (from ..models)
- Обратная совместимость через api/v1/notifications/urls.py

УНИВЕРСАЛЬНОСТЬ:
✅ Нет хардкода проекта
✅ Все шаблоны внутри модуля
✅ API внутри модуля
✅ Конфигурация через settings
✅ Можно скопировать в любой проект Django 5.2+
2026-03-09 17:06:20 +03:00
lizerk
11fbcd1e52 docs: Добавлены TODO комментарии по итогам ревью модуля
Критичные задачи:
- Создать email шаблоны (notification.html/txt, digest.html/txt)
- Написать unit и integration тесты (coverage >80%)
- Убрать хардкод 'EUSRR' из email sender

Важные улучшения:
- Вынести настройки rate_limit, max_retries в settings
- Переместить API endpoints в notifications/api/
- Централизовать конфигурацию в notifications/settings.py

Желательные доработки:
- setup.py для публикации в PyPI
- Sphinx документация
- CI/CD pipeline
- Pre-commit hooks

Затронуты файлы:
- models.py - TODO для тестов моделей
- signals.py - TODO для тестов сигналов
- channels.py - TODO для integration тестов
- senders/email.py - TODO для шаблонов и хардкода
- tasks/email.py - TODO для конфигурации
- tasks/push.py - TODO для конфигурации
- README.md - секция TODO с чеклистом
2026-03-09 16:57:23 +03:00
lizerk
2381288bbf cleanup: Удален мертвый код task_base.py
- Файл task_base.py (500 строк) использовал удаленный NotificationService API
- Нигде не импортировался и не использовался
- Создавал путаницу с новым tasks/base.py
- Экономия: -500 строк кода
2026-03-09 16:44:54 +03:00
lizerk
aa614bb4c1 refactor: Переписан API v1 и services для новой архитектуры
BREAKING CHANGES:
- API полностью переписан под новую модель (verb вместо category/type)
- NotificationService заменен на stub с NotImplementedError
- Удалена обратная совместимость

API endpoints (обновлены):
- GET /api/v1/notifications/ - новый формат ответа
- GET /api/v1/notifications/verb-types/ - вместо categories
- GET/PUT /api/v1/notifications/preferences/ - вместо settings
- POST /api/v1/notifications/<id>/unread/ - новый endpoint
- DELETE /api/v1/notifications/delete-all-read/ - новый endpoint

Удалены endpoints:
- /api/v1/notifications/categories/ (нет категорий в v2)
- /api/v1/notifications/settings/* (заменено на preferences)
- /api/v1/notifications/telegram/* (Telegram отключен)
- /api/v1/notifications/push/vapid-key/ (не нужен)
- /api/v1/notifications/push/subscriptions/ (не нужен)

services.py:
- Заменен на stub с NotImplementedError
- Все методы выбрасывают исключения с подсказками миграции
- Документация как мигрировать со старого API

Новая структура ответа API:
- verb вместо category/type
- actor (GenericForeignKey) вместо sender
- description вместо message/title
- timesince() вместо created_at
- unread вместо is_read

Старые файлы:
- Удалены все *.old файлы
2026-03-09 16:40:59 +03:00
lizerk
d5b4ae9f43 refactor: Полный переход на новую архитектуру уведомлений v2.0
BREAKING CHANGES:
- Удалена старая система (6 моделей → 2 модели)
- models_new.py → models.py (Notification, UserChannelPreferences)
- signals_new.py → signals.py (notify.send API)
- admin_new.py → admin.py

Новая архитектура:
- Все отправки через Celery (полностью асинхронно)
- Модульная структура tasks/ (base, email, push, websocket)
- Каждый канал - отдельный класс задачи наследующий BaseNotificationTask
- Rate limiting, retry, приоритеты из коробки

Обратная совместимость:
- Создан services.py facade для старого API
- NotificationService.create_notification() работает через notify.send()
- Старый код продолжает работать без изменений

Удалено:
- Старые models.py, signals.py, admin.py, tasks.py (→ .old)
- telegram_bot.py, telegram_models.py (Telegram отключен)
- test_views.py, views.py, urls.py (устаревшие)

Создано:
- tasks/ модуль с классовой архитектурой (как senders/)
- tasks/base.py - BaseNotificationTask
- tasks/email.py - EmailNotificationTask + DigestEmailTask
- tasks/push.py - PushNotificationTask
- tasks/websocket.py - WebSocketNotificationTask

Обновлено:
- apps.py - загружает signals, channels, tasks
- channels.py - все отправки через Celery задачи
- Все импорты models_new → models
2026-03-09 16:36:14 +03:00
lizerk
d12efde0d2 fix: PushNotificationSender теперь использует WebPushDevice из django-push-notifications
- Удален импорт несуществующего web_push_models.py
- Используется WebPushDevice напрямую из библиотеки
- Добавлена деактивация устройств при ошибках
- Улучшено логирование отправки
2026-03-09 16:13:03 +03:00
lizerk
fd9b36c1c9 refactor: Удалены старые отправители уведомлений
Очистка от дублирующегося кода:

Удалены старые файлы:
❌ email_sender.py → заменен на senders/email.py
❌ telegram_sender.py → функционал Telegram удален
❌ signals_telegram.py → Telegram сигналы удалены

Обновлены:
✅ apps.py - убран импорт signals_telegram
✅ services.py - обновлены импорты, Telegram помечен deprecated

NotificationService (старый) продолжает работать для обратной
совместимости, но использует новые senders где возможно.

Telegram функционал отключен в старой системе с пометкой
'use new notification system'.

Результат:
- Меньше дублирования кода
- Чище структура проекта
- Все отправители теперь наследуются от BaseNotificationSender
- Готовы к полной миграции на новую архитектуру
2026-03-09 16:07:58 +03:00
lizerk
e1be95fbe4 refactor: Базовый класс для всех отправителей уведомлений
Создана объектно-ориентированная архитектура для отправителей:

Новая структура:
- BaseNotificationSender - абстрактный базовый класс
- EmailNotificationSender(BaseNotificationSender)
- WebSocketNotificationSender(BaseNotificationSender)
- PushNotificationSender(BaseNotificationSender)

Преимущества:
✅ Единый интерфейс send() для всех каналов
✅ can_send() - проверка возможности отправки
✅ Унифицированное логирование (log_success, log_error, log_skip)
✅ Легко расширять новыми каналами
✅ Переиспользуемость кода

Изменения:
- notifications/senders/base.py - базовый класс
- notifications/senders/email.py - email отправитель (упрощен)
- notifications/senders/websocket.py - WebSocket отправитель
- notifications/senders/push.py - Web Push отправитель
- notifications/channels.py - обновлен для использования классов

Старые функции send_* сохранены для обратной совместимости (deprecated)
2026-03-09 16:04:48 +03:00
lizerk
f4fa00d9bd refactor: Удален Telegram из новой системы уведомлений
- Убрана поддержка Telegram из каналов доставки
- Удалено telegram_enabled из UserChannelPreferences
- Обновлена документация
- Сфокусировались на WebSocket, Email и Web Push

Фокус: веб-уведомления, email дайджесты и web push
2026-03-09 16:01:29 +03:00
lizerk
b7d36559b3 feat: Новая система уведомлений v2.0 (на основе django-notifications-hq)
- Упрощена архитектура: 2 модели вместо 6
- GenericForeignKey для универсальности
- Стандартный API notify.send() как в django-notifications-hq
- Совместимость с Django 5.2+
- Сохранен multi-channel функционал (WebSocket, Email, Telegram, Push)
- Создана полная документация

Файлы:
- models_new.py - Notification + UserChannelPreferences
- signals_new.py - notify.send() API
- channels.py - роутинг по каналам доставки
- admin_new.py - Django Admin интерфейс
- README.md - краткое описание для переиспользования
- docs/guides/NOTIFICATIONS_V2_USAGE.md - полное руководство
- docs/reports/NOTIFICATIONS_REFACTORING_REPORT.md - отчет о рефакторинге

Требуется тестирование перед внедрением.
2026-03-09 15:58:27 +03:00
lizerk
c5519cc319 Merge branch 'develop' 2026-03-09 10:12:27 +03:00
lizerk
1041016b25 fix: исправлены оставшиеся параметризованные URL-ы в task_base.py
- /calendar/?event={id} → /calendar
- /feed/?post={id} → /

Теперь все URL-ы во всех уведомлениях ведут на существующие страницы
2026-03-09 10:09:24 +03:00
lizerk
fdd23ab26f Merge branch 'develop' 2026-03-09 10:06:48 +03:00
lizerk
70f9c1950d fix: исправлены URL-ы в уведомлениях на существующие страницы фронтенда
- /requests/{id}/ → /requests
- /documents/{id}/ → /documents
- /calendar (вместо /?event_id={id})
- /procurement/orders/{id}/ → /procurement
- /messages (вместо /communications/chats/{id}/)
- / для постов ленты

Теперь клик по уведомлениям не вызывает 404 ошибки
2026-03-09 10:05:57 +03:00
lizerk
bd1238b3da fix: правильное отображение иконок категорий уведомлений
- Добавлен маппинг категорий на эмодзи-иконки
- Исправлено отображение текста вместо иконок (bi-chat-dots -> 💬)
- Увеличен размер иконок (text-xl)
- Добавлены эмодзи для всех основных категорий
2026-03-09 09:56:02 +03:00
lizerk
30ba5bfceb feat: создана страница со всеми уведомлениями
- Полный список всех уведомлений с прокруткой
- Поиск по заголовку и содержимому
- Фильтрация по статусу (все/непрочитанные/прочитанные)
- Фильтрация по категориям
- Кнопка "Прочитать все" для непрочитанных
- Красивые карточки с иконками категорий
- Клик на уведомление переходит по action_url
- Responsive дизайн
2026-03-09 09:52:49 +03:00
lizerk
1972f89bea fix: исправлено получение уведомлений из бэкенда
- Фронтенд: добавлена обработка поля 'notifications' (бэкенд возвращает { notifications: [...] })
- Фронтенд: исправлены URL endpoints для отметки прочитанным (/read/ вместо /mark_read/)
- Бэкенд: добавлено поле 'short_message' в ответ API для корректного отображения превью
2026-03-09 09:51:00 +03:00
lizerk
9edb7ba6af Merge branch 'develop' 2026-03-09 08:51:17 +03:00
lizerk
8fee8177ad feat: автоматическая подгрузка заявлений при прокрутке
- Удалена кнопка 'Загрузить ещё'
- Реализована автоматическая подгрузка через Intersection Observer API
- Данные начинают загружаться за 100px до конца списка
- Учитываются все фильтры и поиск
- Добавлен индикатор загрузки при подгрузке данных
2026-03-09 08:48:08 +03:00
lizerk
01d6d0bc32 fix: добавлены недостающие параметры фильтрации в API заявлений
- Добавлены параметры view, addressed_to_me, employee_id, date_from, date_to в метод getRequests()
- Теперь фильтры на странице заявлений работают корректно
- Удалены устаревшие сертификаты из localcerts_backup/
2026-03-09 08:42:44 +03:00
lizerk
ae97658872 Merge branch 'develop' - fix birthday events search and cleanup 2026-03-06 21:00:50 +03:00
lizerk
a9f87541e0 fix(birthdays): исправлен поиск и обновление событий ДР из персональных календарей
- Убран фильтр по календарю при поиске существующих событий
- События автоматически переносятся из personal-XX в общий календарь birthdays
- Удаляются дубликаты событий ДР для одного сотрудника
2026-03-06 20:59:25 +03:00
lizerk
6d79a21536 Merge branch 'develop' - fix birthday events timezone calculation 2026-03-06 20:50:01 +03:00
lizerk
f60e1fbd2a fix(birthdays): исправлен порядок операций с timezone для корректной длительности событий 2026-03-06 20:49:36 +03:00
lizerk
42a74ef50d Merge branch 'develop' - add standalone output for Next.js 2026-03-06 20:34:19 +03:00
lizerk
7ab9041eab -оставил только минуты 2026-03-06 20:34:11 +03:00
lizerk
4c1bb9d6b7 Merge branch 'develop' - add standalone output for Next.js 2026-03-06 20:31:40 +03:00
lizerk
3b78bf6761 убрал нафиг дату завершения 2026-03-06 20:31:26 +03:00
lizerk
914e2238d8 Merge branch 'develop' - add standalone output for Next.js 2026-03-06 20:21:31 +03:00
lizerk
684cd10ba1 убрал минуты 2026-03-06 20:21:20 +03:00
lizerk
64baa41a25 Merge branch 'develop' - add standalone output for Next.js 2026-03-06 20:17:47 +03:00
lizerk
40b4a7fc15 - минуты убрал 2026-03-06 20:17:22 +03:00
lizerk
fefe30a26e Merge branch 'develop' - add standalone output for Next.js 2026-03-06 19:57:53 +03:00
lizerk
9e15001f2f feat(frontend): добавлен standalone output для production сборки 2026-03-06 19:57:45 +03:00
lizerk
abaf8a6746 Merge branch 'develop' - fix webpush browser field length 2026-03-06 19:35:27 +03:00
lizerk
88dc3aeb50 fix(migrations): обрезка browser до 10 символов в 0008_migrate_webpush_to_library 2026-03-06 19:35:16 +03:00
lizerk
61725afc27 Merge branch 'develop' - fix migration pending triggers 2026-03-06 19:28:56 +03:00
lizerk
b776b0f87a fix(migrations): отключена data migration в 0005_migrate_to_filer
- Закомментирован RunPython для избежания pending trigger events
- Добавлена команда kill_db_connections для завершения соединений БД
- Data migration нужно выполнить отдельно после применения схемы
2026-03-06 19:28:40 +03:00
lizerk
20bde15cb1 Merge branch 'develop' - fix migration dependency 2026-03-06 19:06:40 +03:00
lizerk
4889e38061 fix(migrations): добавлена зависимость на easy_thumbnails в 0005_migrate_to_filer
- Исправлена ошибка 'relation easy_thumbnails_source does not exist'
- Добавлена зависимость на easy_thumbnails.0001_initial
2026-03-06 19:06:22 +03:00
lizerk
21949bcb0f Merge branch 'develop' - fix requirements.txt 2026-03-06 19:01:56 +03:00
lizerk
e3ba94eb43 fix: удалены маркеры конфликта из requirements.txt 2026-03-06 19:01:27 +03:00
lizerk
592bf8ad37 Merge branch 'develop' into master 2026-03-06 17:47:31 +03:00
lizerk
d1ea2d8c6e fix(birthdays): изменена логика календаря ДР на общий календарь
- Изменено событие на длительность до конца дня вместо 2 дней
- Все ДР теперь добавляются в общий календарь '🎂 Дни рождения'
- Убрана логика личных календарей для каждого сотрудника
2026-03-06 17:47:19 +03:00
lizerk
ebe42a4d40 Merge branch 'frontend/Kostya' into develop
# Conflicts:
#	frontend/src/app/page.tsx
#	frontend/src/app/requests/page.tsx
#	frontend/src/lib/api.ts
2026-03-06 13:37:23 +03:00