# План: Создание Detail View для заявлений **Статус:** 🔨 В разработке **Приоритет:** Высокий **Сложность:** Средняя **Время:** ~4-6 часов **Ветка:** `feature/requests-detail-view` --- ## 📋 Описание задачи Создать frontend view для отдельного просмотра заявления через модальное окно на странице списка заявлений. Это позволит: - Кликать по ссылкам в уведомлениях и попадать на конкретное заявление - Просматривать полную информацию о заявлении - Взаимодействовать с заявлением (комментарии, изменение статуса) - Улучшить UX приложения --- ## 🎯 Этапы разработки ### Этап 1: Анализ существующего кода (30 мин) #### 1.1 Изучить существующую структуру - [ ] Изучить `RequestsView` в `views_front.py` - как загружаются заявления - [ ] Посмотреть, как работают функции `request_comments()` и `request_comment_add()` - [ ] Найти существующий шаблон `requests_list.html` - [ ] Посмотреть, как реализованы модальные окна в других местах проекта #### 1.2 Понять API структуру - [ ] Изучить `/api/v1/requests/{id}/` эндпоинт в `requests_app/views.py` - [ ] Посмотреть, какие поля возвращает API для заявления - [ ] Проверить разрешения и аутентификацию для API #### 1.3 Документировать текущее состояние - [ ] Создать файл `REQUESTS_DETAIL_ANALYSIS.md` с выводами --- ### Этап 2: Разработка Backend (1.5 часа) #### 2.1 Создать или обновить view **Файл:** `backend/requests_app/views_front.py` - [ ] Добавить `RequestDetailView` класс - Наследоваться от `LoginRequiredMixin, TemplateView` - Загружать данные о заявлении через API - Получать также комментарии - Проверять права доступа пользователя - [ ] Логика: ```python class RequestDetailView(LoginRequiredMixin, TemplateView): template_name = 'requests/request_detail.html' def get_context_data(self, **kwargs): # 1. Получить ID заявления из URL # 2. Загрузить данные через API # 3. Проверить права доступа # 4. Загрузить комментарии # 5. Загрузить список статусов для dropdown # 6. Вернуть в контекст pass ``` #### 2.2 Обновить URLs **Файл:** `backend/requests_app/urls_front.py` - [ ] Добавить путь: ```python path('/', RequestDetailView.as_view(), name='request_detail'), ``` #### 2.3 Обновить уведомления **Файл:** `backend/requests_app/notification_signals.py` - [ ] Обновить URL в уведомлениях: ```python action_url=f'/requests/{request_obj.id}/' ``` --- ### Этап 3: Разработка Frontend (2-3 часа) #### 3.1 Создать HTML шаблон **Файл:** `backend/templates/requests/request_detail.html` - [ ] Структура: - Header с информацией о заявлении - Основная информация: - Номер/название - Статус - Дата создания - Автор - Получатели - Отделы - Согласующий - Вкладки: - Описание - История изменений - Комментарии - Панель действий (кнопки): - Обработать/Одобрить/Отклонить (в зависимости от статуса) - Вернуться к списку #### 3.2 Создать JS модуль для модального окна **Файл:** `backend/static/js/modules/requestDetail.js` - [ ] Функции: - `openRequestModal(requestId)` - открыть модальное окно - `loadRequestData(requestId)` - загрузить данные через AJAX (опционально) - `handleStatusChange(requestId, newStatus)` - изменить статус - `closeRequestModal()` - закрыть модальное окно #### 3.3 Интегрировать с существующей страницей списка **Файл:** `backend/templates/requests/requests_list.html` - [ ] Добавить обработчик клика по строкам таблицы - [ ] При клике на заявление: - Открыть модальное окно - Загрузить данные заявления - [ ] Добавить элементы модального окна в HTML #### 3.4 Добавить CSS для модального окна **Файл:** `backend/static/css/requests_modal.css` или обновить существующий - [ ] Стили для: - Модального окна - Вкладок - Комментариев - Кнопок действий --- ### Этап 4: Функциональность комментариев (1 час) #### 4.1 Обновить функцию добавления комментариев **Файл:** `backend/requests_app/views_front.py` - [ ] Убедиться, что `request_comment_add()` работает через AJAX - [ ] Возвращает JSON ответ - [ ] Обновить список комментариев после добавления #### 4.2 Создать JS для работы с комментариями **Файл:** `backend/static/js/modules/requestComments.js` - [ ] Функции: - `loadComments(requestId)` - загрузить комментарии - `addComment(requestId, text)` - добавить комментарий - `deleteComment(commentId)` - удалить комментарий (если права) - `renderComments(comments)` - отрисовать список --- ### Этап 5: Функциональность изменения статуса (1 час) #### 5.1 Создать view для изменения статуса **Файл:** `backend/requests_app/views_front.py` - [ ] Функция `request_status_change()` если её нет - [ ] Проверять права доступа - [ ] Возвращать JSON ответ #### 5.2 Обновить API эндпоинт **Файл:** `backend/api/v1/requests/views.py` - [ ] Проверить, есть ли action для изменения статуса - [ ] Убедиться, что работает через PATCH #### 5.3 Создать JS для работы со статусом **Файл:** `backend/static/js/modules/requestStatus.js` - [ ] Функции: - `changeStatus(requestId, newStatus)` - изменить статус - `getAvailableStatuses(currentStatus)` - получить доступные переходы --- ### Этап 6: Обновление уведомлений (30 мин) #### 6.1 Обновить все сигналы уведомлений **Файл:** `backend/requests_app/notification_signals.py` - [ ] Найти все места, где генерируется `action_url` - [ ] Заменить на `/requests/{request_obj.id}/` - [ ] Строки: 122, 231, 315 #### 6.2 Обновить отчет об аудите **Файл:** `backend/docs/reports/NOTIFICATION_URLS_AUDIT.md` - [ ] Обновить статус для requests - [ ] Добавить информацию о новом detail view --- ### Этап 7: Тестирование (1-2 часа) #### 7.1 Ручное тестирование - [ ] Тестировать открытие заявления из списка - [ ] Тестировать открытие по прямой ссылке (`/requests/{id}/`) - [ ] Тестировать открытие из уведомления - [ ] Тестировать добавление комментариев - [ ] Тестировать изменение статуса - [ ] Тестировать разные роли пользователей - [ ] Тестировать на мобильных устройствах #### 7.2 Проверка прав доступа - [ ] Пользователь может видеть только свои заявления - [ ] Ответственный может видеть назначенные заявления - [ ] Администратор может видеть все заявления - [ ] Проверить CSRF токен #### 7.3 Проверка производительности - [ ] Нет N+1 запросов - [ ] Кэширование где нужно - [ ] Время загрузки приемлемо --- ### Этап 8: Документирование (30 мин) #### 8.1 Обновить документацию **Файл:** `backend/docs/guides/` или создать новый - [ ] Создать `REQUESTS_DETAIL_VIEW_GUIDE.md` - [ ] Описать структуру - [ ] Документировать JS модули - [ ] Примеры использования #### 8.2 Обновить основной README **Файл:** `README.md` - [ ] Добавить информацию о новой функции - [ ] Обновить скриншоты (если есть) --- ## 📁 Файлы для создания/изменения ### Создать новые файлы: ``` backend/templates/requests/request_detail.html # Шаблон детального просмотра backend/static/js/modules/requestDetail.js # Логика модального окна backend/static/js/modules/requestComments.js # Работа с комментариями backend/static/js/modules/requestStatus.js # Изменение статуса backend/static/css/requests_modal.css # Стили модального окна backend/docs/guides/REQUESTS_DETAIL_VIEW_GUIDE.md # Документация docs/in-progress/REQUESTS_DETAIL_ANALYSIS.md # Анализ на этапе 1 ``` ### Изменить существующие файлы: ``` backend/requests_app/views_front.py # Добавить RequestDetailView backend/requests_app/urls_front.py # Добавить маршрут backend/requests_app/notification_signals.py # Обновить action_url backend/docs/reports/NOTIFICATION_URLS_AUDIT.md # Обновить статус ``` --- ## 🔗 Зависимости ### От чего зависит эта задача: - ✅ Существующая структура views - ✅ API эндпоинты уже есть - ✅ Модальные окна уже используются в проекте ### Что от этой задачи зависит: - ❓ Возможное улучшение UX для других сущностей (документы, события) - ❓ Интеграция с другими системами уведомлений --- ## 🚀 Перспективы после завершения 1. **Возможное расширение:** - Применить тот же подход к Documents - Применить к Calendar Events - Создать universal detail modal component 2. **Оптимизации:** - Добавить кэширование через Redis - Оптимизировать N+1 запросы - Добавить предварительную загрузку данных 3. **Функциональность:** - Добавить экспорт заявления в PDF - Добавить подписание электронной подписью - Добавить шаблоны ответов --- ## 📊 Чек-лист завершения - [ ] Все файлы созданы - [ ] Все изменения сделаны - [ ] Тесты пройдены - [ ] Документация обновлена - [ ] Code review пройден - [ ] Merged в master - [ ] Развернуто на production --- ## 🔄 Git процесс ```bash # Создание ветки git checkout -b feature/requests-detail-view # После завершения каждого этапа git add . git commit -m "feat: requests detail view - stage N: description" # После полного завершения git push origin feature/requests-detail-view # Создать Pull Request на GitHub ``` --- **Дата создания плана:** 26 декабря 2025 г. **Автор:** GitHub Copilot **Контакт:** Igor Nadein