Author: kmtracey
Date: 2010-03-08 11:01:21 -0600 (Mon, 08 Mar 2010)
New Revision: 12725

Added:
   django/trunk/tests/regressiontests/views/templatetags/
   django/trunk/tests/regressiontests/views/templatetags/__init__.py
   django/trunk/tests/regressiontests/views/templatetags/debugtags.py
Modified:
   django/trunk/django/template/__init__.py
   django/trunk/django/template/debug.py
   django/trunk/tests/regressiontests/templates/tests.py
   django/trunk/tests/regressiontests/views/tests/debug.py
   django/trunk/tests/regressiontests/views/urls.py
   django/trunk/tests/regressiontests/views/views.py
Log:
Fixed #11461: Ensured complete traceback is available on the debug page when an 
exception is encountered during template rendering, even when running on Python 
2.6 or higher. Thanks Glenn.


Modified: django/trunk/django/template/__init__.py
===================================================================
--- django/trunk/django/template/__init__.py    2010-03-08 15:23:52 UTC (rev 
12724)
+++ django/trunk/django/template/__init__.py    2010-03-08 17:01:21 UTC (rev 
12725)
@@ -104,20 +104,7 @@
 invalid_var_format_string = None
 
 class TemplateSyntaxError(Exception):
-    def __str__(self):
-        try:
-            import cStringIO as StringIO
-        except ImportError:
-            import StringIO
-        output = StringIO.StringIO()
-        output.write(Exception.__str__(self))
-        # Check if we wrapped an exception and print that too.
-        if hasattr(self, 'exc_info'):
-            import traceback
-            output.write('\n\nOriginal ')
-            e = self.exc_info
-            traceback.print_exception(e[0], e[1], e[2], 500, output)
-        return output.getvalue()
+    pass
 
 class TemplateDoesNotExist(Exception):
     pass

Modified: django/trunk/django/template/debug.py
===================================================================
--- django/trunk/django/template/debug.py       2010-03-08 15:23:52 UTC (rev 
12724)
+++ django/trunk/django/template/debug.py       2010-03-08 17:01:21 UTC (rev 
12725)
@@ -76,10 +76,11 @@
             raise
         except Exception, e:
             from sys import exc_info
-            wrapped = TemplateSyntaxError(u'Caught an exception while 
rendering: %s' % force_unicode(e, errors='replace'))
+            wrapped = TemplateSyntaxError(u'Caught %s while rendering: %s' %
+                (e.__class__.__name__, force_unicode(e, errors='replace')))
             wrapped.source = node.source
             wrapped.exc_info = exc_info()
-            raise wrapped
+            raise wrapped, None, wrapped.exc_info[2]
         return result
 
 class DebugVariableNode(VariableNode):

Modified: django/trunk/tests/regressiontests/templates/tests.py
===================================================================
--- django/trunk/tests/regressiontests/templates/tests.py       2010-03-08 
15:23:52 UTC (rev 12724)
+++ django/trunk/tests/regressiontests/templates/tests.py       2010-03-08 
17:01:21 UTC (rev 12725)
@@ -216,7 +216,7 @@
         except TemplateSyntaxError, e:
             # Assert that we are getting the template syntax error and not the
             # string encoding error.
-            self.assertEquals(e.args[0], "Caught an exception while rendering: 
Reverse for 'will_not_match' with arguments '()' and keyword arguments '{}' not 
found.")
+            self.assertEquals(e.args[0], "Caught NoReverseMatch while 
rendering: Reverse for 'will_not_match' with arguments '()' and keyword 
arguments '{}' not found.")
 
         settings.SETTINGS_MODULE = old_settings_module
         settings.TEMPLATE_DEBUG = old_template_debug

Added: django/trunk/tests/regressiontests/views/templatetags/__init__.py
===================================================================


Property changes on: 
django/trunk/tests/regressiontests/views/templatetags/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: django/trunk/tests/regressiontests/views/templatetags/debugtags.py
===================================================================
--- django/trunk/tests/regressiontests/views/templatetags/debugtags.py          
                (rev 0)
+++ django/trunk/tests/regressiontests/views/templatetags/debugtags.py  
2010-03-08 17:01:21 UTC (rev 12725)
@@ -0,0 +1,10 @@
+from django import template
+ 
+from regressiontests.views import BrokenException
+
+register = template.Library()
+
+...@register.simple_tag
+def go_boom(arg):
+    raise BrokenException(arg)
+


Property changes on: 
django/trunk/tests/regressiontests/views/templatetags/debugtags.py
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: django/trunk/tests/regressiontests/views/tests/debug.py
===================================================================
--- django/trunk/tests/regressiontests/views/tests/debug.py     2010-03-08 
15:23:52 UTC (rev 12724)
+++ django/trunk/tests/regressiontests/views/tests/debug.py     2010-03-08 
17:01:21 UTC (rev 12725)
@@ -1,3 +1,5 @@
+import inspect
+
 from django.conf import settings
 from django.core.files.uploadedfile import SimpleUploadedFile
 from django.test import TestCase
@@ -2,2 +4,3 @@
 from django.core.urlresolvers import reverse
+from django.template import TemplateSyntaxError
 
@@ -9,9 +12,12 @@
     def setUp(self):
         self.old_debug = settings.DEBUG
         settings.DEBUG = True
+        self.old_template_debug = settings.TEMPLATE_DEBUG 
+        settings.TEMPLATE_DEBUG = True 
 
     def tearDown(self):
         settings.DEBUG = self.old_debug
+        settings.TEMPLATE_DEBUG = self.old_template_debug
 
     def test_files(self):
         response = self.client.get('/views/raises/')
@@ -33,3 +39,13 @@
             self.assertRaises(BrokenException, self.client.get,
                 reverse('view_exception', args=(n,)))
 
+    def test_template_exceptions(self):
+        for n in range(len(except_args)):
+            try:
+                self.client.get(reverse('template_exception', args=(n,)))
+            except TemplateSyntaxError, e:
+                raising_loc = inspect.trace()[-1][-2][0].strip()
+                self.failIf(raising_loc.find('raise BrokenException') == -1,
+                    "Failed to find 'raise BrokenException' in last frame of 
traceback, instead found: %s" % 
+                        raising_loc) 
+

Modified: django/trunk/tests/regressiontests/views/urls.py
===================================================================
--- django/trunk/tests/regressiontests/views/urls.py    2010-03-08 15:23:52 UTC 
(rev 12724)
+++ django/trunk/tests/regressiontests/views/urls.py    2010-03-08 17:01:21 UTC 
(rev 12725)
@@ -109,4 +109,5 @@
 
 urlpatterns += patterns('regressiontests.views.views',
     url(r'view_exception/(?P<n>\d+)/$', 'view_exception', 
name='view_exception'),
+    url(r'template_exception/(?P<n>\d+)/$', 'template_exception', 
name='template_exception'),
 )

Modified: django/trunk/tests/regressiontests/views/views.py
===================================================================
--- django/trunk/tests/regressiontests/views/views.py   2010-03-08 15:23:52 UTC 
(rev 12724)
+++ django/trunk/tests/regressiontests/views/views.py   2010-03-08 17:01:21 UTC 
(rev 12725)
@@ -5,6 +5,7 @@
 from django.views.debug import technical_500_response
 from django.views.generic.create_update import create_object
 from django.core.urlresolvers import get_resolver
+from django.shortcuts import render_to_response
 
 from regressiontests.views import BrokenException, except_args
 
@@ -52,3 +53,7 @@
 def view_exception(request, n):
     raise BrokenException(except_args[int(n)])
 
+def template_exception(request, n):
+    return render_to_response('debug/template_exception.html',
+        {'arg': except_args[int(n)]})
+

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to django-upda...@googlegroups.com.
To unsubscribe from this group, send email to 
django-updates+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.

Reply via email to