fix: исправлены URL в уведомлениях и добавлены недостающие Telegram endpoints

- Исправлены некорректные URL в feed/notification_signals.py (/feed/post/{id}/ → /post/{id}/)
- Исправлены URL в documents/notification_signals.py (удален несуществующий /documents/{id}/)
- Добавлены 3 недостающих endpoint для Telegram интеграции в notifications/api_urls.py
- Создан отчет об аудите URL уведомлений (NOTIFICATION_URLS_AUDIT.md)
- Создан полный список всех эндпоинтов проекта (ENDPOINTS_LIST.md)
This commit is contained in:
Игорь Надеин 2025-12-26 14:10:13 +03:00
parent 48631f43fd
commit a2500ee377
5 changed files with 664 additions and 5 deletions

View File

@ -0,0 +1,372 @@
# Список всех эндпоинтов Django проекта EUSRR
**Дата:** 26 декабря 2025 г.
---
## 🔐 Аутентификация (`/auth/`)
### Frontend Auth
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET/POST | `/auth/login/` | Вход по email или телефону | `EmailOrPhoneLoginView` |
| GET/POST | `/auth/logout/` | Подтверждение выхода | `ConfirmLogoutView` |
| GET/POST | `/auth/register/` | Регистрация | `register_view` |
| GET/POST | `/auth/verify-email/` | Подтверждение email | `verify_email_view` |
| POST | `/auth/resend-email/` | Повторная отправка email | `resend_email_view` |
| GET/POST | `/auth/password-reset/` | Сброс пароля | `PasswordResetView` |
| GET | `/auth/password-reset/done/` | Подтверждение отправки | `PasswordResetDoneView` |
| GET/POST | `/auth/reset/<uidb64>/<token>/` | Подтверждение сброса | `PasswordResetConfirmView` |
| GET | `/auth/reset/done/` | Завершение сброса | `PasswordResetCompleteView` |
---
## 📄 Документы (`/documents/`)
### Frontend
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/documents/` | Список документов | `DocumentView` |
| POST | `/documents/ack/<int:pk>/` | Подтверждение прочтения | `acknowledge_document` |
---
## 📝 Заявки (`/requests/`)
### Frontend
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/requests/` | Список заявок (основной view) | `RequestsView` |
| GET | `/requests/my/` | Мои заявки | `my_requests` |
| GET | `/requests/all/` | Все заявки | `all_requests` |
| GET/POST | `/requests/new/` | Создать заявку | `request_create` |
| GET | `/requests/<int:pk>/` | Детали заявки | `request_detail` |
| POST | `/requests/<int:pk>/process/` | Обработать заявку | `request_process` |
| POST | `/requests/<int:pk>/cancel/` | Отменить заявку | `request_cancel` |
| GET | `/requests/comments/<int:pk>/` | Комментарии к заявке | `request_comments` |
| POST | `/requests/comments/<int:pk>/add/` | Добавить комментарий | `request_comment_add` |
| POST | `/requests/<int:pk>/comments/add/` | Добавить комментарий (альт.) | `request_comment_add` |
| POST | `/requests/<int:pk>/comments/<int:comment_id>/delete/` | Удалить комментарий | `request_comment_delete` |
---
## 👥 Сотрудники (`/employees/`)
### Frontend
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/employees/list/` | Список сотрудников | `employee_list` |
| GET | `/employees/me/` | Мой профиль | `employee_profile` |
| GET/POST | `/employees/me/edit/` | Редактировать профиль | `employee_edit_me` |
| GET | `/employees/<int:pk>/` | Профиль сотрудника | `employee_profile` |
| GET/POST | `/employees/<int:pk>/edit/` | Редактировать сотрудника | `employee_edit` |
| GET/POST | `/employees/create/` | Создать сотрудника | `employee_create` |
| GET/POST | `/employees/create/modal/` | Создать (модальное окно) | `employee_create_modal` |
#### Группы
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| POST | `/employees/employees/<int:pk>/groups/bulk/` | Массовое управление группами | `employee_groups_bulk` |
| POST | `/employees/groups/create/` | Создать группу | `group_create` |
| POST | `/employees/groups/delete/` | Удалить группу | `group_delete` |
#### Отделы
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/employees/departments/` | Список отделов | `department_list` |
| GET | `/employees/departments/<int:pk>/` | Детали отдела | `department_detail` |
| POST | `/employees/departments/create/` | Создать отдел | `department_create` |
| GET/POST | `/employees/departments/<int:pk>/edit/` | Редактировать отдел | `department_edit` |
| POST | `/employees/departments/<int:pk>/set-head/` | Назначить руководителя | `department_set_head` |
| POST | `/employees/departments/<int:pk>/roles/edit/` | Изменить роль в отделе | `edit_department_role` |
| POST | `/employees/<int:emp_id>/departments/<int:dept_id>/set-role/` | Установить роль члена | `set_member_role` |
| POST | `/employees/departments/<int:pk>/add-member/` | Добавить сотрудника | `department_add_member` |
| POST | `/employees/departments/<int:pk>/remove-member/` | Удалить сотрудника | `department_remove_member` |
#### Навыки
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| POST | `/employees/<int:pk>/skill/add/` | Добавить навык | `skill_add` |
| POST | `/employees/<int:pk>/skill/remove/` | Удалить навык | `skill_remove` |
#### Должности
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| POST | `/employees/positions/create/` | Создать должность | `position_create_front` |
| GET | `/employees/positions/<int:pos_id>/` | Детали должности | `position_detail_front` |
| POST | `/employees/positions/<int:pos_id>/update/` | Обновить должность | `position_update_front` |
| POST | `/employees/<int:emp_id>/set-position/` | Установить должность | `employee_set_position_front` |
| POST | `/employees/me/set-position/` | Установить свою должность | `employee_set_position_me_front` |
---
## 💬 Мессенджер (`/communications/`)
### Frontend
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/communications/chats/` | Список чатов | `ChatListView` |
| GET | `/communications/chats/<int:pk>/` | Детали чата | `ChatDetailView` |
| GET | `/communications/test/websocket-events/` | Тестирование WebSocket | TemplateView |
| POST | `/communications/chats/start/<int:employee_pk>/` | Начать приватный чат | `start_private_chat` |
| POST | `/communications/start/private/<int:employee_pk>/` | Начать приватный чат (альт.) | `start_private_chat` |
| POST | `/communications/chats/<int:pk>/mark-read/` | Отметить как прочитанное | `chat_mark_read` |
---
## 🔔 Уведомления (`/notifications/`)
### Frontend
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/notifications/` | Список уведомлений | `notification_list` |
| GET/POST | `/notifications/settings/` | Настройки уведомлений | `notification_settings` |
| POST | `/notifications/test/create/` | Создать тестовое уведомление | `create_test_notification` |
---
## 🔍 Поиск (`/search/`)
### Frontend
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/search/` | Глобальный поиск | `search_view` |
---
## 💰 Финансы (`/finance/`)
### Frontend
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/finance/` | Панель финансов | `finance_dashboard` |
---
## 📰 Лента новостей (`/` - feed)
### Frontend
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/` | Главная лента | `feed_list` |
| GET | `/departments/<int:pk>/` | Лента отдела | `department_feed` |
| GET | `/employees/<int:pk>/` | Лента сотрудника | `employee_feed` |
| GET | `/post/<int:pk>/` | Детали поста | `post_detail` |
| POST | `/post/<int:pk>/pin/` | Закрепить пост | `pin_post` |
| POST | `/post/<int:pk>/like/` | Лайк/дизлайк поста | `toggle_like` |
---
## 🔌 API (`/api/`)
### Аутентификация API
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| POST | `/api/auth/token/` | Получить JWT токен | `PhoneOrEmailTokenObtainPairView` |
| POST | `/api/auth/token/refresh/` | Обновить JWT токен | `TokenRefreshView` |
---
## 🔌 API v1 (`/api/v1/`)
### Аутентификация
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| POST | `/api/v1/auth/register/` | Регистрация | `RegisterAPIView` |
| POST | `/api/v1/auth/resend-email/` | Повторная отправка email | `ResendEmailAPIView` |
| POST | `/api/v1/auth/verify-email/` | Подтверждение email | `VerifyEmailAPIView` |
### Календарь
| Метод | URL | Описание | ViewSet |
|-------|-----|----------|---------|
| GET/POST | `/api/v1/calendar/events/` | Список/создание событий | `CalendarEventsViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/calendar/events/<int:pk>/` | CRUD события | `CalendarEventsViewSet` |
### Документы
| Метод | URL | Описание | ViewSet |
|-------|-----|----------|---------|
| GET/POST | `/api/v1/documents/` | Список/создание документов | `DocumentViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/documents/<int:pk>/` | CRUD документа | `DocumentViewSet` |
### Заявки
| Метод | URL | Описание | ViewSet |
|-------|-----|----------|---------|
| GET/POST | `/api/v1/requests/` | Список/создание заявок | `RequestViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/requests/<int:pk>/` | CRUD заявки | `RequestViewSet` |
### Отделы
| Метод | URL | Описание | ViewSet |
|-------|-----|----------|---------|
| GET/POST | `/api/v1/departments/` | Список/создание отделов | `DepartmentViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/departments/<int:pk>/` | CRUD отдела | `DepartmentViewSet` |
### Сотрудники
| Метод | URL | Описание | ViewSet |
|-------|-----|----------|---------|
| GET/POST | `/api/v1/employees/` | Список/создание сотрудников | `EmployeeViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/employees/<int:pk>/` | CRUD сотрудника | `EmployeeViewSet` |
| GET/POST | `/api/v1/employee-actions/` | Действия сотрудников | `EmployeeActionViewSet` |
### Должности
| Метод | URL | Описание | ViewSet |
|-------|-----|----------|---------|
| GET/POST | `/api/v1/positions/` | Список/создание должностей | `PositionViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/positions/<int:pk>/` | CRUD должности | `PositionViewSet` |
### Роли в отделах
| Метод | URL | Описание | ViewSet |
|-------|-----|----------|---------|
| GET/POST | `/api/v1/department-roles/` | Список/создание ролей | `DepartmentRoleViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/department-roles/<int:pk>/` | CRUD роли | `DepartmentRoleViewSet` |
### Навыки
| Метод | URL | Описание | ViewSet |
|-------|-----|----------|---------|
| GET/POST | `/api/v1/skills/` | Список/создание навыков | `SkillViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/skills/<int:pk>/` | CRUD навыка | `SkillViewSet` |
### Группы
| Метод | URL | Описание | ViewSet |
|-------|-----|----------|---------|
| GET/POST | `/api/v1/groups/` | Список/создание групп | `GroupViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/groups/<int:pk>/` | CRUD группы | `GroupViewSet` |
### Лента
| Метод | URL | Описание | ViewSet |
|-------|-----|----------|---------|
| GET/POST | `/api/v1/posts/` | Список/создание постов | `PostViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/posts/<int:pk>/` | CRUD поста | `PostViewSet` |
| GET/POST | `/api/v1/comments/` | Список/создание комментариев | `CommentViewSet` |
| GET/PUT/PATCH/DELETE | `/api/v1/comments/<int:pk>/` | CRUD комментария | `CommentViewSet` |
### Мессенджер API
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/api/v1/communications/chats/` | Список чатов пользователя | `get_user_chats` |
| POST | `/api/v1/communications/chats/create/` | Создать чат | `create_chat` |
| GET | `/api/v1/communications/chats/<int:pk>/messages/` | Загрузить сообщения чата | `load_chat_messages` |
| POST | `/api/v1/communications/chats/<int:chat_id>/pin/` | Закрепить/открепить чат | `pin_chat` |
| POST | `/api/v1/communications/upload-message/` | Отправить сообщение с файлами | `upload_message_with_attachments` |
#### Реакции
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/api/v1/communications/reactions/available/` | Доступные реакции | `get_available_reactions` |
| GET | `/api/v1/communications/messages/<int:message_id>/reactions/` | Реакции на сообщение | `get_message_reactions` |
| POST | `/api/v1/communications/messages/<int:message_id>/react/` | Добавить реакцию | `add_reaction` |
| DELETE | `/api/v1/communications/messages/<int:message_id>/unreact/` | Удалить реакцию | `remove_reaction` |
#### Операции с сообщениями
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| PUT/PATCH | `/api/v1/communications/messages/<int:message_id>/edit/` | Редактировать сообщение | `edit_message` |
| DELETE | `/api/v1/communications/messages/<int:message_id>/delete/` | Удалить сообщение | `delete_message` |
| POST | `/api/v1/communications/messages/forward/` | Переслать сообщения | `forward_messages` |
| POST | `/api/v1/communications/messages/bulk-delete/` | Массовое удаление | `bulk_delete_messages` |
#### Опросы
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| POST | `/api/v1/communications/polls/create/` | Создать опрос | `create_poll` |
| POST | `/api/v1/communications/polls/<int:poll_id>/vote/` | Проголосовать | `vote_poll` |
| POST | `/api/v1/communications/polls/<int:poll_id>/close/` | Закрыть опрос | `close_poll` |
| GET | `/api/v1/communications/polls/<int:poll_id>/results/` | Результаты опроса | `get_poll_results` |
### Уведомления API
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/api/notifications/` | Список уведомлений | `get_notifications` |
| GET | `/api/notifications/count/` | Количество непрочитанных | `get_unread_count` |
| POST | `/api/notifications/<int:notification_id>/read/` | Отметить как прочитанное | `mark_as_read` |
| POST | `/api/notifications/read-all/` | Отметить все прочитанными | `mark_all_as_read` |
| DELETE | `/api/notifications/<int:notification_id>/` | Удалить уведомление | `delete_notification` |
| GET | `/api/notifications/categories/` | Категории уведомлений | `get_categories` |
| GET | `/api/notifications/settings/` | Получить настройки | `get_user_settings` |
| PUT | `/api/notifications/settings/update/` | Обновить настройки | `update_user_settings` |
| PUT | `/api/notifications/settings/category/update/` | Обновить настройки категории | `update_category_settings` |
#### Telegram интеграция
| Метод | URL | Описание | View |
|-------|-----|----------|------|
| GET | `/api/notifications/telegram/status/` | Статус привязки Telegram | `get_telegram_link_status` |
| POST | `/api/notifications/telegram/generate-code/` | Сгенерировать код привязки | `generate_telegram_link_code` |
| POST | `/api/notifications/telegram/unlink/` | Отвязать Telegram аккаунт | `unlink_telegram` |
---
## 🎯 Админка
| URL | Описание |
|-----|----------|
| `/admin/` | Django Admin Panel |
---
## 📊 Статистика
**Всего эндпоинтов:** ~158+
### По разделам:
- **Аутентификация (Frontend):** 9
- **Аутентификация (API):** 5
- **Документы:** 2
- **Заявки (Frontend):** 11
- **Заявки (API):** ViewSet (5 методов)
- **Сотрудники (Frontend):** 24
- **Сотрудники (API):** 3 ViewSets + endpoints
- **Мессенджер (Frontend):** 6
- **Мессенджер (API):** 19
- **Уведомления (Frontend):** 3
- **Уведомления (API):** 12 (9 основных + 3 Telegram)
- **Поиск:** 1
- **Финансы:** 1
- **Лента (Frontend):** 6
- **Лента (API):** 2 ViewSets
- **Календарь (API):** 1 ViewSet
- **Прочие ViewSets:** 7
- **WebSocket:** 1 endpoint
---
## 🔗 WebSocket
### Realtime (Django Channels)
- **URL Pattern:** `ws://your-domain/ws/` (WebSocket)
- **Consumer:** `UserConsumer` (realtime.consumers)
- **Функции:**
- Чаты и сообщения в реальном времени
- Уведомления в реальном времени
- Обновление бейджей
- Онлайн-статус пользователей
- Другие real-time события
---
## 📝 Примечания
1. **ViewSet endpoints** включают стандартные операции CRUD:
- `list` (GET на коллекцию)
- `create` (POST на коллекцию)
- `retrieve` (GET на элемент)
- `update` (PUT на элемент)
- `partial_update` (PATCH на элемент)
- `destroy` (DELETE на элемент)
2. **Namespace structure:**
```
api:v1:endpoint_name
auth_front:login
employees:profile
communications:chat_list
etc.
```
3. **API Authentication:**
- JWT токены для API (`/api/auth/token/`)
- Session auth для Frontend views
4. **Media files:** Доступны по `/media/` (настроено через `static()`)
---
**Сгенерировано:** 26 декабря 2025 г.

View File

@ -0,0 +1,271 @@
# Аудит URL в уведомлениях
**Дата проверки:** 26 декабря 2025 г.
## 🔍 Цель проверки
Сверить URL-адреса, которые генерируются в `action_url` уведомлений, с реальными эндпоинтами проекта.
---
## ❌ Найденные проблемы
### 1. **Feed (Лента новостей)** - НЕКОРРЕКТНЫЕ URL
#### Проблема в файле: `backend/feed/notification_signals.py`
**Генерируемые URL:**
```python
action_url=f'/feed/post/{post.id}/' # ❌ НЕПРАВИЛЬНО (строки 61, 99, 175)
```
**Реальные эндпоинты:**
- ✅ `/post/{pk}/` - правильный URL (согласно `feed/urls_front.py`)
**Необходимое исправление:**
```python
action_url=f'/post/{post.id}/' # ✅ ПРАВИЛЬНО
```
**Файлы для исправления:**
- `backend/feed/notification_signals.py` (строки 61, 99, 175)
---
### 2. **Calendar (Календарь)** - СПЕЦИФИЧНАЯ ЛОГИКА
#### Файл: `backend/calendar_app/notification_signals.py`
**Генерируемый URL:**
```python
action_url=f'/?event_id={event.id}' # Редирект на главную с параметром
```
**Реальные API эндпоинты:**
- API: `/api/v1/calendar/events/` (ViewSet)
- Frontend: Нет отдельных frontend views для календаря
**Статус:** ⚠️ **УСЛОВНО ПРАВИЛЬНО**
- Календарь не имеет отдельной frontend страницы
- Используется модальное окно на главной странице
- URL корректен для текущей реализации
- **Рекомендация:** Если в будущем добавится страница календаря, изменить на `/calendar/?event_id={event.id}`
---
### 3. **Documents (Документы)** - URL МОГУТ БЫТЬ НЕТОЧНЫМИ
#### Файл: `backend/documents/notification_signals.py`
**Генерируемые URL:**
```python
action_url=f'/documents/{document.id}/' # ❌ ВОЗМОЖНО НЕПРАВИЛЬНО (строки 345, 464)
```
**Реальные эндпоинты:**
- ✅ `/documents/` - список документов
- ✅ `/documents/ack/{pk}/` - подтверждение ознакомления
- ❌ `/documents/{pk}/` - **НЕ СУЩЕСТВУЕТ**
**Проблема:**
Нет эндпоинта для просмотра отдельного документа. Есть только список.
**Возможные решения:**
1. **Вариант А:** Вести на список документов с якорем
```python
action_url=f'/documents/#document-{document.id}'
```
2. **Вариант Б:** Создать view для детального просмотра документа
```python
# В documents/urls.py добавить:
path('<int:pk>/', DocumentDetailView.as_view(), name='document_detail'),
```
3. **Вариант В:** Открывать модальное окно с параметром
```python
action_url=f'/documents/?doc_id={document.id}'
```
**Статус:** ❌ **ТРЕБУЕТ ИСПРАВЛЕНИЯ**
---
### 4. **Requests (Заявки)** - НЕКОРРЕКТНЫЕ URL
#### Файл: `backend/requests_app/notification_signals.py`
**Генерируемые URL:**
```python
action_url=f'/requests/{request_obj.id}/' # ❌ НЕПРАВИЛЬНО (строки 122, 231, 315)
```
**Реальные эндпоинты:**
- ✅ `/requests/` - главная страница заявок (RequestsView)
- ✅ `/requests/my/` - мои заявки
- ✅ `/requests/all/` - все заявки
- ✅ `/requests/{pk}/` - ✅ **ПРАВИЛЬНО** - детали заявки (request_detail)
**Статус:** ✅ **ПРАВИЛЬНО**
Эндпоинт существует согласно `requests_app/urls.py` (строка в urls_front.py: path("<int:pk>/", ...))
---
### 5. **Communications (Мессенджер)** - ПРАВИЛЬНЫЕ URL
#### Файл: `backend/communications/notification_signals.py`
**Генерируемые URL:**
```python
action_url=f'/communications/chats/{chat.id}/?message={instance.id}' # ✅ (строки 63, 87)
action_url=f'/communications/chats/{chat.id}/' # ✅ (строки 117, 136, 180)
```
**Реальные эндпоинты:**
- ✅ `/communications/chats/{pk}/` - детали чата (ChatDetailView)
**Статус:** ✅ **ПРАВИЛЬНО**
---
## 📊 Сводная таблица проверки
| Приложение | Генерируемый URL | Реальный эндпоинт | Статус | Действие |
|------------|------------------|-------------------|--------|----------|
| **feed** | ~~`/feed/post/{id}/`~~ → `/post/{id}/` | `/post/{id}/` | ✅ | **Исправлено** |
| **calendar** | `/?event_id={id}` | Нет отдельной страницы | ⚠️ | Мониторить |
| **documents** | ~~`/documents/{id}/`~~ → `/documents/` | `/documents/` (список) | ✅ | **Исправлено** |
| **requests** | `/requests/{id}/` | `/requests/{pk}/` | ✅ | Нет действий |
| **communications** | `/communications/chats/{id}/` | `/communications/chats/{pk}/` | ✅ | Нет действий |
---
## 🔧 Требуемые исправления
### ✅ ИСПРАВЛЕНО: Критичные ошибки
#### ✅ 1.1 Feed - Исправлены URL постов
**Файл:** `backend/feed/notification_signals.py`
**Выполненные замены:**
- ✅ Строка 61: `'/feed/post/{post.id}/'` → `'/post/{post.id}/'`
- ✅ Строка 99: `'/feed/post/{post.id}/'` → `'/post/{post.id}/'`
- ✅ Строка 175: `'/feed/post/{post.id}/'` → `'/post/{post.id}/'`
**Статус:** ✅ ВЫПОЛНЕНО
#### ✅ 1.2 Documents - Исправлены URL документов
**Выбрано решение:** Изменить на список документов (так как DetailView не существует)
**Файл:** `backend/documents/notification_signals.py`
**Выполненные замены:**
- ✅ Строка 345: `'/documents/{document.id}/'` → `'/documents/'`
- ✅ Строка 464: `'/documents/{document.id}/'` → `'/documents/'`
**Обоснование:**
- У Documents нет отдельной страницы для просмотра одного документа
- Список документов показывает все доступные документы
- Пользователь сможет найти нужный документ в списке
**Статус:** ✅ ВЫПОЛНЕНО
---
## ✅ Проверенные и корректные модули
1. **Communications** - все URL корректны
2. **Requests** - все URL корректны (есть view для детального просмотра)
3. **Calendar** - работает через модальные окна на главной странице
---
## 📝 Рекомендации
### 1. Централизованное управление URL
Создать утилиту для генерации URL уведомлений:
```python
# notifications/url_builders.py
def get_post_url(post_id):
"""Генерирует URL для поста в ленте"""
return f'/post/{post_id}/'
def get_document_url(document_id):
"""Генерирует URL для документа"""
return f'/documents/?doc_id={document_id}'
def get_request_url(request_id):
"""Генерирует URL для заявки"""
return f'/requests/{request_id}/'
def get_chat_url(chat_id, message_id=None):
"""Генерирует URL для чата"""
url = f'/communications/chats/{chat_id}/'
if message_id:
url += f'?message={message_id}'
return url
```
**Преимущества:**
- Единая точка изменения URL
- Проще тестировать
- Легче поддерживать
### 2. Автоматическая проверка URL
Добавить тесты для проверки корректности URL в уведомлениях:
```python
# notifications/tests/test_urls.py
def test_notification_urls_are_valid():
"""Проверяет, что URL в уведомлениях существуют"""
from django.urls import resolve, Resolver404
test_urls = [
'/post/1/',
'/documents/',
'/requests/1/',
'/communications/chats/1/',
]
for url in test_urls:
try:
resolve(url)
except Resolver404:
assert False, f"URL {url} не существует"
```
### 3. Документация URL паттернов
Создать файл с описанием всех URL паттернов для уведомлений в `docs/`.
---
## 🎯 План действий
### ✅ Выполнено:
1. ✅ Исправлены URL в `feed/notification_signals.py` (3 места)
2. ✅ Исправлены URL в `documents/notification_signals.py` (2 места)
### В ближайшее время:
3. ⚠️ Создать утилиту для генерации URL (`notifications/url_builders.py`)
4. ⚠️ Добавить тесты для проверки URL
5. ⚠️ Обновить все signals для использования новой утилиты
### Долгосрочно:
6. 📝 Добавить проверку URL в CI/CD
7. 📝 Создать документацию по URL паттернам
8. 📝 Рассмотреть создание DetailView для documents (если потребуется)
---
**Итого найдено проблем:** 2 критичные (✅ исправлены), 1 предупреждение
**Проверено модулей:** 5
**Общий статус:** ✅ **Все критичные проблемы исправлены**

View File

@ -342,7 +342,7 @@ def check_all_acknowledged(sender, instance, created, **kwargs):
f'"{document.title}"'
),
content_object=document,
action_url=f'/documents/{document.id}/',
action_url='/documents/',
metadata={
'document_id': document.id,
'total_recipients': total_recipients,
@ -461,7 +461,7 @@ def create_document_ready_notification(document, recipient, send_immediately=Tru
f'Требуется ознакомление.'
),
content_object=document,
action_url=f'/documents/{document.id}/',
action_url='/documents/',
metadata={
'document_id': document.id,
'uploaded_by_id': (

View File

@ -58,7 +58,7 @@ def create_comment_notification(sender, instance, created, **kwargs):
f' прокомментировал: {truncate_text(comment.text, 80)}'
),
content_object=post,
action_url=f'/feed/post/{post.id}/',
action_url=f'/post/{post.id}/',
metadata={
'post_id': post.id,
'post_title': post.title,
@ -96,7 +96,7 @@ def notify_new_post(post):
title=f'Новая публикация {context}',
message=f'{post.title}',
content_object=post,
action_url=f'/feed/post/{post.id}/',
action_url=f'/post/{post.id}/',
metadata={
'post_id': post.id,
'post_type': post.type,
@ -172,7 +172,7 @@ def notify_post_reaction(post, user):
f'понравилась публикация "{post.title}"'
),
content_object=post,
action_url=f'/feed/post/{post.id}/',
action_url=f'/post/{post.id}/',
metadata={
'post_id': post.id,
'post_title': post.title,

View File

@ -33,4 +33,20 @@ urlpatterns = [
api_views.update_category_settings,
name='category_settings_update'
),
# Telegram integration
path(
'notifications/telegram/status/',
api_views.get_telegram_link_status,
name='telegram_status'
),
path(
'notifications/telegram/generate-code/',
api_views.generate_telegram_link_code,
name='telegram_generate_code'
),
path(
'notifications/telegram/unlink/',
api_views.unlink_telegram,
name='telegram_unlink'
),
]