summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRamiro Morales <cramm0@gmail.com>2012-10-20 07:50:44 -0500
committerRamiro Morales <cramm0@gmail.com>2013-08-12 21:59:27 -0300
commit6c12cd15e990b0ff5a5e85328f0a092f4bfe8080 (patch)
treeb05d9a2f295e9d3ed6c0b4a44c4cf81b922e964b
parent3f6cc33cffa5774beedf7997354fc269497a93dd (diff)
Unlocalize line numbers and ids in debug 500 view.
While using USE_L10N, line numbers and IDs were printed as comma (or locale equivalent) separated values. Thanks Kronuz for the report and intial patch. Fixes #20861.
-rw-r--r--django/views/debug.py6
-rw-r--r--tests/view_tests/tests/test_debug.py16
-rw-r--r--tests/view_tests/urls.py1
-rw-r--r--tests/view_tests/views.py8
4 files changed, 28 insertions, 3 deletions
diff --git a/django/views/debug.py b/django/views/debug.py
index 2129a83d67..16f75df8c3 100644
--- a/django/views/debug.py
+++ b/django/views/debug.py
@@ -227,7 +227,7 @@ class ExceptionReporter(object):
return "File exists"
def get_traceback_data(self):
- "Return a Context instance containing traceback information."
+ """Return a dictionary containing traceback information."""
if self.exc_type and issubclass(self.exc_type, TemplateDoesNotExist):
from django.template.loader import template_source_loaders
@@ -295,13 +295,13 @@ class ExceptionReporter(object):
def get_traceback_html(self):
"Return HTML version of debug 500 HTTP error page."
t = Template(TECHNICAL_500_TEMPLATE, name='Technical 500 template')
- c = Context(self.get_traceback_data())
+ c = Context(self.get_traceback_data(), use_l10n=False)
return t.render(c)
def get_traceback_text(self):
"Return plain text version of debug 500 HTTP error page."
t = Template(TECHNICAL_500_TEXT_TEMPLATE, name='Technical 500 template')
- c = Context(self.get_traceback_data(), autoescape=False)
+ c = Context(self.get_traceback_data(), autoescape=False, use_l10n=False)
return t.render(c)
def get_template_exception_info(self):
diff --git a/tests/view_tests/tests/test_debug.py b/tests/view_tests/tests/test_debug.py
index 0159886918..e941f4ae0e 100644
--- a/tests/view_tests/tests/test_debug.py
+++ b/tests/view_tests/tests/test_debug.py
@@ -5,6 +5,7 @@ from __future__ import unicode_literals
import inspect
import os
+import re
import shutil
import sys
from tempfile import NamedTemporaryFile, mkdtemp, mkstemp
@@ -69,6 +70,21 @@ class DebugViewTests(TestCase):
self.assertRaises(BrokenException, self.client.get,
reverse('view_exception', args=(n,)))
+ def test_non_l10ned_numeric_ids(self):
+ """
+ Numeric IDs and fancy traceback context blocks line numbers shouldn't be localized.
+ """
+ with self.settings(DEBUG=True, USE_L10N=True):
+ response = self.client.get('/views/raises500/')
+ # We look for a HTML fragment of the form
+ # '<div class="context" id="c38123208">', not '<div class="context" id="c38,123,208"'
+ self.assertContains(response, '<div class="context" id="', status_code=500)
+ match = re.search(b'<div class="context" id="(?P<id>[^"]+)">', response.content)
+ self.assertFalse(match is None)
+ id_repr = match.group('id')
+ self.assertFalse(re.search(b'[^c\d]', id_repr),
+ "Numeric IDs in debug response HTML page shouldn't be localized (value: %s)." % id_repr)
+
def test_template_exceptions(self):
for n in range(len(except_args)):
try:
diff --git a/tests/view_tests/urls.py b/tests/view_tests/urls.py
index f2c910368d..4db3e262ed 100644
--- a/tests/view_tests/urls.py
+++ b/tests/view_tests/urls.py
@@ -49,6 +49,7 @@ urlpatterns = patterns('',
(r'raises400/$', views.raises400),
(r'raises403/$', views.raises403),
(r'raises404/$', views.raises404),
+ (r'raises500/$', views.raises500),
# i18n views
(r'^i18n/', include('django.conf.urls.i18n')),
diff --git a/tests/view_tests/views.py b/tests/view_tests/views.py
index 0bac7d9321..04924bc9f7 100644
--- a/tests/view_tests/views.py
+++ b/tests/view_tests/views.py
@@ -31,6 +31,14 @@ def raises(request):
except Exception:
return technical_500_response(request, *sys.exc_info())
+def raises500(request):
+ # We need to inspect the HTML generated by the fancy 500 debug view but
+ # the test client ignores it, so we send it explicitly.
+ try:
+ raise Exception
+ except Exception:
+ return technical_500_response(request, *sys.exc_info())
+
def raises400(request):
raise SuspiciousOperation