diff --git a/lpon_site/frontend/views.py b/lpon_site/frontend/views.py
index e486f50..f04831b 100644
--- a/lpon_site/frontend/views.py
+++ b/lpon_site/frontend/views.py
@@ -1,15 +1,13 @@
#
from dataclasses import dataclass
-
from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpRequest, HttpResponse, Http404
-
from frontend.models import TbArticle
+from lpon_site.settings import *
+import json
# Create your views here.
-
-
@dataclass(frozen=True)
class BreadcrumbItem:
"""
@@ -228,13 +226,33 @@ def hub_detail(request: HttpRequest, slug: str) -> HttpResponse:
# Если статья не найдена — отдаём честный статус 404
if not article:
- return render(request, "404.html", {"requested_slug": slug}, status=404)
+ amin_hint = (f"Статья или хаб со слагом «{ slug }» отсутствует в базе данных."
+ f" Создайте статью со слагом «{ slug }» (тип HUB)"
+ " в административной панели.")
+ return render(request, "404.html", {"amin_hint": amin_hint}, status=404)
# Если нашлась статья с таким слагом и она не HUB, то делаем канонический 301-редирект на собственную ветку роутинга
# Предполагается, что у всех статей с типом ArticleType.INFO, ArticleType.TXT и т.д. есть роутинг в urls.py
elif article and article.l_article_type != TbArticle.ArticleType.HUB:
return redirect(article.get_absolute_url(), permanent=True)
+ # Проверяем, что в мета-данных j_article_metadata JSON-объект
+ try:
+ metadata = json.loads(article.j_article_metadata)
+ except json.JSONDecodeError:
+ amin_hint = (f"Статья со слагом «{ slug }» (id={ article.id }) объявлена"
+ f" как хаб, но в её мета-данных j_article_metadata не валидный JSON."
+ " Исправьте данные в административной панели.")
+ return render(request, "404.html", {"amin_hint": amin_hint}, status=404)
+
+ # Проверяем, что в мета-данных есть ключ HUB.
+ if KEY_ARTICLE_HUB not in metadata:
+ amin_hint = (f"Статья со слагом «{ slug }» (id={ article.id }) объявлена"
+ f" как хаб, но в её мета-данных нет ключа { KEY_ARTICLE_HUB }"
+ " с описанием хаба. Внесите изменения в административной панели.")
+ return render(request, "404.html", {"amin_hint": amin_hint}, status=404)
+
# Это статья-ХАБ!! ТУТ будет сложный код, над которым я думаю.
+
context = {}
pass
diff --git a/lpon_site/lpon_site/settings.py b/lpon_site/lpon_site/settings.py
index a5af6f6..f8bba04 100644
--- a/lpon_site/lpon_site/settings.py
+++ b/lpon_site/lpon_site/settings.py
@@ -342,6 +342,9 @@ KEY_IMAGE_NOTE = 'IMG_NOTE' # Ключ для хранения заметк
KEY_OFFER_NOTE = 'OFR_NT' # Ключ для заметок по офферу (например, "замят угол конверта" и т.д.)
KEY_OFFER_ALL_MEDIA = 'OFR_MF' # Ключ для хранения информации о том, какие носители входят в оффер (например, CD+2LP)
+# Ключи метанных статей (TbArticle).
+KEY_ARTICLE_HUB = 'HUB' # Ключ для хранения информации о том, что статья является хабом (содержит ссылки на другие статьи)
+
# ДЛЯ ВАЛИДАЦИИ (поиска похожих исполнителей, стилей и т.д. (используется в TbLabel.matching_type, TbSeller.matching_type и т.д.)
VALIDATE_KEY__MATCH_TYPE = 'MATCH_TYPE'