# Анализ архитектуры рендеринга страницы чата ## Обзор текущей архитектуры Страница чата состоит из серверного (Django) и клиентского (JavaScript) компонентов, работающих вместе для обеспечения real-time обновлений. --- ## 1. Серверный рендеринг (Django) ### `communications/views.py` → `ChatDetailView` **Ответственность:** - Начальная загрузка данных чата и сообщений - Проверка прав доступа пользователя - Подготовка контекста для шаблона **Ключевые методы:** ```python get_queryset() ├─ Фильтрует чаты по правам доступа ├─ global / department / private / group └─ membership-based access get_context_data() ├─ Загружает последние N сообщений (по умолчанию 50) ├─ messages = chat.messages.order_by("-created_at")[:50] ├─ Определяет has_more (есть ли еще история) ├─ Загружает участников ├─ Вычисляет last_read_at ├─ Находит first_unread_id └─ Проверяет can_send_messages post() └─ Обрабатывает отправку сообщений через форму (legacy) ``` **Контекст для шаблона:** ```python { 'chat': Chat, 'messages': [...], # Последние 50 сообщений 'messages_has_more': bool, 'messages_oldest_id': int, 'messages_oldest_ts': int, 'messages_page_size': 50, 'participants': QuerySet, 'last_read_at': datetime, 'first_unread_id': int, 'can_send_messages': bool, 'is_announcement_creator': bool } ``` --- ## 2. Шаблон HTML ### `templates/communications/chat_detail.html` **Структура DOM:** ``` .chat-root └─ .chat-col ├─ .section-header (заголовок чата) │ ├─ Иконка + название │ └─ Кнопки управления │ └─ .chat-box (article.card) ├─ .alert (предупреждения) ├─ #scrollBtn (кнопка "вниз") │ ├─ #chatScroll (контейнер сообщений) │ │ data-me-id="{{ user.id }}" │ │ data-chat-id="{{ chat.id }}" │ │ data-oldest-id="{{ messages_oldest_id }}" │ │ data-has-more="1" │ │ │ ├─ .history-loader (лоадер истории) │ │ │ └─ {% for message in messages %} │ ├─ .day-divider (разделитель дня) │ └─ .msg (сообщение) │ ├─ .mini-ava (аватар) │ ├─ .small (имя + время) │ ├─ .bubble (тело сообщения) │ │ ├─ .forwarded-indicator │ │ ├─ текст │ │ ├─ .poll-widget │ │ └─ .message-attachments │ └─ .message-reactions-wrapper │ └─ .chat-composer (композер) ├─ #typing (индикатор "печатает...") └─ #chatForm ├─ .message-field │ ├─ #attachmentDropdown │ ├─ #emojiDropdown │ ├─ #id_content (textarea) │ └─ .btn-send └─ #attachmentPreview ``` **Data-атрибуты контейнера:** ```html