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 +++++++++++++++++++--- .../templates/debug_toolbar/panels/versions.html | 18 +++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 debug_toolbar/templates/debug_toolbar/panels/versions.html 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, + }) diff --git a/debug_toolbar/templates/debug_toolbar/panels/versions.html b/debug_toolbar/templates/debug_toolbar/panels/versions.html new file mode 100644 index 0000000..f0ee012 --- /dev/null +++ b/debug_toolbar/templates/debug_toolbar/panels/versions.html @@ -0,0 +1,18 @@ +{% load i18n %} + + + + + + + + + + {% for package, version in versions.iteritems %} + + + + + {% endfor %} + +
{% trans "Package" %}{% trans "Version" %}
{{ package }}{{ version }}
-- cgit v1.2.3 From c91d9b7e48528fcc901b567d28ed67bdcb42bffa Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Fri, 25 Sep 2009 22:48:16 -0400 Subject: Mkae this threadsafe --- debug_toolbar/middleware.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index 29c6336..cd2386c 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -32,7 +32,7 @@ class DebugToolbarMiddleware(object): on outgoing response. """ def __init__(self): - self.debug_toolbar = None + self.debug_toolbars = {} self.original_urlconf = settings.ROOT_URLCONF self.original_pattern = patterns('', ('', include(self.original_urlconf)),) self.override_url = True @@ -63,22 +63,19 @@ class DebugToolbarMiddleware(object): self.override_url = False request.urlconf = 'debug_toolbar.urls' - self.debug_toolbar = DebugToolbar(request) - for panel in self.debug_toolbar.panels: + self.debug_toolbars[request] = DebugToolbar(request) + for panel in self.debug_toolbars[request]: panel.process_request(request) - elif self.debug_toolbar: - self.debug_toolbar = None - return None def process_view(self, request, view_func, view_args, view_kwargs): - if self.debug_toolbar: - for panel in self.debug_toolbar.panels: + if request in self.debug_toolbars: + for panel in self.debug_toolbars[request].panels: panel.process_view(request, view_func, view_args, view_kwargs) def process_response(self, request, response): - if not self.debug_toolbar: + if request not in self.debug_toolbars: return response - if self.debug_toolbar.config['INTERCEPT_REDIRECTS']: + if self.debug_toolbars[request].config['INTERCEPT_REDIRECTS']: if isinstance(response, HttpResponseRedirect): redirect_to = response.get('Location', None) if redirect_to: @@ -88,8 +85,9 @@ class DebugToolbarMiddleware(object): ) if response.status_code != 200: return response - for panel in self.debug_toolbar.panels: + for panel in self.debug_toolbars[request].panels: panel.process_response(request, response) if response['Content-Type'].split(';')[0] in _HTML_TYPES: - response.content = replace_insensitive(smart_unicode(response.content), u'', smart_unicode(self.debug_toolbar.render_toolbar() + u'')) + response.content = replace_insensitive(smart_unicode(response.content), u'', smart_unicode(self.debug_toolbars[request].render_toolbar() + u'')) + del self.debug_toolbars[request] return response -- 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/middleware.py | 2 +- debug_toolbar/panels/version.py | 26 ++++++++++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index cd2386c..eed25c4 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -64,7 +64,7 @@ class DebugToolbarMiddleware(object): request.urlconf = 'debug_toolbar.urls' self.debug_toolbars[request] = DebugToolbar(request) - for panel in self.debug_toolbars[request]: + for panel in self.debug_toolbars[request].panels: panel.process_request(request) def process_view(self, request, view_func, view_args, view_kwargs): 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(-) 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 4ca3529b6418241628e702c9c1e5b8d31ab69d66 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Fri, 25 Sep 2009 22:48:16 -0400 Subject: Make this threadsafe Signed-off-by: Rob Hudson --- debug_toolbar/middleware.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/debug_toolbar/middleware.py b/debug_toolbar/middleware.py index 29c6336..eed25c4 100644 --- a/debug_toolbar/middleware.py +++ b/debug_toolbar/middleware.py @@ -32,7 +32,7 @@ class DebugToolbarMiddleware(object): on outgoing response. """ def __init__(self): - self.debug_toolbar = None + self.debug_toolbars = {} self.original_urlconf = settings.ROOT_URLCONF self.original_pattern = patterns('', ('', include(self.original_urlconf)),) self.override_url = True @@ -63,22 +63,19 @@ class DebugToolbarMiddleware(object): self.override_url = False request.urlconf = 'debug_toolbar.urls' - self.debug_toolbar = DebugToolbar(request) - for panel in self.debug_toolbar.panels: + self.debug_toolbars[request] = DebugToolbar(request) + for panel in self.debug_toolbars[request].panels: panel.process_request(request) - elif self.debug_toolbar: - self.debug_toolbar = None - return None def process_view(self, request, view_func, view_args, view_kwargs): - if self.debug_toolbar: - for panel in self.debug_toolbar.panels: + if request in self.debug_toolbars: + for panel in self.debug_toolbars[request].panels: panel.process_view(request, view_func, view_args, view_kwargs) def process_response(self, request, response): - if not self.debug_toolbar: + if request not in self.debug_toolbars: return response - if self.debug_toolbar.config['INTERCEPT_REDIRECTS']: + if self.debug_toolbars[request].config['INTERCEPT_REDIRECTS']: if isinstance(response, HttpResponseRedirect): redirect_to = response.get('Location', None) if redirect_to: @@ -88,8 +85,9 @@ class DebugToolbarMiddleware(object): ) if response.status_code != 200: return response - for panel in self.debug_toolbar.panels: + for panel in self.debug_toolbars[request].panels: panel.process_response(request, response) if response['Content-Type'].split(';')[0] in _HTML_TYPES: - response.content = replace_insensitive(smart_unicode(response.content), u'', smart_unicode(self.debug_toolbar.render_toolbar() + u'')) + response.content = replace_insensitive(smart_unicode(response.content), u'', smart_unicode(self.debug_toolbars[request].render_toolbar() + u'')) + del self.debug_toolbars[request] return response -- cgit v1.2.3 From c1d19af25d3f7e76520eb93bc45d0860add6e38f Mon Sep 17 00:00:00 2001 From: Chris Lamb Date: Wed, 14 Oct 2009 14:34:25 +0100 Subject: Move the stacktrace underneath the SQL - current column is too narrow Signed-off-by: Chris Lamb Signed-off-by: Rob Hudson --- debug_toolbar/media/debug_toolbar/toolbar.js | 2 +- debug_toolbar/media/debug_toolbar/toolbar.min.js | 2 +- .../templates/debug_toolbar/panels/sql.html | 34 ++++++++++++---------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/debug_toolbar/media/debug_toolbar/toolbar.js b/debug_toolbar/media/debug_toolbar/toolbar.js index fc4162f..56faddf 100644 --- a/debug_toolbar/media/debug_toolbar/toolbar.js +++ b/debug_toolbar/media/debug_toolbar/toolbar.js @@ -45,7 +45,7 @@ jQuery(function($j) { return false; }); $j('#djDebugSQLPanel a.djSQLShowStacktrace').click(function() { - $j.djDebug.toggle_content($j(this).parent().next()); + $j.djDebug.toggle_content($j('.djSQLHideStacktraceDiv', $(this).parents('tr'))); return false; }); $j('#djHideToolBarButton').click(function() { diff --git a/debug_toolbar/media/debug_toolbar/toolbar.min.js b/debug_toolbar/media/debug_toolbar/toolbar.min.js index 2545497..021a244 100644 --- a/debug_toolbar/media/debug_toolbar/toolbar.min.js +++ b/debug_toolbar/media/debug_toolbar/toolbar.min.js @@ -1 +1 @@ -jQuery.noConflict();jQuery(function(b){var a="dj_debug_panel";b.djDebug=function(d,c){b.djDebug.init()};b.extend(b.djDebug,{init:function(){var c=null;b("#djDebugPanelList li a").click(function(){if(!this.className){return false}c=b("#djDebug #"+this.className);if(c.is(":visible")){b(document).trigger("close.djDebug");b(this).parent().removeClass("active")}else{b(".panelContent").hide();c.show();b.djDebug.open();b("#djDebugToolbar li").removeClass("active");b(this).parent().addClass("active")}return false});b("#djDebug a.close").click(function(){b(document).trigger("close.djDebug");b("#djDebugToolbar li").removeClass("active");return false});b("#djDebug a.remoteCall").click(function(){b("#djDebugWindow").load(this.href,{},function(){b("#djDebugWindow a.back").click(function(){b(this).parent().parent().hide();return false})});b("#djDebugWindow").show();return false});b("#djDebugTemplatePanel a.djTemplateShowContext").click(function(){b.djDebug.toggle_arrow(b(this).children(".toggleArrow"));b.djDebug.toggle_content(b(this).parent().next());return false});b("#djDebugSQLPanel a.djSQLShowStacktrace").click(function(){b.djDebug.toggle_content(b(this).parent().next());return false});b("#djHideToolBarButton").click(function(){b.djDebug.hide_toolbar(true);return false});b("#djShowToolBarButton").click(function(){b.djDebug.show_toolbar();return false});if(b.cookie(a)){b.djDebug.hide_toolbar(false)}else{b.djDebug.show_toolbar(false)}},open:function(){},toggle_content:function(c){if(c.is(":visible")){c.hide()}else{c.show()}},close:function(){b(document).trigger("close.djDebug");return false},hide_toolbar:function(c){b("#djDebugWindow").hide();b(".panelContent").hide();b("#djDebugToolbar li").removeClass("active");b("#djDebugToolbar").hide("fast");b("#djDebugToolbarHandle").show();b(document).unbind("keydown.djDebug");if(c){b.cookie(a,"hide",{path:"/",expires:10})}},show_toolbar:function(c){b(document).bind("keydown.djDebug",function(d){if(d.keyCode==27){b.djDebug.close()}});b("#djDebugToolbarHandle").hide();if(c){b("#djDebugToolbar").show("fast")}else{b("#djDebugToolbar").show()}b.cookie(a,null,{path:"/",expires:-1})},toggle_arrow:function(d){var c=String.fromCharCode(9654);var e=String.fromCharCode(9660);d.html(d.html()==c?e:c)}});b(document).bind("close.djDebug",function(){if(b("#djDebugWindow").is(":visible")){b("#djDebugWindow").hide();return}if(b(".panelContent").is(":visible")){b(".panelContent").hide();return}if(b("#djDebugToolbar").is(":visible")){b.djDebug.hide_toolbar(true);return}})});jQuery(function(){jQuery.djDebug()});jQuery.cookie=function(b,j,m){if(typeof j!="undefined"){m=m||{};if(j===null){j="";m.expires=-1}var e="";if(m.expires&&(typeof m.expires=="number"||m.expires.toUTCString)){var f;if(typeof m.expires=="number"){f=new Date();f.setTime(f.getTime()+(m.expires*24*60*60*1000))}else{f=m.expires}e="; expires="+f.toUTCString()}var l=m.path?"; path="+(m.path):"";var g=m.domain?"; domain="+(m.domain):"";var a=m.secure?"; secure":"";document.cookie=[b,"=",encodeURIComponent(j),e,l,g,a].join("")}else{var d=null;if(document.cookie&&document.cookie!=""){var k=document.cookie.split(";");for(var h=0;h {% if query.stacktrace %} - {% endif %}
{{ query.sql|safe }}
+ {% if query.stacktrace %} + + {% endif %}
-- cgit v1.2.3 From 0d544a7f2ddbde72b9fe23ce627ad82af0abad0b Mon Sep 17 00:00:00 2001 From: Chris Lamb Date: Wed, 14 Oct 2009 14:35:12 +0100 Subject: Left-align the header cells in the SQL stacktrace table The columns are extremely wide, which makes centered titles look very odd. Signed-off-by: Rob Hudson --- debug_toolbar/media/debug_toolbar/toolbar.css | 4 ++++ debug_toolbar/media/debug_toolbar/toolbar.min.css | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/debug_toolbar/media/debug_toolbar/toolbar.css b/debug_toolbar/media/debug_toolbar/toolbar.css index 48543f8..1aeb6e3 100644 --- a/debug_toolbar/media/debug_toolbar/toolbar.css +++ b/debug_toolbar/media/debug_toolbar/toolbar.css @@ -345,6 +345,10 @@ z-index:100000002; } +#djDebug .djSQLHideStacktraceDiv tbody th { + text-align: left; +} + #djDebug span.djDebugLineChart { border-top:3px solid #777; position:absolute; diff --git a/debug_toolbar/media/debug_toolbar/toolbar.min.css b/debug_toolbar/media/debug_toolbar/toolbar.min.css index be64aab..2b576f9 100644 --- a/debug_toolbar/media/debug_toolbar/toolbar.min.css +++ b/debug_toolbar/media/debug_toolbar/toolbar.min.css @@ -1 +1 @@ -#djDebug{color:#000;background:#FFF;}#djDebug,#djDebug div,#djDebug span,#djDebug applet,#djDebug object,#djDebug iframe,#djDebug h1,#djDebug h2,#djDebug h3,#djDebug h4,#djDebug h5,#djDebug h6,#djDebug p,#djDebug blockquote,#djDebug pre,#djDebug a,#djDebug abbr,#djDebug acronym,#djDebug address,#djDebug big,#djDebug cite,#djDebug code,#djDebug del,#djDebug dfn,#djDebug em,#djDebug font,#djDebug img,#djDebug ins,#djDebug kbd,#djDebug q,#djDebug s,#djDebug samp,#djDebug small,#djDebug strike,#djDebug strong,#djDebug sub,#djDebug sup,#djDebug tt,#djDebug var,#djDebug b,#djDebug u,#djDebug i,#djDebug center,#djDebug dl,#djDebug dt,#djDebug dd,#djDebug ol,#djDebug ul,#djDebug li,#djDebug fieldset,#djDebug form,#djDebug label,#djDebug legend,#djDebug table,#djDebug caption,#djDebug tbody,#djDebug tfoot,#djDebug thead,#djDebug tr,#djDebug th,#djDebug td{margin:0;padding:0;border:0;outline:0;font-size:12px;line-height:1.5em;color:#000;vertical-align:baseline;background:transparent;font-family:sans-serif;text-align:left;}#djDebug #djDebugToolbar{background:#111;width:200px;z-index:100000000;position:fixed;top:0;bottom:0;right:0;opacity:.9;}#djDebug #djDebugToolbar small{color:#999;}#djDebug #djDebugToolbar ul{margin:0;padding:0;list-style:none;}#djDebug #djDebugToolbar li{border-bottom:1px solid #222;color:#fff;display:block;font-weight:bold;float:none;margin:0;padding:0;position:relative;width:auto;}#djDebug #djDebugToolbar li>a,#djDebug #djDebugToolbar li>div.contentless{font-weight:normal;font-style:normal;text-decoration:none;display:block;font-size:16px;padding:10px 10px 5px 25px;color:#fff;}#djDebug #djDebugToolbar li a:hover{color:#111;background-color:#ffc;}#djDebug #djDebugToolbar li.active{background-image:url(indicator.png);background-repeat:no-repeat;background-position:left center;background-color:#333;padding-left:10px;}#djDebug #djDebugToolbar li.active a:hover{color:#b36a60;background-color:transparent;}#djDebug #djDebugToolbar li small{font-size:12px;color:#999;font-style:normal;text-decoration:none;font-variant:small-caps;}#djDebug #djDebugToolbarHandle{position:fixed;background:#fff;border:1px solid #111;top:30px;right:0;z-index:100000000;opacity:.75;}#djDebug a#djShowToolBarButton{display:block;height:75px;width:30px;border-right:none;border-bottom:4px solid #fff;border-top:4px solid #fff;border-left:4px solid #fff;color:#fff;font-size:10px;font-weight:bold;text-decoration:none;text-align:center;text-indent:-999999px;background:#000 url(djdt_vertical.png) no-repeat left center;opacity:.5;}#djDebug a#djShowToolBarButton:hover{background-color:#111;padding-right:6px;border-top-color:#FFE761;border-left-color:#FFE761;border-bottom-color:#FFE761;opacity:1.0;}#djDebug pre{background-color:#fff;overflow:auto;}#djDebug tr.djDebugOdd{background-color:#f5f5f5;}#djDebug .panelContent{display:none;position:fixed;margin:0;top:0;right:200px;bottom:0;left:0;background-color:#eee;color:#666;z-index:100000000;}#djDebug .panelContent>div{border-bottom:1px solid #ddd;}#djDebug .djDebugPanelTitle{position:absolute;background-color:#ffc;color:#666;padding-left:20px;top:0;right:0;left:0;height:50px;}#djDebug .djDebugPanelContent{position:absolute;top:50px;right:0;bottom:0;left:0;height:auto;padding:0 0 0 20px;}#djDebug .djDebugPanelContent .scroll{height:100%;overflow:auto;display:block;padding:0 10px 0 0;}#djDebug h3{font-size:24px;font-weight:normal;line-height:50px;}#djDebug h4{font-size:20px;font-weight:bold;margin-top:.8em;}#djDebug .panelContent table{border:1px solid #ccc;border-collapse:collapse;width:100%;background-color:#fff;display:block;margin-top:.8em;overflow:auto;}#djDebug .panelContent tbody td,#djDebug .panelContent tbody th{vertical-align:top;padding:2px 3px;}#djDebug .panelContent thead th{padding:1px 6px 1px 3px;text-align:left;font-weight:bold;font-size:14px;}#djDebug .panelContent tbody th{width:12em;text-align:right;color:#666;padding-right:.5em;}#djDebug .panelContent code{font-family:Consolas,Monaco,"Bitstream Vera Sans Mono","Lucida Console",monospace;}#djDebug .panelContent .close{text-indent:-9999999px;display:block;position:absolute;top:4px;right:15px;height:40px;width:40px;background:url(close.png) no-repeat center center;}#djDebug .panelContent .close:hover{background-image:url(close_hover.png);}#djDebug .panelContent .close.back{background-image:url(back.png);}#djDebug .panelContent .close.back:hover{background-image:url(back_hover.png);}#djDebug .panelContent dt,#djDebug .panelContent dd{display:block;}#djDebug .panelContent dt{margin-top:.75em;}#djDebug .panelContent dd{margin-left:10px;}#djDebug a.toggleTemplate{padding:4px;background-color:#bbb;-moz-border-radius:3px;-webkit-border-radius:3px;}#djDebug a.toggleTemplate:hover{padding:4px;background-color:#444;color:#ffe761;-moz-border-radius:3px;-webkit-border-radius:3px;}#djDebug a.djTemplateShowContext,#djDebug a.djTemplateShowContext span.toggleArrow{color:#999;}#djDebug a.djTemplateShowContext:hover,#djDebug a.djTemplateShowContext:hover span.toggleArrow{color:#000;cursor:pointer;}#djDebug .djDebugSqlWrap{position:relative;}#djDebug .djDebugSql{z-index:100000002;}#djDebug span.djDebugLineChart{border-top:3px solid #777;position:absolute;bottom:0;top:0;left:0;display:block;z-index:1000000001;}#djDebug span.djDebugLineChartWarning{border-top-color:#900;}#djDebug .highlight{color:#000;}#djDebug .highlight .err{color:#000;}#djDebug .highlight .g{color:#000;}#djDebug .highlight .k{color:#000;font-weight:bold;}#djDebug .highlight .o{color:#000;}#djDebug .highlight .n{color:#000;}#djDebug .highlight .mi{color:#000;font-weight:bold;}#djDebug .highlight .l{color:#000;}#djDebug .highlight .x{color:#000;}#djDebug .highlight .p{color:#000;}#djDebug .highlight .m{color:#000;font-weight:bold;}#djDebug .highlight .s{color:#333;}#djDebug .highlight .w{color:#888;}#djDebug .highlight .il{color:#000;font-weight:bold;}#djDebug .highlight .na{color:#333;}#djDebug .highlight .nt{color:#000;font-weight:bold;}#djDebug .highlight .nv{color:#333;}#djDebug .highlight .s2{color:#333;}#djDebug .highlight .cp{color:#333;} \ No newline at end of file +#djDebug{color:#000;background:#FFF;}#djDebug,#djDebug div,#djDebug span,#djDebug applet,#djDebug object,#djDebug iframe,#djDebug h1,#djDebug h2,#djDebug h3,#djDebug h4,#djDebug h5,#djDebug h6,#djDebug p,#djDebug blockquote,#djDebug pre,#djDebug a,#djDebug abbr,#djDebug acronym,#djDebug address,#djDebug big,#djDebug cite,#djDebug code,#djDebug del,#djDebug dfn,#djDebug em,#djDebug font,#djDebug img,#djDebug ins,#djDebug kbd,#djDebug q,#djDebug s,#djDebug samp,#djDebug small,#djDebug strike,#djDebug strong,#djDebug sub,#djDebug sup,#djDebug tt,#djDebug var,#djDebug b,#djDebug u,#djDebug i,#djDebug center,#djDebug dl,#djDebug dt,#djDebug dd,#djDebug ol,#djDebug ul,#djDebug li,#djDebug fieldset,#djDebug form,#djDebug label,#djDebug legend,#djDebug table,#djDebug caption,#djDebug tbody,#djDebug tfoot,#djDebug thead,#djDebug tr,#djDebug th,#djDebug td{margin:0;padding:0;border:0;outline:0;font-size:12px;line-height:1.5em;color:#000;vertical-align:baseline;background:transparent;font-family:sans-serif;text-align:left;}#djDebug #djDebugToolbar{background:#111;width:200px;z-index:100000000;position:fixed;top:0;bottom:0;right:0;opacity:.9;}#djDebug #djDebugToolbar small{color:#999;}#djDebug #djDebugToolbar ul{margin:0;padding:0;list-style:none;}#djDebug #djDebugToolbar li{border-bottom:1px solid #222;color:#fff;display:block;font-weight:bold;float:none;margin:0;padding:0;position:relative;width:auto;}#djDebug #djDebugToolbar li>a,#djDebug #djDebugToolbar li>div.contentless{font-weight:normal;font-style:normal;text-decoration:none;display:block;font-size:16px;padding:10px 10px 5px 25px;color:#fff;}#djDebug #djDebugToolbar li a:hover{color:#111;background-color:#ffc;}#djDebug #djDebugToolbar li.active{background-image:url(indicator.png);background-repeat:no-repeat;background-position:left center;background-color:#333;padding-left:10px;}#djDebug #djDebugToolbar li.active a:hover{color:#b36a60;background-color:transparent;}#djDebug #djDebugToolbar li small{font-size:12px;color:#999;font-style:normal;text-decoration:none;font-variant:small-caps;}#djDebug #djDebugToolbarHandle{position:fixed;background:#fff;border:1px solid #111;top:30px;right:0;z-index:100000000;opacity:.75;}#djDebug a#djShowToolBarButton{display:block;height:75px;width:30px;border-right:none;border-bottom:4px solid #fff;border-top:4px solid #fff;border-left:4px solid #fff;color:#fff;font-size:10px;font-weight:bold;text-decoration:none;text-align:center;text-indent:-999999px;background:#000 url(djdt_vertical.png) no-repeat left center;opacity:.5;}#djDebug a#djShowToolBarButton:hover{background-color:#111;padding-right:6px;border-top-color:#FFE761;border-left-color:#FFE761;border-bottom-color:#FFE761;opacity:1.0;}#djDebug pre{background-color:#fff;overflow:auto;}#djDebug tr.djDebugOdd{background-color:#f5f5f5;}#djDebug .panelContent{display:none;position:fixed;margin:0;top:0;right:200px;bottom:0;left:0;background-color:#eee;color:#666;z-index:100000000;}#djDebug .panelContent>div{border-bottom:1px solid #ddd;}#djDebug .djDebugPanelTitle{position:absolute;background-color:#ffc;color:#666;padding-left:20px;top:0;right:0;left:0;height:50px;}#djDebug .djDebugPanelContent{position:absolute;top:50px;right:0;bottom:0;left:0;height:auto;padding:0 0 0 20px;}#djDebug .djDebugPanelContent .scroll{height:100%;overflow:auto;display:block;padding:0 10px 0 0;}#djDebug h3{font-size:24px;font-weight:normal;line-height:50px;}#djDebug h4{font-size:20px;font-weight:bold;margin-top:.8em;}#djDebug .panelContent table{border:1px solid #ccc;border-collapse:collapse;width:100%;background-color:#fff;display:block;margin-top:.8em;overflow:auto;}#djDebug .panelContent tbody td,#djDebug .panelContent tbody th{vertical-align:top;padding:2px 3px;}#djDebug .panelContent thead th{padding:1px 6px 1px 3px;text-align:left;font-weight:bold;font-size:14px;}#djDebug .panelContent tbody th{width:12em;text-align:right;color:#666;padding-right:.5em;}#djDebug .panelContent code{font-family:Consolas,Monaco,"Bitstream Vera Sans Mono","Lucida Console",monospace;}#djDebug .panelContent .close{text-indent:-9999999px;display:block;position:absolute;top:4px;right:15px;height:40px;width:40px;background:url(close.png) no-repeat center center;}#djDebug .panelContent .close:hover{background-image:url(close_hover.png);}#djDebug .panelContent .close.back{background-image:url(back.png);}#djDebug .panelContent .close.back:hover{background-image:url(back_hover.png);}#djDebug .panelContent dt,#djDebug .panelContent dd{display:block;}#djDebug .panelContent dt{margin-top:.75em;}#djDebug .panelContent dd{margin-left:10px;}#djDebug a.toggleTemplate{padding:4px;background-color:#bbb;-moz-border-radius:3px;-webkit-border-radius:3px;}#djDebug a.toggleTemplate:hover{padding:4px;background-color:#444;color:#ffe761;-moz-border-radius:3px;-webkit-border-radius:3px;}#djDebug a.djTemplateShowContext,#djDebug a.djTemplateShowContext span.toggleArrow{color:#999;}#djDebug a.djTemplateShowContext:hover,#djDebug a.djTemplateShowContext:hover span.toggleArrow{color:#000;cursor:pointer;}#djDebug .djDebugSqlWrap{position:relative;}#djDebug .djDebugSql{z-index:100000002;}#djDebug .djSQLHideStacktraceDiv tbody th{text-align:left;}#djDebug span.djDebugLineChart{border-top:3px solid #777;position:absolute;bottom:0;top:0;left:0;display:block;z-index:1000000001;}#djDebug span.djDebugLineChartWarning{border-top-color:#900;}#djDebug .highlight{color:#000;}#djDebug .highlight .err{color:#000;}#djDebug .highlight .g{color:#000;}#djDebug .highlight .k{color:#000;font-weight:bold;}#djDebug .highlight .o{color:#000;}#djDebug .highlight .n{color:#000;}#djDebug .highlight .mi{color:#000;font-weight:bold;}#djDebug .highlight .l{color:#000;}#djDebug .highlight .x{color:#000;}#djDebug .highlight .p{color:#000;}#djDebug .highlight .m{color:#000;font-weight:bold;}#djDebug .highlight .s{color:#333;}#djDebug .highlight .w{color:#888;}#djDebug .highlight .il{color:#000;font-weight:bold;}#djDebug .highlight .na{color:#333;}#djDebug .highlight .nt{color:#000;font-weight:bold;}#djDebug .highlight .nv{color:#333;}#djDebug .highlight .s2{color:#333;}#djDebug .highlight .cp{color:#333;} \ No newline at end of file -- 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 ++++++++++++++++++++++ .../templates/debug_toolbar/panels/sql.html | 11 +++++ 2 files changed, 65 insertions(+) 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 diff --git a/debug_toolbar/templates/debug_toolbar/panels/sql.html b/debug_toolbar/templates/debug_toolbar/panels/sql.html index 038deaf..331306b 100644 --- a/debug_toolbar/templates/debug_toolbar/panels/sql.html +++ b/debug_toolbar/templates/debug_toolbar/panels/sql.html @@ -47,6 +47,17 @@ {% endfor %} + {% if query.template_info %} + + {% for line in query.template_info.context %} + + + + + {% endfor %} +
{{ line.num }}
{{ line.content }}
+

{{ query.template_info.name|default:"(unknown)" }}

+ {% endif %} {% endif %} -- cgit v1.2.3 From 55f21310a27c6c08033501bdcdbcd7d2915942bc Mon Sep 17 00:00:00 2001 From: Rob Hudson Date: Mon, 2 Nov 2009 12:51:40 -0800 Subject: Updated .po files --- debug_toolbar/locale/de/LC_MESSAGES/django.po | 22 ++++++++++++++++------ debug_toolbar/locale/en/LC_MESSAGES/django.po | 20 ++++++++++++++------ debug_toolbar/locale/es/LC_MESSAGES/django.po | 22 ++++++++++++++++------ debug_toolbar/locale/fr/LC_MESSAGES/django.po | 22 ++++++++++++++++------ debug_toolbar/locale/he/LC_MESSAGES/django.po | 22 ++++++++++++++++------ debug_toolbar/locale/ru/LC_MESSAGES/django.po | 22 ++++++++++++++++------ 6 files changed, 94 insertions(+), 36 deletions(-) diff --git a/debug_toolbar/locale/de/LC_MESSAGES/django.po b/debug_toolbar/locale/de/LC_MESSAGES/django.po index 6ca7c35..267bdcd 100644 --- a/debug_toolbar/locale/de/LC_MESSAGES/django.po +++ b/debug_toolbar/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-16 20:40-0700\n" +"POT-Creation-Date: 2009-11-02 12:50-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -41,8 +41,9 @@ msgstr "Templates" msgid "Time" msgstr "Zeit" -#: panels/version.py:12 -msgid "Django Version" +#: panels/version.py:20 +#, fuzzy +msgid "Versions" msgstr "Django-Version" #: templates/debug_toolbar/base.html:23 @@ -196,15 +197,15 @@ msgstr "" msgid "Query" msgstr "" -#: templates/debug_toolbar/panels/sql.html:32 +#: templates/debug_toolbar/panels/sql.html:38 msgid "Line" msgstr "Zeile" -#: templates/debug_toolbar/panels/sql.html:33 +#: templates/debug_toolbar/panels/sql.html:39 msgid "Method" msgstr "Methode" -#: templates/debug_toolbar/panels/sql.html:34 +#: templates/debug_toolbar/panels/sql.html:40 msgid "File" msgstr "Datei" @@ -272,3 +273,12 @@ msgstr "" #: templates/debug_toolbar/panels/timer.html:9 msgid "Resource" msgstr "Ressource" + +#: templates/debug_toolbar/panels/versions.html:6 +msgid "Package" +msgstr "" + +#: templates/debug_toolbar/panels/versions.html:7 +#, fuzzy +msgid "Version" +msgstr "Django-Version" diff --git a/debug_toolbar/locale/en/LC_MESSAGES/django.po b/debug_toolbar/locale/en/LC_MESSAGES/django.po index 65c3e2a..8b17e54 100644 --- a/debug_toolbar/locale/en/LC_MESSAGES/django.po +++ b/debug_toolbar/locale/en/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-16 20:40-0700\n" +"POT-Creation-Date: 2009-11-02 12:50-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -40,8 +40,8 @@ msgstr "" msgid "Time" msgstr "" -#: panels/version.py:12 -msgid "Django Version" +#: panels/version.py:20 +msgid "Versions" msgstr "" #: templates/debug_toolbar/base.html:23 @@ -191,15 +191,15 @@ msgstr "" msgid "Query" msgstr "" -#: templates/debug_toolbar/panels/sql.html:32 +#: templates/debug_toolbar/panels/sql.html:38 msgid "Line" msgstr "" -#: templates/debug_toolbar/panels/sql.html:33 +#: templates/debug_toolbar/panels/sql.html:39 msgid "Method" msgstr "" -#: templates/debug_toolbar/panels/sql.html:34 +#: templates/debug_toolbar/panels/sql.html:40 msgid "File" msgstr "" @@ -265,3 +265,11 @@ msgstr "" #: templates/debug_toolbar/panels/timer.html:9 msgid "Resource" msgstr "" + +#: templates/debug_toolbar/panels/versions.html:6 +msgid "Package" +msgstr "" + +#: templates/debug_toolbar/panels/versions.html:7 +msgid "Version" +msgstr "" diff --git a/debug_toolbar/locale/es/LC_MESSAGES/django.po b/debug_toolbar/locale/es/LC_MESSAGES/django.po index b08e6ec..a77557b 100644 --- a/debug_toolbar/locale/es/LC_MESSAGES/django.po +++ b/debug_toolbar/locale/es/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-16 20:40-0700\n" +"POT-Creation-Date: 2009-11-02 12:50-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -42,8 +42,9 @@ msgstr "Plantillas" msgid "Time" msgstr "Tiempo" -#: panels/version.py:12 -msgid "Django Version" +#: panels/version.py:20 +#, fuzzy +msgid "Versions" msgstr "Versión Django" #: templates/debug_toolbar/base.html:23 @@ -199,15 +200,15 @@ msgstr "" msgid "Query" msgstr "" -#: templates/debug_toolbar/panels/sql.html:32 +#: templates/debug_toolbar/panels/sql.html:38 msgid "Line" msgstr "Línea" -#: templates/debug_toolbar/panels/sql.html:33 +#: templates/debug_toolbar/panels/sql.html:39 msgid "Method" msgstr "Método" -#: templates/debug_toolbar/panels/sql.html:34 +#: templates/debug_toolbar/panels/sql.html:40 msgid "File" msgstr "Archivo" @@ -275,3 +276,12 @@ msgstr "" #: templates/debug_toolbar/panels/timer.html:9 msgid "Resource" msgstr "Recurso" + +#: templates/debug_toolbar/panels/versions.html:6 +msgid "Package" +msgstr "" + +#: templates/debug_toolbar/panels/versions.html:7 +#, fuzzy +msgid "Version" +msgstr "Versión Django" diff --git a/debug_toolbar/locale/fr/LC_MESSAGES/django.po b/debug_toolbar/locale/fr/LC_MESSAGES/django.po index 0b973ba..b29cc33 100644 --- a/debug_toolbar/locale/fr/LC_MESSAGES/django.po +++ b/debug_toolbar/locale/fr/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Django Debug Toolbar 0.8.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-16 20:40-0700\n" +"POT-Creation-Date: 2009-11-02 12:50-0800\n" "PO-Revision-Date: 2009-10-14 22:53+0200\n" "Last-Translator: David Paccoud \n" "Language-Team: French \n" @@ -41,8 +41,9 @@ msgstr "Gabarits" msgid "Time" msgstr "Temps" -#: panels/version.py:12 -msgid "Django Version" +#: panels/version.py:20 +#, fuzzy +msgid "Versions" msgstr "Version de Django" #: templates/debug_toolbar/base.html:23 @@ -202,15 +203,15 @@ msgstr "" msgid "Query" msgstr "" -#: templates/debug_toolbar/panels/sql.html:32 +#: templates/debug_toolbar/panels/sql.html:38 msgid "Line" msgstr "Ligne" -#: templates/debug_toolbar/panels/sql.html:33 +#: templates/debug_toolbar/panels/sql.html:39 msgid "Method" msgstr "Méthode" -#: templates/debug_toolbar/panels/sql.html:34 +#: templates/debug_toolbar/panels/sql.html:40 msgid "File" msgstr "Fichier" @@ -278,3 +279,12 @@ msgstr "" #: templates/debug_toolbar/panels/timer.html:9 msgid "Resource" msgstr "Ressources" + +#: templates/debug_toolbar/panels/versions.html:6 +msgid "Package" +msgstr "" + +#: templates/debug_toolbar/panels/versions.html:7 +#, fuzzy +msgid "Version" +msgstr "Version de Django" diff --git a/debug_toolbar/locale/he/LC_MESSAGES/django.po b/debug_toolbar/locale/he/LC_MESSAGES/django.po index 9cb109f..5823091 100644 --- a/debug_toolbar/locale/he/LC_MESSAGES/django.po +++ b/debug_toolbar/locale/he/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-16 20:40-0700\n" +"POT-Creation-Date: 2009-11-02 12:50-0800\n" "PO-Revision-Date: 2009-08-24 23:08-0600\n" "Last-Translator: Alex \n" "Language-Team: LANGUAGE \n" @@ -42,8 +42,9 @@ msgstr "תבנית" msgid "Time" msgstr "זמן" -#: panels/version.py:12 -msgid "Django Version" +#: panels/version.py:20 +#, fuzzy +msgid "Versions" msgstr "ג 'נגו גירסה" #: templates/debug_toolbar/base.html:23 @@ -197,15 +198,15 @@ msgstr "" msgid "Query" msgstr "" -#: templates/debug_toolbar/panels/sql.html:32 +#: templates/debug_toolbar/panels/sql.html:38 msgid "Line" msgstr "שורה" -#: templates/debug_toolbar/panels/sql.html:33 +#: templates/debug_toolbar/panels/sql.html:39 msgid "Method" msgstr "" -#: templates/debug_toolbar/panels/sql.html:34 +#: templates/debug_toolbar/panels/sql.html:40 msgid "File" msgstr "קובץ" @@ -273,3 +274,12 @@ msgstr "" #: templates/debug_toolbar/panels/timer.html:9 msgid "Resource" msgstr "" + +#: templates/debug_toolbar/panels/versions.html:6 +msgid "Package" +msgstr "" + +#: templates/debug_toolbar/panels/versions.html:7 +#, fuzzy +msgid "Version" +msgstr "ג 'נגו גירסה" diff --git a/debug_toolbar/locale/ru/LC_MESSAGES/django.po b/debug_toolbar/locale/ru/LC_MESSAGES/django.po index 883b0b6..3ed1286 100644 --- a/debug_toolbar/locale/ru/LC_MESSAGES/django.po +++ b/debug_toolbar/locale/ru/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-10-16 20:40-0700\n" +"POT-Creation-Date: 2009-11-02 12:50-0800\n" "PO-Revision-Date: \n" "Last-Translator: Mikhail Korobov \n" "Language-Team: \n" @@ -41,8 +41,9 @@ msgstr "Шаблоны" msgid "Time" msgstr "Время" -#: panels/version.py:12 -msgid "Django Version" +#: panels/version.py:20 +#, fuzzy +msgid "Versions" msgstr "Версия Django" #: templates/debug_toolbar/base.html:23 @@ -201,15 +202,15 @@ msgstr "" msgid "Query" msgstr "Запрос" -#: templates/debug_toolbar/panels/sql.html:32 +#: templates/debug_toolbar/panels/sql.html:38 msgid "Line" msgstr "Строка" -#: templates/debug_toolbar/panels/sql.html:33 +#: templates/debug_toolbar/panels/sql.html:39 msgid "Method" msgstr "Метод" -#: templates/debug_toolbar/panels/sql.html:34 +#: templates/debug_toolbar/panels/sql.html:40 msgid "File" msgstr "Файл" @@ -278,6 +279,15 @@ msgstr "" msgid "Resource" msgstr "Ресурс" +#: templates/debug_toolbar/panels/versions.html:6 +msgid "Package" +msgstr "" + +#: templates/debug_toolbar/panels/versions.html:7 +#, fuzzy +msgid "Version" +msgstr "Версия Django" + #~ msgid "HTTP Headers" #~ msgstr "Заголовки HTTP" -- cgit v1.2.3