From 924361de6c1c87a5dd4db0e37b94380246d85790 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Fri, 18 Sep 2009 19:29:32 -0400 Subject: Made the versions panel more powerful --- debug_toolbar/panels/version.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/version.py b/debug_toolbar/panels/version.py index 3d82dd0..1837021 100644 --- a/debug_toolbar/panels/version.py +++ b/debug_toolbar/panels/version.py @@ -1,21 +1,38 @@ +import sys + import django +from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ + +import debug_toolbar from debug_toolbar.panels import DebugPanel + class VersionDebugPanel(DebugPanel): """ Panel that displays the Django version. """ name = 'Version' + has_content = True def nav_title(self): - return _('Django Version') + return _('Versions') def nav_subtitle(self): - return django.get_version() + return 'Django %s' % django.get_version() def url(self): return '' + + def title(self): + return 'Versions' def content(self): - return '' + versions = { + 'Django': django.get_version(), + 'Django Debug Toolbar': debug_toolbar.__version__, + } + return render_to_string('debug_toolbar/panels/versions.html', { + 'versions': versions, + 'paths': sys.path, + }) -- cgit v1.2.3 From 4fd746e82f9ae2c36ca49627ae9b1a01b982d8ae Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Fri, 25 Sep 2009 23:20:09 -0400 Subject: detect versions for other installed applications --- debug_toolbar/panels/version.py | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/version.py b/debug_toolbar/panels/version.py index 1837021..f5a5a59 100644 --- a/debug_toolbar/panels/version.py +++ b/debug_toolbar/panels/version.py @@ -1,6 +1,7 @@ import sys import django +from django.conf import settings from django.template.loader import render_to_string from django.utils.translation import ugettext_lazy as _ @@ -28,10 +29,27 @@ class VersionDebugPanel(DebugPanel): return 'Versions' def content(self): - versions = { - 'Django': django.get_version(), - 'Django Debug Toolbar': debug_toolbar.__version__, - } + versions = {} + for app in settings.INSTALLED_APPS + ['django']: + name = app.split('.')[-1].replace('_', ' ').capitalize() + __import__(app) + app = sys.modules[app] + if hasattr(app, 'get_version'): + get_version = app.get_version + if callable(get_version): + version = get_version() + else: + version = get_version + elif hasattr(app, 'VERSION'): + version = app.VERSION + elif hasattr(app, '__version__'): + version = app.__version__ + else: + continue + if isinstance(version, (list, tuple)): + version = '.'.join(str(o) for o in version) + versions[name] = version + return render_to_string('debug_toolbar/panels/versions.html', { 'versions': versions, 'paths': sys.path, -- cgit v1.2.3 From 2d848a859a85b6937a1fe10d05211a3717589d86 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Fri, 25 Sep 2009 23:35:26 -0400 Subject: kill whitespace --- debug_toolbar/panels/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/version.py b/debug_toolbar/panels/version.py index f5a5a59..3b69520 100644 --- a/debug_toolbar/panels/version.py +++ b/debug_toolbar/panels/version.py @@ -49,7 +49,7 @@ class VersionDebugPanel(DebugPanel): if isinstance(version, (list, tuple)): version = '.'.join(str(o) for o in version) versions[name] = version - + return render_to_string('debug_toolbar/panels/versions.html', { 'versions': versions, 'paths': sys.path, -- cgit v1.2.3 From 3f81a95105381a0ffabc46ae6ab84d69ace89720 Mon Sep 17 00:00:00 2001 From: Chris Lamb Date: Wed, 14 Oct 2009 14:45:51 +0100 Subject: Show context where SQL query originated from template Signed-off-by: Chris Lamb Signed-off-by: Rob Hudson --- debug_toolbar/panels/sql.py | 54 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index e1a2b7d..ce43328 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -1,5 +1,6 @@ from datetime import datetime import os +import sys import SocketServer import traceback @@ -7,6 +8,8 @@ import django from django.conf import settings from django.db import connection from django.db.backends import util +from django.views.debug import linebreak_iter +from django.template import Node from django.template.loader import render_to_string from django.utils import simplejson from django.utils.encoding import force_unicode @@ -42,6 +45,40 @@ def tidy_stacktrace(strace): trace.append((s[0], s[1], s[2], s[3])) return trace +def get_template_info(source, context_lines=3): + line = 0 + upto = 0 + source_lines = [] + before = during = after = "" + + origin, (start, end) = source + template_source = origin.reload() + + for num, next in enumerate(linebreak_iter(template_source)): + if start >= upto and end <= next: + line = num + before = template_source[upto:start] + during = template_source[start:end] + after = template_source[end:next] + source_lines.append((num, template_source[upto:next])) + upto = next + + top = max(1, line - context_lines) + bottom = min(len(source_lines), line + 1 + context_lines) + + context = [] + for num, content in source_lines[top:bottom]: + context.append({ + 'num': num, + 'content': content, + 'highlight': (num == line), + }) + + return { + 'name': origin.name, + 'context': context, + } + class DatabaseStatTracker(util.CursorDebugWrapper): """ Replacement for CursorDebugWrapper which stores additional information @@ -60,6 +97,22 @@ class DatabaseStatTracker(util.CursorDebugWrapper): _params = simplejson.dumps([force_unicode(x) for x in params]) except TypeError: pass # object not JSON serializable + + template_info = None + cur_frame = sys._getframe().f_back + try: + while cur_frame is not None: + if cur_frame.f_code.co_name == 'render': + node = cur_frame.f_locals['self'] + if isinstance(node, Node): + template_info = get_template_info(node.source) + break + cur_frame = cur_frame.f_back + except: + pass + finally: + del cur_frame + # We keep `sql` to maintain backwards compatibility self.db.queries.append({ 'sql': self.db.ops.last_executed_query(self.cursor, sql, params), @@ -72,6 +125,7 @@ class DatabaseStatTracker(util.CursorDebugWrapper): 'stop_time': stop, 'is_slow': (duration > SQL_WARNING_THRESHOLD), 'is_select': sql.lower().strip().startswith('select'), + 'template_info': template_info, }) util.CursorDebugWrapper = DatabaseStatTracker -- cgit v1.2.3