diff --git a/wagtail/wagtailadmin/static_src/wagtailadmin/images/logo-eyeclosed.svg b/wagtail/wagtailadmin/static_src/wagtailadmin/images/logo-eyeclosed.svg index aa1302c4d1..bc5168c3ae 100644 --- a/wagtail/wagtailadmin/static_src/wagtailadmin/images/logo-eyeclosed.svg +++ b/wagtail/wagtailadmin/static_src/wagtailadmin/images/logo-eyeclosed.svg @@ -1 +1 @@ - + diff --git a/wagtail/wagtailadmin/static_src/wagtailadmin/scss/components/_logo.scss b/wagtail/wagtailadmin/static_src/wagtailadmin/scss/components/_logo.scss index b2b660f171..eb747140dd 100644 --- a/wagtail/wagtailadmin/static_src/wagtailadmin/scss/components/_logo.scss +++ b/wagtail/wagtailadmin/static_src/wagtailadmin/scss/components/_logo.scss @@ -65,7 +65,8 @@ display: block; left: 0; top: 0; - width: 60px; + width: 100%; + height: 100%; position: absolute; transition: inherit; diff --git a/wagtail/wagtailadmin/static_src/wagtailadmin/scss/layouts/404.scss b/wagtail/wagtailadmin/static_src/wagtailadmin/scss/layouts/404.scss new file mode 100644 index 0000000000..a2b8f12906 --- /dev/null +++ b/wagtail/wagtailadmin/static_src/wagtailadmin/scss/layouts/404.scss @@ -0,0 +1,81 @@ +@import 'wagtailadmin/scss/variables'; +@import 'wagtailadmin/scss/mixins'; +@import 'wagtailadmin/scss/grid'; + +.page404__bg { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: $color-teal-darker; + font-family: $font-sans; + color: $color-white; +} + +.page404__wrapper { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + display: flex; + justify-content: center; + align-items: center; +} + +.wagtail-logo-container__desktop { + float: left; + width: 400px; + height: 500px; +} + +.page404__text-container { + float: right; + width: 600px; + height: 500px; + text-align: center; +} + +.page404__header { + font-size: 6.8em; + margin-bottom: 0.2em; + color: inherit; +} + +.page404__text { + font-size: 2.25em; + line-height: 1.25em; + color: inherit; +} + +a.button.page404__button { // more specific to override standard button styles + font-size: 1.5em; + line-height: 2em; + height: 2.5em; + padding: 0 0.5em; + background-color: $color-teal-darker; + border: 4px solid $color-teal; + color: inherit; + + &:hover { + background-color: $color-teal; + } +} + +// SMALL DESKTOP CHANGES: +@media screen and (max-width: $breakpoint-desktop-small) { // 900px + .wagtail-logo-container__desktop { + display: none; + } +} + +// MOBILE CHANGES: +@media screen and (max-width: $breakpoint-mobile) { // 800px + .page404__text-container { + width: 400px; + } + + .page404__header { + font-size: 5em; + } +} diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/404.html b/wagtail/wagtailadmin/templates/wagtailadmin/404.html new file mode 100644 index 0000000000..e94fbf98d7 --- /dev/null +++ b/wagtail/wagtailadmin/templates/wagtailadmin/404.html @@ -0,0 +1,31 @@ +{% extends "wagtailadmin/admin_base.html" %} +{% load wagtailadmin_tags wagtailcore_tags staticfiles i18n %} +{% block titletag %}{% trans "Error 404: Page not found" %}{% endblock %} + + +{% block extra_css %} + {{ block.super }} + + +{% endblock %} + + +{% block furniture %} +
+
+ {% include "wagtailadmin/shared/animated_logo.html" %} + +
+

+ {% trans "Error 404" %} +

+ +

+ {% trans "The requested page could not be found." %} +

+ + {% trans "Go to Wagtail admin" %} +
+
+
+{% endblock %} diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/base.html b/wagtail/wagtailadmin/templates/wagtailadmin/base.html index 3742e5d560..804fa977d9 100644 --- a/wagtail/wagtailadmin/templates/wagtailadmin/base.html +++ b/wagtail/wagtailadmin/templates/wagtailadmin/base.html @@ -12,12 +12,7 @@ {# Desktop logo (animated): #} -
- - - - -
+ {% include "wagtailadmin/shared/animated_logo.html" %} {% endblock %} {% trans "Dashboard" %} diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/shared/animated_logo.html b/wagtail/wagtailadmin/templates/wagtailadmin/shared/animated_logo.html new file mode 100644 index 0000000000..ac3e193185 --- /dev/null +++ b/wagtail/wagtailadmin/templates/wagtailadmin/shared/animated_logo.html @@ -0,0 +1,8 @@ +{% load wagtailadmin_tags staticfiles %} + +
+ + + + +
diff --git a/wagtail/wagtailadmin/urls/__init__.py b/wagtail/wagtailadmin/urls/__init__.py index 31a80d8d97..709dd7f472 100644 --- a/wagtail/wagtailadmin/urls/__init__.py +++ b/wagtail/wagtailadmin/urls/__init__.py @@ -1,5 +1,10 @@ +import functools + from django.conf.urls import url, include from django.views.decorators.cache import cache_control +from django.views.generic import TemplateView +from django.http import Http404 +from django.views.defaults import page_not_found from wagtail.wagtailadmin.urls import pages as wagtailadmin_pages_urls from wagtail.wagtailadmin.urls import collections as wagtailadmin_collections_urls @@ -14,6 +19,8 @@ from wagtail.wagtailadmin.decorators import require_admin_access urlpatterns = [ url(r'^$', home.home, name='wagtailadmin_home'), + url(r'^test404/$', TemplateView.as_view(template_name='wagtailadmin/404.html')), + url(r'api/', include(api_urls)), url(r'^failwhale/$', home.error_test, name='wagtailadmin_error_test'), @@ -73,8 +80,28 @@ urlpatterns += [ # Password reset url(r'^password_reset/', include(wagtailadmin_password_reset_urls)), + + # Default view (will show 404 page) + # This must be the last URL in this file! + url(r'^', home.default), ] + +# Hook in our own 404 handler +def display_custom_404(view_func): + @functools.wraps(view_func) + def wrapper(request, *args, **kwargs): + try: + return view_func(request, *args, **kwargs) + except Http404: + return page_not_found(request, '', template_name='wagtailadmin/404.html') + + return wrapper + + +urlpatterns = decorate_urlpatterns(urlpatterns, display_custom_404) + + # Decorate all views with cache settings to prevent caching urlpatterns = decorate_urlpatterns( urlpatterns, diff --git a/wagtail/wagtailadmin/views/home.py b/wagtail/wagtailadmin/views/home.py index bd1b207b79..e5fa94d01e 100644 --- a/wagtail/wagtailadmin/views/home.py +++ b/wagtail/wagtailadmin/views/home.py @@ -2,8 +2,10 @@ from __future__ import absolute_import, unicode_literals from django.conf import settings from django.contrib.auth import get_user_model +from django.contrib.auth.decorators import permission_required from django.db import connection from django.db.models import Max +from django.http import Http404 from django.shortcuts import render from django.template.loader import render_to_string @@ -12,7 +14,6 @@ from wagtail.wagtailadmin.site_summary import SiteSummaryPanel from wagtail.wagtailcore import hooks from wagtail.wagtailcore.models import Page, PageRevision, UserPagePermissionsProxy - User = get_user_model() @@ -123,3 +124,15 @@ def home(request): def error_test(request): raise Exception("This is a test of the emergency broadcast system.") + + +@permission_required('wagtailadmin.access_admin', login_url='wagtailadmin_login') +def default(request): + """ + Called whenever a request comes in with the correct prefix (eg /admin/) but + doesn't actually correspond to a Wagtail view. + + For authenticated users, it'll raise a 404 error. Anonymous users will be + redirected to the login page. + """ + raise Http404