aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar/panels/template.py
diff options
context:
space:
mode:
authorRob Hudson2008-09-09 23:27:48 -0700
committerRob Hudson2008-09-09 23:27:48 -0700
commit6e41146140e85ca74a13fa0f7f9ae868a83ea31e (patch)
tree72f46e0c4fc038498a1dcc2021388d71a9cd3fe1 /debug_toolbar/panels/template.py
parent338c7a0a38996d2ffb3e192b63646a6c23dc5bba (diff)
downloaddjango-debug-toolbar-6e41146140e85ca74a13fa0f7f9ae868a83ea31e.tar.bz2
Adding a templates panel that shows the templates used during a
request/response cycle. Also lists settings.TEMPLATE_DIRS.
Diffstat (limited to 'debug_toolbar/panels/template.py')
-rw-r--r--debug_toolbar/panels/template.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py
new file mode 100644
index 0000000..f1cf65b
--- /dev/null
+++ b/debug_toolbar/panels/template.py
@@ -0,0 +1,56 @@
+from django.conf import settings
+from django.core.signals import request_started
+from django.dispatch import Signal
+from django.template.loader import render_to_string
+from django.test.signals import template_rendered
+from debug_toolbar.panels import DebugPanel
+
+# Code taken and adapted from Simon Willison and Django Snippets:
+# http://www.djangosnippets.org/snippets/766/
+
+# Monkeypatch instrumented test renderer from django.test.utils - we could use
+# django.test.utils.setup_test_environment for this but that would also set up
+# e-mail interception, which we don't want
+from django.test.utils import instrumented_test_render
+from django.template import Template
+if Template.render != instrumented_test_render:
+ Template.original_render = Template.render
+ Template.render = instrumented_test_render
+# MONSTER monkey-patch
+old_template_init = Template.__init__
+def new_template_init(self, template_string, origin=None, name='<Unknown Template>'):
+ old_template_init(self, template_string, origin, name)
+ self.origin = origin
+Template.__init__ = new_template_init
+
+class TemplateDebugPanel(DebugPanel):
+ """
+ A panel that lists all templates used during processing of a response.
+ """
+ name = 'Template'
+ has_content = True
+
+ def __init__(self, request):
+ super(TemplateDebugPanel, self).__init__(request)
+ self.templates_used = []
+ template_rendered.connect(self._storeRenderedTemplates)
+
+ def _storeRenderedTemplates(self, sender, **kwargs):
+ self.templates_used.append(kwargs['template'])
+
+ def title(self):
+ return 'Templates'
+
+ def url(self):
+ return ''
+
+ def content(self):
+ templates = [
+ (t.name, t.origin and t.origin.name or 'No origin')
+ for t in self.templates_used
+ ]
+ context = {
+ 'templates': templates,
+ 'template_dirs': settings.TEMPLATE_DIRS,
+ }
+ return render_to_string('debug_toolbar/panels/templates.html', context)