From 4e9d29e6bbd1bbae2b8f808afb7420364b710666 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jan=20Bedna=C5=99=C3=ADk?= <jan.bednarik@gmail.com>
Date: Wed, 13 Oct 2021 18:56:30 +0200
Subject: [PATCH] majak: Custom 404 handlers

---
 README.md       |  8 ++++++++
 majak/urls.py   |  2 ++
 shared/views.py | 18 ++++++++++++++++++
 3 files changed, 28 insertions(+)
 create mode 100644 shared/views.py

diff --git a/README.md b/README.md
index b3c8c86f..ff2dc492 100644
--- a/README.md
+++ b/README.md
@@ -100,6 +100,14 @@ Kalendář se stáhne při uložení modelu obsahujícího `CalendarMixin`.
 Appka přidává management command `update_callendars`, který stahuje a updatuje
 kalendáře. Je třeba ho pravidelně volat na pozadí (přes CRON).
 
+### Stránka 404
+
+Pokud je třeba vlastní 404 pro web, stačí do kořenové `xxxHomePage` webu
+definovat metodu `get_404_response` vracející Django HTTP Reponse objekt.
+
+    def get_404_response(self, request):
+        return HttpResponse("Stránka nenalezena", status=404)
+
 ## Deployment
 
 ### Konfigurace
diff --git a/majak/urls.py b/majak/urls.py
index 5f18ce5c..1dbbebe0 100644
--- a/majak/urls.py
+++ b/majak/urls.py
@@ -10,6 +10,8 @@ from wagtail.documents import urls as wagtaildocs_urls
 from elections2021 import views as elections2021_views
 from search import views as search_views
 
+handler404 = "shared.views.page_not_found"
+
 urlpatterns = [
     url(r"^django-admin/", admin.site.urls),
     url(r"^admin/", include(wagtailadmin_urls)),
diff --git a/shared/views.py b/shared/views.py
new file mode 100644
index 00000000..b0f8579f
--- /dev/null
+++ b/shared/views.py
@@ -0,0 +1,18 @@
+from django.http import HttpResponse
+from wagtail.core.models import Site
+
+
+def page_not_found(request, exception=None):
+    try:
+        site = Site.find_for_request(request)
+        root_page = site.root_page.specific
+    except:
+        root_page = None
+
+    if root_page and hasattr(root_page, "get_404_response"):
+        return root_page.get_404_response(request)
+
+    return HttpResponse(
+        "<h1>Stránka nenalezena</h1><a href='/'>pokračovat na úvod</a>",
+        status=404,
+    )
-- 
GitLab