Permalink
Browse files

Don't inherit from base.html in 500 error page

For server errors, the context passed to the template is empty,
so things like STATIC_URL and context processors don't work.

Fixes bug 1067206.

Change-Id: Ia1801afaecd6a23fbcc6054552d0fd313597d1c1
  • Loading branch information...
conkiztador committed Nov 14, 2012
1 parent 6994698 commit 76ef256dc47b590f205aa95c2d439282fb62c962
@@ -21,6 +21,7 @@
from django.utils.translation import ugettext as _
from horizon.base import Horizon
+from horizon import conf
register = template.Library()
@@ -135,3 +136,8 @@ def jstemplate(parser, token):
nodelist = parser.parse(('endjstemplate',))
parser.delete_first_token()
return JSTemplateNode(nodelist)
+
+
+@register.assignment_tag
+def load_config():
+ return conf.HORIZON_CONFIG
@@ -1,27 +1,82 @@
-{% extends "base.html" %}
-{% load i18n %}
+{% load branding i18n staticfiles %}
+{% load load_config from horizon %}
-{% block title %} - {% trans "Internal Server Error" %}{% endblock %}
+{% load_config as HORIZON_CONFIG %}
-{% block content %}
- <div id="right_content">
- <div id="page_head">
- <h2 id="page_heading">{% trans "Internal Server Error" %}</h2>
- <p id="page_description">{% trans "An unexpected error occurred while processing your request. Please try your request again." %}</p>
+
+{% comment %}
+
+ NB: The context for 500 pages is an empty dict.
+ Don't add any content here that depends on things from
+ the context.
+
+{% endcomment %}
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta content='text/html; charset=utf-8' http-equiv='Content-Type' />
+ <link rel="shortcut icon" href="{% static "dashboard/img/favicon.ico" %}"/>
+ <title>{% trans "Server error" %} - {% site_branding %}</title>
+ {% block css %}
+ <style>
+ a {
+ color: #43a1d6;
+ text-decoration: none;
+ }
+ body {
+ color: rgb(106, 106, 106);
+ text-align: center;
+ font-weight: normal;
+ background: none repeat scroll 0% 0% rgb(250, 250, 250);
+ }
+ div#container {
+ position: absolute;
+ top: 80px;
+ padding-top: 170px;
+ margin: 0px 0px 0px -196px;
+ left: 50%;
+ width: 390px;
+
+ background: url("{% static "dashboard/img/logo.png" %}") no-repeat scroll center 35px padding-box rgb(255, 255, 255);
+ border: 1px solid rgb(225, 225, 225);
+
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+
+ box-shadow: 0px 3px 7px rgba(0, 0, 0, 0.3);
+ -webkit-box-shadow: 0px 3px 7px rgba(0, 0, 0, 0.3);
+ -moz-box-shadow: 0px 3px 7px rgba(0, 0, 0, 0.3);
+ }
+ h2 {
+ font-weight: normal;
+ }
+ div#container > div {
+ padding: 25px;
+ }
+ </style>
+ {% endblock %}
+ </head>
+ <body id="{% block body_id %}{% endblock %}">
+ {% block page_header %}{% endblock %}
+ {% block content %}
+ <div id="container">
+ <div id="text">
+ {% block text %}
+ <h2>{% trans "Something went wrong!" %}</h2>
+ <p>{% trans "An unexpected error has occurred. Try refreshing the page. If that doesn't help, contact your local administrator." %}</p>
+ {% endblock %}
+ </div>
+ <div id="links">
+ {% block links %}
+ <p><a href="/">{% trans "Home" %}</a></p>
+ <p><a href="{{ HORIZON_CONFIG.help_url }}">{% trans "Help" %}</a></p>
+ {% endblock %}
+ </div>
</div>
- </div>
-{% endblock %}
-
-{% block sidebar %}
- <div id="sidebar">
- <ul id="navigation">
- {% block nav_home %}
- <li><h3><a href="{% url index %}">{% trans "Home" %}</a></h3></li>
- {% endblock %}
-
- {% block nav_projects %}
- <li><h3><a href="{% url index %}">{% trans "Projects" %}</a></h3></li>
- {% endblock %}
- </ul>
- </div> <!-- end sidebar -->
-{% endblock %}
+ {% endblock %}
+ {% block footer %}{% endblock %}
+ {% block js %}{% endblock %}
+ </body>
+</html>
@@ -0,0 +1,7 @@
+from django.conf.urls import patterns, url, include
+
+from openstack_dashboard.urls import urlpatterns
+
+urlpatterns += patterns('',
+ (r'^500/$', 'django.views.defaults.server_error')
+)
@@ -0,0 +1,34 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+
+# Copyright (c) 2012 OpenStack, LLC.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+from os import path
+
+from django.conf import settings
+
+from horizon import exceptions
+from openstack_dashboard.test import helpers as test
+
+
+class ErrorPageTests(test.TestCase):
+ """ Tests for error pages """
+ urls = 'openstack_dashboard.test.error_pages_urls'
+
+ def test_500_error(self):
+ TEMPLATE_DIRS = (path.join(settings.ROOT_PATH, 'templates'),)
+ with self.settings(TEMPLATE_DIRS=TEMPLATE_DIRS):
+ response = self.client.get('/500/')
+ self.assertTrue('Server error' in response.content)
@@ -43,3 +43,8 @@
# development. Only active if DEBUG==True and the URL prefix is a local
# path. Production media should NOT be served by Django.
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+
+if settings.DEBUG:
+ urlpatterns += patterns('',
+ url(r'^500/$', 'django.views.defaults.server_error')
+ )

0 comments on commit 76ef256

Please sign in to comment.