From 6d894bf98c963265b4bfa628013ea8388be3aa43 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 26 Sep 2016 19:00:55 +0200 Subject: [PATCH] Custom 404 error view to handle translated error messages correctly --- src/pretix/base/views/errors.py | 25 +++++++++++++++++++- src/pretix/multidomain/maindomain_urlconf.py | 2 ++ src/pretix/multidomain/subdomain_urlconf.py | 2 ++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/pretix/base/views/errors.py b/src/pretix/base/views/errors.py index 8851597eba..7ff9210444 100644 --- a/src/pretix/base/views/errors.py +++ b/src/pretix/base/views/errors.py @@ -1,7 +1,9 @@ -from django.http import HttpResponseForbidden +from django.http import HttpResponseForbidden, HttpResponseNotFound from django.middleware.csrf import REASON_NO_CSRF_COOKIE, REASON_NO_REFERER from django.template.loader import get_template +from django.utils.functional import Promise from django.utils.translation import ugettext as _ +from django.views.decorators.csrf import requires_csrf_token def csrf_failure(request, reason=""): @@ -30,3 +32,24 @@ def csrf_failure(request, reason=""): "requests."), } return HttpResponseForbidden(t.render(c), content_type='text/html') + + +@requires_csrf_token +def page_not_found(request, exception): + exception_repr = exception.__class__.__name__ + # Try to get an "interesting" exception message, if any (and not the ugly + # Resolver404 dictionary) + try: + message = exception.args[0] + except (AttributeError, IndexError): + pass + else: + if isinstance(message, str) or isinstance(message, Promise): + exception_repr = str(message) + context = { + 'request_path': request.path, + 'exception': exception_repr, + } + template = get_template('404.html') + body = template.render(context, request) + return HttpResponseNotFound(body) diff --git a/src/pretix/multidomain/maindomain_urlconf.py b/src/pretix/multidomain/maindomain_urlconf.py index c639503420..24a73a898d 100644 --- a/src/pretix/multidomain/maindomain_urlconf.py +++ b/src/pretix/multidomain/maindomain_urlconf.py @@ -47,3 +47,5 @@ plugin_patterns = [ # The presale namespace comes last, because it contains a wildcard catch urlpatterns = common_patterns + plugin_patterns + presale_patterns_main + +handler404 = 'pretix.base.views.errors.page_not_found' diff --git a/src/pretix/multidomain/subdomain_urlconf.py b/src/pretix/multidomain/subdomain_urlconf.py index 745fb7dd19..52e082a35e 100644 --- a/src/pretix/multidomain/subdomain_urlconf.py +++ b/src/pretix/multidomain/subdomain_urlconf.py @@ -40,3 +40,5 @@ plugin_patterns = [ # The presale namespace comes last, because it contains a wildcard catch urlpatterns = common_patterns + plugin_patterns + presale_patterns + +handler404 = 'pretix.base.views.errors.page_not_found'