7.1 KiB
Troubleshooting: Edited Messages Lose Attachments/Reply
Проблема
При редактировании сообщений через WebSocket, сообщения с вложениями или ответами становятся "простыми" - теряют эти компоненты в DOM.
Что сделано для исправления
1. Backend Fix: Перезагрузка сообщения с prefetch
Файл: backend/api/v1/communications/views.py
Проблема: При вызове serialize_message(message) после сохранения не подгружались связанные объекты.
Решение: Перезагружать сообщение со всеми связями перед сериализацией:
# БЫЛО:
message.save()
payload = serialize_message(message) # ← attachments не загружены!
# СТАЛО:
message.save()
# Перезагружаем со всеми связями
message = Message.objects.select_related(
'author',
'reply_to',
'reply_to__author',
'forwarded_from_author',
'poll'
).prefetch_related(
'attachments',
'reactions',
'reactions__user',
'poll__options'
).get(pk=message.id)
payload = serialize_message(message) # ← attachments загружены!
2. Frontend: Добавлено детальное логирование
Файл: backend/static/js/components/messageEditing.js
Добавлено подробное логирование для отладки:
console.log('[MessageEditing] ========== MESSAGE DATA ==========');
console.log('[MessageEditing] attachments:', message.attachments);
console.log('[MessageEditing] attachments length:', message.attachments?.length);
console.log('[MessageEditing] reply_to:', message.reply_to);
console.log('[MessageEditing] HTML contains "attachment":', newMessageHtml.includes('attachment'));
Как проверить исправление
Тест 1: Проверка backend сериализации
cd backend
python test_message_serialization.py
Ожидаемый результат:
✓ С prefetch все вложения загружены корректно!
✓ С select_related reply_to загружен корректно!
Тест 2: Проверка MessageRenderer
- Откройте:
http://localhost:9000/test-message-renderer/(нужно добавить URL) - Нажмите кнопки тестов
- Проверьте что HTML содержит:
attachment-itemдля вложенийreply-referenceдля ответовforwarded-indicatorдля пересылок
Тест 3: Реальное редактирование
- Откройте чат с сообщением содержащим вложения
- Откройте DevTools → Console
- Отредактируйте сообщение (только текст!)
- Проверьте логи:
Что должно быть в Console:
[MessageEditing] Message edited event received
[MessageEditing] ========== MESSAGE DATA ==========
[MessageEditing] attachments: [{id: 1, file_name: "test.pdf", ...}]
[MessageEditing] attachments length: 1
[MessageEditing] HTML contains "attachment": true
[MessageEditing] ✓ Message DOM replaced
Возможные проблемы
Проблема 1: attachments undefined
Симптомы:
[MessageEditing] attachments: undefined
[MessageEditing] attachments length: undefined
Причина: Backend не отправил attachments в payload
Решение: Проверить что serialize_message вызывается с перезагруженным объектом
Проблема 2: HTML не содержит attachment
Симптомы:
[MessageEditing] attachments: [{...}]
[MessageEditing] HTML contains "attachment": false
Причина: MessageRenderer.buildMessageHtml не генерирует HTML для вложений
Решение: Проверить логику в messageRenderer.js:
const attachmentsHtml = msg.attachments?.length ?
msg.attachments.map(att => this.buildAttachmentHtml(att)).join('') : '';
Проблема 3: Вложения есть в HTML но не видны
Симптомы:
- В логах:
HTML contains "attachment": true - На странице: вложения не отображаются
Причина: CSS скрывает элементы или JS не переинициализировал компоненты
Решение: Проверить reinitMessageComponents и CSS стили
Проблема 4: reply_to теряется
Симптомы:
[MessageEditing] reply_to: null
Причина: Backend не загрузил reply_to из-за отсутствия select_related
Решение: Убедиться что в edit_message есть:
message = Message.objects.select_related(
'reply_to',
'reply_to__author'
).get(pk=message.id)
Тестовые сценарии
Сценарий 1: Редактирование с вложениями
- Создать сообщение с файлом
- Отредактировать текст сообщения
- Ожидается: Файл остался на месте
Сценарий 2: Редактирование с ответом
- Ответить на чье-то сообщение
- Отредактировать свой ответ
- Ожидается: Блок reply-to остался
Сценарий 3: Редактирование переслан ного
- Переслать сообщение
- Отредактировать текст
- Ожидается: "Переслано от..." остался
Команды для отладки
# Запустить тесты сериализации
cd backend
python test_message_serialization.py
# Проверить что сервер запущен
curl http://localhost:9000/api/v1/communications/reactions/available/
# Открыть тест рендерера (в браузере)
http://localhost:9000/test-message-renderer/
# Смотреть логи WebSocket в реальном времени
# Откройте DevTools → Console → отфильтруйте [MessageEditing]
Статус
- ✅ Backend исправлен (добавлен prefetch)
- ✅ Frontend логирование добавлено
- ⏳ Требуется тестирование на реальных данных
- ⏳ Требуется проверка всех сценариев
Следующие шаги
- Протестировать редактирование сообщения с вложением
- Проверить логи в Console
- Убедиться что
message.attachmentsне undefined - Убедиться что HTML содержит attachment-item
- Проверить что DOM обновился корректно