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'