diff --git a/docs/in-progress/REQUESTS_DETAIL_ANALYSIS.md b/docs/in-progress/REQUESTS_DETAIL_ANALYSIS.md new file mode 100644 index 00000000..5c4daf98 --- /dev/null +++ b/docs/in-progress/REQUESTS_DETAIL_ANALYSIS.md @@ -0,0 +1,337 @@ +# Анализ существующего кода для Detail View + +**Статус:** 📋 Анализ +**Дата:** 26 декабря 2025 г. +**Задача:** feature/requests-detail-view - Этап 1 + +--- + +## 🔍 Анализ RequestsView + +### Файл: `backend/requests_app/views_front.py` + +```python +class RequestsView(LoginRequiredMixin, TemplateView): + template_name = 'requests/requests_list.html' + # ... логика загрузки списка заявок +``` + +**Выводы:** +- ✅ Используется TemplateView (можем использовать для RequestDetailView) +- ✅ Требует LoginRequiredMixin +- ✅ Загружает данные через API клиента +- ✅ Использует pagination + +**Как загружает данные:** +```python +client = get_api_client(request) +# Запрос к /api/v1/requests/ +response = client.get('/api/v1/requests/', params={...}) +``` + +--- + +## 🔍 Анализ request_comments() и request_comment_add() + +### Функции в `views_front.py` (строки ~277, ~293) + +```python +def request_comments(request: HttpRequest, pk: int) -> JsonResponse: + """Загружает комментарии к заявке""" + # Возвращает JSON с комментариями + +def request_comment_add(request: HttpRequest, pk: int) -> JsonResponse: + """Добавляет комментарий к заявке""" + # POST запрос с текстом комментария + # Возвращает JSON с результатом +``` + +**Выводы:** +- ✅ Используют JsonResponse для AJAX +- ✅ Работают через POST/GET +- ✅ Уже адаптированы для фронтенда +- ⚠️ Нужно будет интегрировать в модальное окно + +--- + +## 🔍 Анализ API эндпоинтов + +### `/api/v1/requests/{pk}/` - RequestViewSet + +**Файл:** `backend/api/v1/requests/views.py` + +**Методы:** +- ✅ GET - получить одно заявление +- ✅ PATCH/PUT - обновить заявление (изменить статус) +- ✅ DELETE - удалить (если есть права) + +**Структура ответа:** +```json +{ + "id": 1, + "title": "Название заявки", + "description": "Описание", + "status": "new|processed|approved|rejected", + "employee": {"id": 1, "full_name": "Иван Иванов"}, + "recipients": [...], + "cc_users": [...], + "approver": {...}, + "departments": [...], + "created_at": "2025-12-26T10:00:00Z", + "updated_at": "2025-12-26T10:00:00Z", + "decided_at": null, + "type": "document|info|order", + // ... другие поля +} +``` + +**Проверка прав доступа:** +- Пользователь видит заявку если: + - Он автор + - Он в списке recipients + - Он в списке cc_users + - Он approver + - Он в числе сотрудников указанных отделов + +--- + +## 🔍 Анализ существующих шаблонов + +### `backend/templates/requests/requests_list.html` + +**Структура:** +- Header с фильтрами (Мои/Все/Новая) +- Таблица со списком заявок +- Пагинация +- Sidebar с фильтрами (статус, отделы, тип) + +**Как открываются детали:** +- Может быть, есть модальное окно? Нужно проверить +- Или просто кликает по ссылке? + +--- + +## 🔍 Анализ модальных окон в проекте + +**Где уже используются модали:** +- В communications (открытие чата) +- В documents (просмотр документа) +- В employees (профиль сотрудника) +- Возможно, в других местах + +**Как реализованы:** +- Bootstrap modals (5.x) +- Открываются через JavaScript +- Загружают контент через AJAX или встроены в HTML + +**Пример структуры:** +```html + +``` + +--- + +## 🔍 Структура JavaScript модулей + +**Директория:** `backend/static/js/modules/` + +**Существующие модули:** +- `chatModule.js` - работа с чатами +- `documentModule.js` - работа с документами +- Другие... + +**Паттерн использования:** +```javascript +// Экспортирование как ES6 модулей +export class RequestDetailManager { + constructor() { } + + init() { } + + openModal(id) { } + loadData(id) { } + // ... +} +``` + +**Как подключаются:** +```html + +``` + +--- + +## 🔍 Анализ прав доступа + +### Где проверяются права: + +1. **В API (RequestViewSet):** + - DRF permission classes + - Проверяет право просмотра заявки + - Проверяет право редактирования + +2. **Во views_front.py:** + - `LoginRequiredMixin` - требует аутентификацию + - Фильтрует заявки по доступным для пользователя + +3. **На фронтенде:** + - Скрывают кнопки действий если нет прав + - JS проверяет ответы API (403 Forbidden) + +**Правила доступа к заявке:** +- ✅ Просмотр: автор, recipients, cc_users, approver, сотрудники отделов +- ✅ Редактирование статуса: approver, сотрудники с правом обработки +- ✅ Комментирование: все, кто видит заявку + +--- + +## 🔍 CSS стили + +**Фреймворк:** Bootstrap 5 + +**Существующие классы для модалей:** +- `.modal`, `.modal-dialog`, `.modal-content` +- `.modal-header`, `.modal-body`, `.modal-footer` +- `.btn`, `.btn-primary`, `.btn-secondary` +- Кастомные классы в `requests.css` + +**Нужно создать:** +- Стили для модального окна заявки +- Стили для вкладок (может быть, уже есть) +- Стили для комментариев +- Стили для действий (кнопок) + +--- + +## 📋 Чек-лист для следующих этапов + +### Что готово использовать: +- ✅ API эндпоинты работают +- ✅ Функции для комментариев есть +- ✅ Структура views понятна +- ✅ Bootstrap модали используются в проекте + +### Что нужно создать: +- ❌ RequestDetailView (новый класс) +- ❌ URL маршрут для detail +- ❌ HTML шаблон модального окна +- ❌ JavaScript модуль для логики +- ❌ CSS стили для модали + +### Потенциальные проблемы: +- ⚠️ CSRF токен при AJAX запросах +- ⚠️ Права доступа нужно проверить +- ⚠️ N+1 проблема при загрузке связанных данных +- ⚠️ Кэширование при массивных запросах + +--- + +## 🎯 Рекомендации для реализации + +### 1. RequestDetailView + +```python +class RequestDetailView(LoginRequiredMixin, TemplateView): + """ + Отображает детальную страницу заявления. + Может быть как отдельная страница, так и содержимое модали. + """ + template_name = 'requests/request_detail.html' + + def get_context_data(self, pk, **kwargs): + context = super().get_context_data(**kwargs) + + # Загрузить заявление через API + client = get_api_client(self.request) + response = client.get(f'/api/v1/requests/{pk}/') + + if response.ok: + context['request_obj'] = response.json() + else: + # Обработать ошибку (404, 403 и т.д.) + pass + + return context +``` + +### 2. JavaScript модуль + +```javascript +export class RequestDetailModal { + constructor(containerId = 'requestModal') { + this.modal = new bootstrap.Modal(document.getElementById(containerId)); + this.container = document.getElementById(containerId); + this.init(); + } + + init() { + // Добавить обработчики событий + // Инициализировать элементы + } + + open(requestId) { + this.loadData(requestId) + .then(() => this.modal.show()); + } + + loadData(requestId) { + // Загрузить данные через API + // Обновить содержимое модали + } +} +``` + +### 3. Интеграция с список заявок + +```javascript +// На странице списка добавить слушатели +document.querySelectorAll('[data-request-id]').forEach(row => { + row.addEventListener('click', (e) => { + const requestId = row.dataset.requestId; + requestDetailModal.open(requestId); + }); +}); +``` + +--- + +## 📚 Полезные ссылки в проекте + +- API документация: `/api/v1/` +- Существующие views: `backend/requests_app/views_front.py` +- Существующие templates: `backend/templates/requests/` +- JS модули: `backend/static/js/modules/` +- CSS: `backend/static/css/` + +--- + +## 🚀 Готово начинать разработку! + +**Ключевые файлы для открытия:** +1. `backend/requests_app/views_front.py` - понять структуру +2. `backend/templates/requests/requests_list.html` - понять шаблон +3. `backend/static/js/modules/` - посмотреть примеры JS +4. `backend/api/v1/requests/views.py` - понять API + +**Следующий шаг:** Начать Этап 2 - создание RequestDetailView