From 944e14737bcf451f7a604a59b201ce14bf20cab5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Fri, 5 Dec 2025 13:07:57 +0300 Subject: [PATCH] =?UTF-8?q?refactor:=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=20=D0=BD=D0=B0=20AJAX=20=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D0=BA=D1=83=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Упрощен DocumentView - не загружает документы с сервера - Шаблон использует спиннер вместо серверного рендеринга - Удалена старая пагинация из шаблона - Все документы загружаются через documentListHandler.js - Предотвращена двойная загрузка (сервер + клиент) --- backend/documents/views.py | 78 +---------- .../templates/documents/document_list.html | 128 +----------------- 2 files changed, 10 insertions(+), 196 deletions(-) diff --git a/backend/documents/views.py b/backend/documents/views.py index dfdd32ad..72974eb0 100644 --- a/backend/documents/views.py +++ b/backend/documents/views.py @@ -336,7 +336,6 @@ class DocumentView(LoginRequiredMixin, TemplateView): ctx = super().get_context_data(**kwargs) request = self.request user = request.user - api = get_api_client(request) # --- Определяем права --- can_manage = _user_can_manage_documents(user) @@ -353,80 +352,11 @@ class DocumentView(LoginRequiredMixin, TemplateView): ack_status = (request.GET.get("ack_status") or "").strip() - # --- Формируем параметры для API --- - params: Dict[str, Any] = {} - - if scope == "mine": - params["scope"] = "mine" - - # --- Загружаем список документов --- - ok, data, status = _api_unpack(api.get("v1/documents/", params=params)) - - if not ok: - messages.error( - request, - _err_msg( - data, - f"Не удалось загрузить список документов (HTTP {status})." - ) - ) - # Возвращаем минимальный контекст с пустыми данными - ctx.update({ - "documents": [], - "acked_ids": set(), - "next_url": None, - "prev_url": None, - "count": None, - "scope": scope, - "show_admin_controls": show_admin_controls, - "can_manage_documents": can_manage, - "filters": {"ack_status": ack_status}, - "perms": { - "documents": { - "add_document": ( - user.has_perm("documents.add_document") or - user.is_staff - ), - "change_document": ( - user.has_perm("documents.change_document") or - user.is_staff - ), - "delete_document": ( - user.has_perm("documents.delete_document") or - user.is_staff - ), - } - }, - "api_document_list_url": reverse("api:v1:documents-list"), - "api_document_detail_base": reverse("api:v1:documents-list"), - }) - return ctx - - # --- Парсим результат --- - results, next_url, prev_url, count = _parse_page_payload(data) - - # --- Получаем список ознакомленных документов --- - acked_ids: set = set() - if scope == "mine": - # Извлекаем is_acknowledged из каждого документа - for doc in results: - if doc.get("is_acknowledged"): - acked_ids.add(doc["id"]) - - # --- Применяем локальную фильтрацию по ack_status --- - if ack_status and scope == "mine": - if ack_status == "acked": - results = [d for d in results if d["id"] in acked_ids] - elif ack_status == "not_acked": - results = [d for d in results if d["id"] not in acked_ids] - - # --- Формируем полный контекст --- + # --- Формируем контекст без загрузки документов --- + # Документы загружаются через AJAX ctx.update({ - "documents": results, - "acked_ids": acked_ids, - "next_url": next_url, - "prev_url": prev_url, - "count": count, + "documents": [], # Пустой список - загрузка через JS + "acked_ids": set(), "scope": scope, "show_admin_controls": show_admin_controls, "can_manage_documents": can_manage, diff --git a/backend/templates/documents/document_list.html b/backend/templates/documents/document_list.html index f30c0499..17d10ba5 100644 --- a/backend/templates/documents/document_list.html +++ b/backend/templates/documents/document_list.html @@ -41,131 +41,15 @@ {# ===== Карточка со списком ===== #}
- {% if documents %} - {% for doc in documents %} -
-
- - -
-
- {% if doc.file_url %} - {# Для неознакомленных - через acknowledge URL, для ознакомленных - прямо на файл #} - {% if doc.id not in acked_ids and scope == 'mine' %} - - {{ doc.title|default:"Без названия" }} - - {% else %} - - {{ doc.title|default:"Без названия" }} - - {% endif %} - {% else %} - {{ doc.title|default:"Без названия" }} - {% endif %} -
-
- {{ doc.description|default:"— без описания —" }} - {% if doc.uploaded_at %} • Загружен: {{ doc.uploaded_at|date:"d.m.Y H:i" }}{% endif %} - {% if doc.sent_to_all %} • Для всех{% endif %} -
-
- -
- {# В scope=mine показываем только статус #} - {% if scope == 'mine' %} - {% if doc.id in acked_ids %} - - Ознакомлен - - {% else %} - - Требуется ознакомление - - {% endif %} - - {# В scope=all показываем кнопку ознакомлений #} - {% elif scope == 'all' %} - - {% endif %} - - {# Кнопки управления только для админов в scope=all #} - {% if show_admin_controls and scope == 'all' %} - {% if perms.documents.change_document or user.is_staff or user.is_superuser %} - - {% endif %} - {% if perms.documents.delete_document or user.is_staff or user.is_superuser %} - - {% endif %} - {% endif %} -
-
-
- {% endfor %} - {% else %} -
Нет доступных документов.
- {% endif %} + {# Список загружается через JavaScript из documentListHandler.js #} +
+
+ Загрузка... +
+
- {# ===== Пагинация ===== #} - {% if prev_url or next_url or page > 1 %} -
- {% if prev_url %} - - Назад - - {% else %} - - Назад - - {% endif %} - - {% if next_url %} - - Вперёд - - {% else %} - - Вперёд - - {% endif %} -
- {% endif %} -