From 565b100f9d97214043ae93c51d276951a65331e8 Mon Sep 17 00:00:00 2001 From: Rob Hudson Date: Tue, 11 Aug 2009 09:45:18 -0700 Subject: Refactored the UI to be a right hand side vertical toolbar. DebugPanel subclass grew a subtitle method to display informative text under the title. --- debug_toolbar/panels/__init__.py | 5 +++++ debug_toolbar/panels/logger.py | 5 ++++- debug_toolbar/panels/sql.py | 5 ++++- debug_toolbar/panels/timer.py | 7 +++++-- debug_toolbar/panels/version.py | 7 +++++-- 5 files changed, 23 insertions(+), 6 deletions(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/__init__.py b/debug_toolbar/panels/__init__.py index 54b3318..459e550 100644 --- a/debug_toolbar/panels/__init__.py +++ b/debug_toolbar/panels/__init__.py @@ -15,8 +15,13 @@ class DebugPanel(object): return 'djDebug%sPanel' % (self.name.replace(' ', '')) def title(self): + """Title showing in toolbar""" raise NotImplementedError + def subtitle(self): + """Subtitle showing until title in toolbar""" + return '' + def url(self): raise NotImplementedError diff --git a/debug_toolbar/panels/logger.py b/debug_toolbar/panels/logger.py index cb88148..91688a8 100644 --- a/debug_toolbar/panels/logger.py +++ b/debug_toolbar/panels/logger.py @@ -52,7 +52,10 @@ class LoggingPanel(DebugPanel): return records def title(self): - return "Logging (%s message%s)" % (len(handler.get_records()), (len(handler.get_records()) == 1) and '' or 's') + return "Logging" + + def subtitle(self): + return "%s message%s" % (len(handler.get_records()), (len(handler.get_records()) == 1) and '' or 's') def url(self): return '' diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index d3ac7f3..d1d1ead 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -74,9 +74,12 @@ class SQLDebugPanel(DebugPanel): self._sql_time = 0 def title(self): + return 'SQL' + + def subtitle(self): self._sql_time = sum(map(lambda q: float(q['time']), connection.queries)) num_queries = len(connection.queries) - self._offset - return '%d SQL %s (%.2fms)' % ( + return "%d %s in %.2fms" % ( num_queries, (num_queries == 1) and 'query' or 'queries', self._sql_time diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py index 352bf55..1491272 100644 --- a/debug_toolbar/panels/timer.py +++ b/debug_toolbar/panels/timer.py @@ -32,12 +32,15 @@ class TimerDebugPanel(DebugPanel): self._end_rusage = resource.getrusage(resource.RUSAGE_SELF) def title(self): + return 'Time' + + def subtitle(self): if self.has_resource: utime = self._end_rusage.ru_utime - self._start_rusage.ru_utime stime = self._end_rusage.ru_stime - self._start_rusage.ru_stime - return 'Time: %0.2fms, %0.2fms CPU' % (self.total_time, (utime + stime) * 1000.0) + return 'CPU: %0.2fms (%0.2fms)' % ((utime + stime) * 1000.0, self.total_time) else: - return 'Time: %0.2fms' % (self.total_time) + return 'TOTAL: %0.2fms' % (self.total_time) def url(self): return '' diff --git a/debug_toolbar/panels/version.py b/debug_toolbar/panels/version.py index 7ea6543..da05bf1 100644 --- a/debug_toolbar/panels/version.py +++ b/debug_toolbar/panels/version.py @@ -6,9 +6,12 @@ class VersionDebugPanel(DebugPanel): Panel that displays the Django version. """ name = 'Version' - + def title(self): - return 'Version: %s' % (django.get_version()) + return 'Django Version' + + def subtitle(self): + return django.get_version() def url(self): return '' -- cgit v1.2.3 From 2e5e136e00f964c10247c78da88e2b11e1f5a7dd Mon Sep 17 00:00:00 2001 From: Idan Gazit Date: Wed, 12 Aug 2009 04:39:59 +0300 Subject: renamed title/subtitle -> nav_title/nav_subtitle --- debug_toolbar/panels/__init__.py | 4 ++-- debug_toolbar/panels/cache.py | 2 +- debug_toolbar/panels/headers.py | 2 +- debug_toolbar/panels/logger.py | 4 ++-- debug_toolbar/panels/request_vars.py | 2 +- debug_toolbar/panels/settings_vars.py | 2 +- debug_toolbar/panels/signals.py | 2 +- debug_toolbar/panels/sql.py | 4 ++-- debug_toolbar/panels/template.py | 2 +- debug_toolbar/panels/timer.py | 4 ++-- debug_toolbar/panels/version.py | 4 ++-- 11 files changed, 16 insertions(+), 16 deletions(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/__init__.py b/debug_toolbar/panels/__init__.py index 459e550..879755a 100644 --- a/debug_toolbar/panels/__init__.py +++ b/debug_toolbar/panels/__init__.py @@ -14,11 +14,11 @@ class DebugPanel(object): def dom_id(self): return 'djDebug%sPanel' % (self.name.replace(' ', '')) - def title(self): + def nav_title(self): """Title showing in toolbar""" raise NotImplementedError - def subtitle(self): + def nav_subtitle(self): """Subtitle showing until title in toolbar""" return '' diff --git a/debug_toolbar/panels/cache.py b/debug_toolbar/panels/cache.py index 613d4d9..f1a921b 100644 --- a/debug_toolbar/panels/cache.py +++ b/debug_toolbar/panels/cache.py @@ -87,7 +87,7 @@ class CacheDebugPanel(DebugPanel): self.cache = CacheStatTracker(cache.cache) cache.cache = self.cache - def title(self): + def nav_title(self): return 'Cache: %.2fms' % self.cache.total_time def url(self): diff --git a/debug_toolbar/panels/headers.py b/debug_toolbar/panels/headers.py index 213198a..5462dec 100644 --- a/debug_toolbar/panels/headers.py +++ b/debug_toolbar/panels/headers.py @@ -31,7 +31,7 @@ class HeaderDebugPanel(DebugPanel): 'SERVER_SOFTWARE', ) - def title(self): + def nav_title(self): return 'HTTP Headers' def url(self): diff --git a/debug_toolbar/panels/logger.py b/debug_toolbar/panels/logger.py index 91688a8..6e46d9d 100644 --- a/debug_toolbar/panels/logger.py +++ b/debug_toolbar/panels/logger.py @@ -51,10 +51,10 @@ class LoggingPanel(DebugPanel): handler.clear_records() return records - def title(self): + def nav_title(self): return "Logging" - def subtitle(self): + def nav_subtitle(self): return "%s message%s" % (len(handler.get_records()), (len(handler.get_records()) == 1) and '' or 's') def url(self): diff --git a/debug_toolbar/panels/request_vars.py b/debug_toolbar/panels/request_vars.py index 88a7204..023f690 100644 --- a/debug_toolbar/panels/request_vars.py +++ b/debug_toolbar/panels/request_vars.py @@ -8,7 +8,7 @@ class RequestVarsDebugPanel(DebugPanel): name = 'RequestVars' has_content = True - def title(self): + def nav_title(self): return 'Request Vars' def url(self): diff --git a/debug_toolbar/panels/settings_vars.py b/debug_toolbar/panels/settings_vars.py index e090718..93cae32 100644 --- a/debug_toolbar/panels/settings_vars.py +++ b/debug_toolbar/panels/settings_vars.py @@ -10,7 +10,7 @@ class SettingsVarsDebugPanel(DebugPanel): name = 'SettingsVars' has_content = True - def title(self): + def nav_title(self): return 'Settings' def url(self): diff --git a/debug_toolbar/panels/signals.py b/debug_toolbar/panels/signals.py index 7fe382e..1aca1da 100644 --- a/debug_toolbar/panels/signals.py +++ b/debug_toolbar/panels/signals.py @@ -34,7 +34,7 @@ class SignalDebugPanel(DebugPanel): 'post_syncdb': post_syncdb, } - def title(self): + def nav_title(self): return "Signals" def url(self): diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index d1d1ead..2e70c77 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -73,10 +73,10 @@ class SQLDebugPanel(DebugPanel): self._offset = len(connection.queries) self._sql_time = 0 - def title(self): + def nav_title(self): return 'SQL' - def subtitle(self): + def nav_subtitle(self): self._sql_time = sum(map(lambda q: float(q['time']), connection.queries)) num_queries = len(connection.queries) - self._offset return "%d %s in %.2fms" % ( diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py index b548287..98b0769 100644 --- a/debug_toolbar/panels/template.py +++ b/debug_toolbar/panels/template.py @@ -41,7 +41,7 @@ class TemplateDebugPanel(DebugPanel): def _storeTemplateInfo(self, sender, **kwargs): self.templates.append(kwargs) - def title(self): + def nav_title(self): return 'Templates' def url(self): diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py index 1491272..554d696 100644 --- a/debug_toolbar/panels/timer.py +++ b/debug_toolbar/panels/timer.py @@ -31,10 +31,10 @@ class TimerDebugPanel(DebugPanel): if self.has_resource: self._end_rusage = resource.getrusage(resource.RUSAGE_SELF) - def title(self): + def nav_title(self): return 'Time' - def subtitle(self): + def nav_subtitle(self): if self.has_resource: utime = self._end_rusage.ru_utime - self._start_rusage.ru_utime stime = self._end_rusage.ru_stime - self._start_rusage.ru_stime diff --git a/debug_toolbar/panels/version.py b/debug_toolbar/panels/version.py index da05bf1..083b9cf 100644 --- a/debug_toolbar/panels/version.py +++ b/debug_toolbar/panels/version.py @@ -7,10 +7,10 @@ class VersionDebugPanel(DebugPanel): """ name = 'Version' - def title(self): + def nav_title(self): return 'Django Version' - def subtitle(self): + def nav_subtitle(self): return django.get_version() def url(self): -- cgit v1.2.3 From 5015057cfe3448028ff79ca36a96f1baa4224226 Mon Sep 17 00:00:00 2001 From: Idan Gazit Date: Wed, 12 Aug 2009 05:09:04 +0300 Subject: added in-panel title --- debug_toolbar/panels/__init__.py | 4 ++++ debug_toolbar/panels/cache.py | 3 +++ debug_toolbar/panels/headers.py | 3 +++ debug_toolbar/panels/logger.py | 3 +++ debug_toolbar/panels/request_vars.py | 5 ++++- debug_toolbar/panels/settings_vars.py | 3 +++ debug_toolbar/panels/signals.py | 3 +++ debug_toolbar/panels/sql.py | 3 +++ debug_toolbar/panels/template.py | 3 +++ debug_toolbar/panels/timer.py | 3 +++ 10 files changed, 32 insertions(+), 1 deletion(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/__init__.py b/debug_toolbar/panels/__init__.py index 879755a..cf65aa8 100644 --- a/debug_toolbar/panels/__init__.py +++ b/debug_toolbar/panels/__init__.py @@ -22,6 +22,10 @@ class DebugPanel(object): """Subtitle showing until title in toolbar""" return '' + def title(self): + """Title showing in panel""" + raise NotImplementedError + def url(self): raise NotImplementedError diff --git a/debug_toolbar/panels/cache.py b/debug_toolbar/panels/cache.py index f1a921b..a05d3cc 100644 --- a/debug_toolbar/panels/cache.py +++ b/debug_toolbar/panels/cache.py @@ -90,6 +90,9 @@ class CacheDebugPanel(DebugPanel): def nav_title(self): return 'Cache: %.2fms' % self.cache.total_time + def title(self): + return 'Cache Usage' + def url(self): return '' diff --git a/debug_toolbar/panels/headers.py b/debug_toolbar/panels/headers.py index 5462dec..06858ef 100644 --- a/debug_toolbar/panels/headers.py +++ b/debug_toolbar/panels/headers.py @@ -34,6 +34,9 @@ class HeaderDebugPanel(DebugPanel): def nav_title(self): return 'HTTP Headers' + def title(self): + return 'HTTP Headers' + def url(self): return '' diff --git a/debug_toolbar/panels/logger.py b/debug_toolbar/panels/logger.py index 6e46d9d..7ba1686 100644 --- a/debug_toolbar/panels/logger.py +++ b/debug_toolbar/panels/logger.py @@ -57,6 +57,9 @@ class LoggingPanel(DebugPanel): def nav_subtitle(self): return "%s message%s" % (len(handler.get_records()), (len(handler.get_records()) == 1) and '' or 's') + def title(self): + return 'Log Messages' + def url(self): return '' diff --git a/debug_toolbar/panels/request_vars.py b/debug_toolbar/panels/request_vars.py index 023f690..d0a8c19 100644 --- a/debug_toolbar/panels/request_vars.py +++ b/debug_toolbar/panels/request_vars.py @@ -10,7 +10,10 @@ class RequestVarsDebugPanel(DebugPanel): def nav_title(self): return 'Request Vars' - + + def title(self): + return 'Request Vars' + def url(self): return '' diff --git a/debug_toolbar/panels/settings_vars.py b/debug_toolbar/panels/settings_vars.py index 93cae32..0b7c315 100644 --- a/debug_toolbar/panels/settings_vars.py +++ b/debug_toolbar/panels/settings_vars.py @@ -13,6 +13,9 @@ class SettingsVarsDebugPanel(DebugPanel): def nav_title(self): return 'Settings' + def title(self): + return 'Settings from %s' % settings.SETTINGS_MODULE + def url(self): return '' diff --git a/debug_toolbar/panels/signals.py b/debug_toolbar/panels/signals.py index 1aca1da..a922694 100644 --- a/debug_toolbar/panels/signals.py +++ b/debug_toolbar/panels/signals.py @@ -37,6 +37,9 @@ class SignalDebugPanel(DebugPanel): def nav_title(self): return "Signals" + def title(self): + return "Signals" + def url(self): return '' diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index 2e70c77..f12939e 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -84,6 +84,9 @@ class SQLDebugPanel(DebugPanel): (num_queries == 1) and 'query' or 'queries', self._sql_time ) + + def title(self): + return 'SQL Queries' def url(self): return '' diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py index 98b0769..985a9d8 100644 --- a/debug_toolbar/panels/template.py +++ b/debug_toolbar/panels/template.py @@ -44,6 +44,9 @@ class TemplateDebugPanel(DebugPanel): def nav_title(self): return 'Templates' + def title(self): + return 'Template path{{ template_dirs|length|pluralize }}:' + def url(self): return '' diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py index 554d696..4ff68db 100644 --- a/debug_toolbar/panels/timer.py +++ b/debug_toolbar/panels/timer.py @@ -42,6 +42,9 @@ class TimerDebugPanel(DebugPanel): else: return 'TOTAL: %0.2fms' % (self.total_time) + def title(self): + return 'Resource Usage' + def url(self): return '' -- cgit v1.2.3 From 59874f33145722c6bb2d1fedb3d0679e6ce2caba Mon Sep 17 00:00:00 2001 From: Idan Gazit Date: Wed, 12 Aug 2009 15:07:09 +0300 Subject: Proper handling of template panel title --- debug_toolbar/panels/template.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py index 985a9d8..6eb826f 100644 --- a/debug_toolbar/panels/template.py +++ b/debug_toolbar/panels/template.py @@ -7,6 +7,7 @@ from django.dispatch import Signal from django.template.context import get_standard_processors from django.template.loader import render_to_string from django.test.signals import template_rendered +from django.template.defaultfilters import pluralize from debug_toolbar.panels import DebugPanel # Code taken and adapted from Simon Willison and Django Snippets: @@ -45,7 +46,7 @@ class TemplateDebugPanel(DebugPanel): return 'Templates' def title(self): - return 'Template path{{ template_dirs|length|pluralize }}:' + return 'Template path%s:' % pluralize(len(self.templates)) def url(self): return '' -- cgit v1.2.3 From e11bfdac25d48019377f64131b78f4462e9d005f Mon Sep 17 00:00:00 2001 From: Idan Gazit Date: Wed, 12 Aug 2009 15:18:47 +0300 Subject: oops, retitled templates panel --- debug_toolbar/panels/template.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py index 6eb826f..8c6a972 100644 --- a/debug_toolbar/panels/template.py +++ b/debug_toolbar/panels/template.py @@ -7,7 +7,6 @@ from django.dispatch import Signal from django.template.context import get_standard_processors from django.template.loader import render_to_string from django.test.signals import template_rendered -from django.template.defaultfilters import pluralize from debug_toolbar.panels import DebugPanel # Code taken and adapted from Simon Willison and Django Snippets: @@ -46,7 +45,7 @@ class TemplateDebugPanel(DebugPanel): return 'Templates' def title(self): - return 'Template path%s:' % pluralize(len(self.templates)) + return 'Templates' def url(self): return '' -- cgit v1.2.3 From 694870e5d670ff457f2ccb4395e436ed13d1ce76 Mon Sep 17 00:00:00 2001 From: Percy Perez-Pinedo Date: Tue, 25 Aug 2009 13:30:14 -0700 Subject: added spanish translation of the panels nav title --- debug_toolbar/panels/logger.py | 3 ++- debug_toolbar/panels/settings_vars.py | 4 +++- debug_toolbar/panels/signals.py | 3 ++- debug_toolbar/panels/template.py | 3 ++- debug_toolbar/panels/timer.py | 4 ++-- debug_toolbar/panels/version.py | 3 ++- 6 files changed, 13 insertions(+), 7 deletions(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/logger.py b/debug_toolbar/panels/logger.py index 7ba1686..a16b933 100644 --- a/debug_toolbar/panels/logger.py +++ b/debug_toolbar/panels/logger.py @@ -5,6 +5,7 @@ try: except ImportError: threading = None from django.template.loader import render_to_string +from django.utils.translation import ugettext_lazy as _ from debug_toolbar.panels import DebugPanel class ThreadTrackingHandler(logging.Handler): @@ -52,7 +53,7 @@ class LoggingPanel(DebugPanel): return records def nav_title(self): - return "Logging" + return _("Logging") def nav_subtitle(self): return "%s message%s" % (len(handler.get_records()), (len(handler.get_records()) == 1) and '' or 's') diff --git a/debug_toolbar/panels/settings_vars.py b/debug_toolbar/panels/settings_vars.py index 0b7c315..f30f601 100644 --- a/debug_toolbar/panels/settings_vars.py +++ b/debug_toolbar/panels/settings_vars.py @@ -1,8 +1,10 @@ from django.conf import settings from django.template.loader import render_to_string from django.views.debug import get_safe_settings +from django.utils.translation import ugettext_lazy as _ from debug_toolbar.panels import DebugPanel + class SettingsVarsDebugPanel(DebugPanel): """ A panel to display all variables in django.conf.settings @@ -11,7 +13,7 @@ class SettingsVarsDebugPanel(DebugPanel): has_content = True def nav_title(self): - return 'Settings' + return _('Settings') def title(self): return 'Settings from %s' % settings.SETTINGS_MODULE diff --git a/debug_toolbar/panels/signals.py b/debug_toolbar/panels/signals.py index a922694..56fbfd4 100644 --- a/debug_toolbar/panels/signals.py +++ b/debug_toolbar/panels/signals.py @@ -7,6 +7,7 @@ from django.db.models.signals import class_prepared, pre_init, post_init, \ pre_save, post_save, pre_delete, post_delete, post_syncdb from django.dispatch.dispatcher import WEAKREF_TYPES from django.template.loader import render_to_string +from django.utils.translation import ugettext_lazy as _ try: from django.db.backends.signals import connection_created @@ -35,7 +36,7 @@ class SignalDebugPanel(DebugPanel): } def nav_title(self): - return "Signals" + return _("Signals") def title(self): return "Signals" diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py index 8c6a972..391902f 100644 --- a/debug_toolbar/panels/template.py +++ b/debug_toolbar/panels/template.py @@ -7,6 +7,7 @@ from django.dispatch import Signal from django.template.context import get_standard_processors from django.template.loader import render_to_string from django.test.signals import template_rendered +from django.utils.translation import ugettext_lazy as _ from debug_toolbar.panels import DebugPanel # Code taken and adapted from Simon Willison and Django Snippets: @@ -42,7 +43,7 @@ class TemplateDebugPanel(DebugPanel): self.templates.append(kwargs) def nav_title(self): - return 'Templates' + return _('Templates') def title(self): return 'Templates' diff --git a/debug_toolbar/panels/timer.py b/debug_toolbar/panels/timer.py index 4ff68db..4e390f6 100644 --- a/debug_toolbar/panels/timer.py +++ b/debug_toolbar/panels/timer.py @@ -4,9 +4,9 @@ except ImportError: pass # Will fail on Win32 systems import time from django.template.loader import render_to_string +from django.utils.translation import ugettext_lazy as _ from debug_toolbar.panels import DebugPanel - class TimerDebugPanel(DebugPanel): """ Panel that displays the time a response took in milliseconds. @@ -32,7 +32,7 @@ class TimerDebugPanel(DebugPanel): self._end_rusage = resource.getrusage(resource.RUSAGE_SELF) def nav_title(self): - return 'Time' + return _('Time') def nav_subtitle(self): if self.has_resource: diff --git a/debug_toolbar/panels/version.py b/debug_toolbar/panels/version.py index 083b9cf..3d82dd0 100644 --- a/debug_toolbar/panels/version.py +++ b/debug_toolbar/panels/version.py @@ -1,4 +1,5 @@ import django +from django.utils.translation import ugettext_lazy as _ from debug_toolbar.panels import DebugPanel class VersionDebugPanel(DebugPanel): @@ -8,7 +9,7 @@ class VersionDebugPanel(DebugPanel): name = 'Version' def nav_title(self): - return 'Django Version' + return _('Django Version') def nav_subtitle(self): return django.get_version() -- cgit v1.2.3 From f97ff555a4d8f22dae83bcfd0c2dcf6e846962c9 Mon Sep 17 00:00:00 2001 From: Rob Hudson Date: Fri, 28 Aug 2009 09:21:39 -0700 Subject: Refactored SQL panel to use datetime objects and added a visual display of both duration and sequence to the SQL template. --- debug_toolbar/panels/sql.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index f12939e..62c0e58 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -1,6 +1,6 @@ import os import SocketServer -import time +from datetime import datetime import traceback import django from django.conf import settings @@ -16,6 +16,10 @@ from debug_toolbar.panels import DebugPanel django_path = os.path.realpath(os.path.dirname(django.__file__)) socketserver_path = os.path.realpath(os.path.dirname(SocketServer.__file__)) +# TODO:This should be set in the toolbar loader as a default and panels should +# get a copy of the toolbar object with access to its config dictionary +SQL_WARNING_THRESHOLD = getattr(settings, 'DEBUG_TOOLBAR_CONFIG', {}).get('SQL_WARNING_THRESHOLD', 500) + def tidy_stacktrace(strace): """ Clean up stacktrace and remove all entries that: @@ -39,11 +43,12 @@ class DatabaseStatTracker(util.CursorDebugWrapper): in `connection.queries`. """ def execute(self, sql, params=()): - start = time.time() + start = datetime.now() try: return self.cursor.execute(sql, params) finally: - stop = time.time() + stop = datetime.now() + duration = ms_from_timedelta(stop - start) stacktrace = tidy_stacktrace(traceback.extract_stack()) _params = '' try: @@ -53,11 +58,14 @@ class DatabaseStatTracker(util.CursorDebugWrapper): # We keep `sql` to maintain backwards compatibility self.db.queries.append({ 'sql': self.db.ops.last_executed_query(self.cursor, sql, params), - 'time': (stop - start) * 1000, # convert to ms + 'duration': duration, 'raw_sql': sql, 'params': _params, 'hash': sha_constructor(settings.SECRET_KEY + sql + _params).hexdigest(), 'stacktrace': stacktrace, + 'start_time': start, + 'stop_time': stop, + 'is_slow': (duration > SQL_WARNING_THRESHOLD) }) util.CursorDebugWrapper = DatabaseStatTracker @@ -77,14 +85,14 @@ class SQLDebugPanel(DebugPanel): return 'SQL' def nav_subtitle(self): - self._sql_time = sum(map(lambda q: float(q['time']), connection.queries)) + self._sql_time = sum([q['duration'] for q in connection.queries[self._offset:]]) num_queries = len(connection.queries) - self._offset return "%d %s in %.2fms" % ( num_queries, (num_queries == 1) and 'query' or 'queries', self._sql_time ) - + def title(self): return 'SQL Queries' @@ -93,8 +101,15 @@ class SQLDebugPanel(DebugPanel): def content(self): sql_queries = connection.queries[self._offset:] + width_ratio_tally = 0 for query in sql_queries: query['sql'] = reformat_sql(query['sql']) + try: + query['width_ratio'] = (query['duration'] / self._sql_time) * 100 + except ZeroDivisionError: + query['width_ratio'] = 0 + query['start_offset'] = width_ratio_tally + width_ratio_tally += query['width_ratio'] context = { 'queries': sql_queries, @@ -103,6 +118,12 @@ class SQLDebugPanel(DebugPanel): } return render_to_string('debug_toolbar/panels/sql.html', context) +def ms_from_timedelta(td): + """ + Given a timedelta object, returns a float representing milliseconds + """ + return (td.seconds * 1000) + (td.microseconds / 1000.0) + def reformat_sql(sql): sql = sql.replace(',', ', ') sql = sql.replace('SELECT ', 'SELECT\n\t') -- cgit v1.2.3 From 2c909f7d32128c29ff03da7713c3c7edfd91d785 Mon Sep 17 00:00:00 2001 From: Rob Hudson Date: Fri, 28 Aug 2009 09:22:28 -0700 Subject: Refactored `reformat_sql` to produce a more compact output for a tighter view of the SQL. --- debug_toolbar/panels/sql.py | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index 62c0e58..a53a8d4 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -20,6 +20,17 @@ socketserver_path = os.path.realpath(os.path.dirname(SocketServer.__file__)) # get a copy of the toolbar object with access to its config dictionary SQL_WARNING_THRESHOLD = getattr(settings, 'DEBUG_TOOLBAR_CONFIG', {}).get('SQL_WARNING_THRESHOLD', 500) +SQL_KEYWORDS = ( + 'SELECT', + 'FROM', + 'WHERE', + 'INNER JOIN', + 'LEFT OUTER JOIN', + 'ORDER BY', + 'HAVING', + 'GROUP BY', +) + def tidy_stacktrace(strace): """ Clean up stacktrace and remove all entries that: @@ -125,21 +136,7 @@ def ms_from_timedelta(td): return (td.seconds * 1000) + (td.microseconds / 1000.0) def reformat_sql(sql): - sql = sql.replace(',', ', ') - sql = sql.replace('SELECT ', 'SELECT\n\t') - sql = sql.replace(' FROM ', '\nFROM\n\t') - sql = sql.replace(' WHERE ', '\nWHERE\n\t') - sql = sql.replace(' INNER JOIN', '\n\tINNER JOIN') - sql = sql.replace(' LEFT OUTER JOIN' , '\n\tLEFT OUTER JOIN') - sql = sql.replace(' ORDER BY ', '\nORDER BY\n\t') - sql = sql.replace(' HAVING ', '\nHAVING\n\t') - sql = sql.replace(' GROUP BY ', '\nGROUP BY\n\t') - # Use Pygments to highlight SQL if it's available - try: - from pygments import highlight - from pygments.lexers import SqlLexer - from pygments.formatters import HtmlFormatter - sql = highlight(sql, SqlLexer(), HtmlFormatter()) - except ImportError: - pass + for kwd in SQL_KEYWORDS: + sql = sql.replace(kwd, '%s' % (kwd,)) return sql + -- cgit v1.2.3 From 20ee57b927751fd0d492c428b82f64bebdb0e860 Mon Sep 17 00:00:00 2001 From: Rob Hudson Date: Tue, 8 Sep 2009 15:26:04 -0700 Subject: Fixed an issue where the panel navigation might have a different number of queries than the panel pane if SQL queries happened in between calls. This caches the queries off in an array to be used in both places. If the possibility of queries happening elsewhere occurs, the SQL panel should probably be moved lower in the execution stack. --- debug_toolbar/panels/sql.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'debug_toolbar/panels') diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py index a53a8d4..244905b 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -91,13 +91,15 @@ class SQLDebugPanel(DebugPanel): def __init__(self): self._offset = len(connection.queries) self._sql_time = 0 + self._queries = [] def nav_title(self): return 'SQL' def nav_subtitle(self): - self._sql_time = sum([q['duration'] for q in connection.queries[self._offset:]]) - num_queries = len(connection.queries) - self._offset + self._queries = connection.queries[self._offset:] + self._sql_time = sum([q['duration'] for q in self._queries]) + num_queries = len(self._queries) return "%d %s in %.2fms" % ( num_queries, (num_queries == 1) and 'query' or 'queries', @@ -111,9 +113,8 @@ class SQLDebugPanel(DebugPanel): return '' def content(self): - sql_queries = connection.queries[self._offset:] width_ratio_tally = 0 - for query in sql_queries: + for query in self._queries: query['sql'] = reformat_sql(query['sql']) try: query['width_ratio'] = (query['duration'] / self._sql_time) * 100 @@ -123,7 +124,7 @@ class SQLDebugPanel(DebugPanel): width_ratio_tally += query['width_ratio'] context = { - 'queries': sql_queries, + 'queries': self._queries, 'sql_time': self._sql_time, 'is_mysql': settings.DATABASE_ENGINE == 'mysql', } -- cgit v1.2.3