aboutsummaryrefslogtreecommitdiffstats
path: root/debug_toolbar/panels
diff options
context:
space:
mode:
authorPercy Perez-Pinedo2009-07-20 15:46:57 -0700
committerPercy Perez-Pinedo2009-07-20 15:46:57 -0700
commitb7629d5768295131c35d613dbb16d9a070474c77 (patch)
treef7557bdc972287765a0bb687c2fecf04ddd0718f /debug_toolbar/panels
parent073ab2c8255ebc310a54e9f937b4b17f94f7eac2 (diff)
parent4dc0710b6a5eedec0448909f6b90e55a4f3555d4 (diff)
downloaddjango-debug-toolbar-b7629d5768295131c35d613dbb16d9a070474c77.tar.bz2
removing trans so we can merge for now
Diffstat (limited to 'debug_toolbar/panels')
-rw-r--r--debug_toolbar/panels/signals.py79
-rw-r--r--debug_toolbar/panels/sql.py39
-rw-r--r--debug_toolbar/panels/template.py12
3 files changed, 121 insertions, 9 deletions
diff --git a/debug_toolbar/panels/signals.py b/debug_toolbar/panels/signals.py
new file mode 100644
index 0000000..7fe382e
--- /dev/null
+++ b/debug_toolbar/panels/signals.py
@@ -0,0 +1,79 @@
+import sys
+
+from django.conf import settings
+from django.core.signals import request_started, request_finished, \
+ got_request_exception
+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
+
+try:
+ from django.db.backends.signals import connection_created
+except ImportError:
+ connection_created = None
+
+from debug_toolbar.panels import DebugPanel
+
+class SignalDebugPanel(DebugPanel):
+ name = "Signals"
+ has_content = True
+
+ SIGNALS = {
+ 'request_started': request_started,
+ 'request_finished': request_finished,
+ 'got_request_exception': got_request_exception,
+ 'connection_created': connection_created,
+ 'class_prepared': class_prepared,
+ 'pre_init': pre_init,
+ 'post_init': post_init,
+ 'pre_save': pre_save,
+ 'post_save': post_save,
+ 'pre_delete': pre_delete,
+ 'post_delete': post_delete,
+ 'post_syncdb': post_syncdb,
+ }
+
+ def title(self):
+ return "Signals"
+
+ def url(self):
+ return ''
+
+ def signals(self):
+ signals = self.SIGNALS.copy()
+ if hasattr(settings, 'DEBUG_TOOLBAR_CONFIG'):
+ extra_signals = settings.DEBUG_TOOLBAR_CONFIG.get('EXTRA_SIGNALS', [])
+ else:
+ extra_signals = []
+ for signal in extra_signals:
+ parts = signal.split('.')
+ path = '.'.join(parts[:-1])
+ __import__(path)
+ signals[parts[-1]] = getattr(sys.modules[path], parts[-1])
+ return signals
+ signals = property(signals)
+
+ def content(self):
+ signals = []
+ keys = self.signals.keys()
+ keys.sort()
+ for name in keys:
+ signal = self.signals[name]
+ if signal is None:
+ continue
+ receivers = []
+ for (receiverkey, r_senderkey), receiver in signal.receivers:
+ if isinstance(receiver, WEAKREF_TYPES):
+ receiver = receiver()
+ if receiver is None:
+ continue
+ if getattr(receiver, 'im_self', None) is not None:
+ text = "method %s on %s object" % (receiver.__name__, receiver.im_self.__class__.__name__)
+ elif getattr(receiver, 'im_class', None) is not None:
+ text = "method %s on %s" % (receiver.__name__, receiver.im_class.__name__)
+ else:
+ text = "function %s" % receiver.__name__
+ receivers.append(text)
+ signals.append((name, signal, receivers))
+ return render_to_string('debug_toolbar/panels/signals.html', {'signals': signals})
diff --git a/debug_toolbar/panels/sql.py b/debug_toolbar/panels/sql.py
index 7396c3a..d3ac7f3 100644
--- a/debug_toolbar/panels/sql.py
+++ b/debug_toolbar/panels/sql.py
@@ -1,5 +1,8 @@
+import os
+import SocketServer
import time
-from debug_toolbar.panels import DebugPanel
+import traceback
+import django
from django.conf import settings
from django.db import connection
from django.db.backends import util
@@ -7,6 +10,28 @@ from django.template.loader import render_to_string
from django.utils import simplejson
from django.utils.encoding import force_unicode
from django.utils.hashcompat import sha_constructor
+from debug_toolbar.panels import DebugPanel
+
+# Figure out some paths
+django_path = os.path.realpath(os.path.dirname(django.__file__))
+socketserver_path = os.path.realpath(os.path.dirname(SocketServer.__file__))
+
+def tidy_stacktrace(strace):
+ """
+ Clean up stacktrace and remove all entries that:
+ 1. Are part of Django (except contrib apps)
+ 2. Are part of SocketServer (used by Django's dev server)
+ 3. Are the last entry (which is part of our stacktracing code)
+ """
+ trace = []
+ for s in strace[:-1]:
+ s_path = os.path.realpath(s[0])
+ if django_path in s_path and not 'django/contrib' in s_path:
+ continue
+ if socketserver_path in s_path:
+ continue
+ trace.append((s[0], s[1], s[2], s[3]))
+ return trace
class DatabaseStatTracker(util.CursorDebugWrapper):
"""
@@ -19,6 +44,7 @@ class DatabaseStatTracker(util.CursorDebugWrapper):
return self.cursor.execute(sql, params)
finally:
stop = time.time()
+ stacktrace = tidy_stacktrace(traceback.extract_stack())
_params = ''
try:
_params = simplejson.dumps([force_unicode(x) for x in params])
@@ -31,6 +57,7 @@ class DatabaseStatTracker(util.CursorDebugWrapper):
'raw_sql': sql,
'params': _params,
'hash': sha_constructor(settings.SECRET_KEY + sql + _params).hexdigest(),
+ 'stacktrace': stacktrace,
})
util.CursorDebugWrapper = DatabaseStatTracker
@@ -71,13 +98,15 @@ class SQLDebugPanel(DebugPanel):
return render_to_string('debug_toolbar/panels/sql.html', context)
def reformat_sql(sql):
- sql = sql.replace('`,`', '`, `')
+ sql = sql.replace(',', ', ')
sql = sql.replace('SELECT ', 'SELECT\n\t')
- sql = sql.replace('` FROM ', '`\nFROM\n\t')
+ sql = sql.replace(' FROM ', '\nFROM\n\t')
sql = sql.replace(' WHERE ', '\nWHERE\n\t')
- sql = sql.replace(' INNER JOIN ', '\nINNER JOIN\n\t')
- sql = sql.replace(' LEFT OUTER JOIN ', '\nLEFT OUTER JOIN\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
diff --git a/debug_toolbar/panels/template.py b/debug_toolbar/panels/template.py
index fa85cb8..7dc7b06 100644
--- a/debug_toolbar/panels/template.py
+++ b/debug_toolbar/panels/template.py
@@ -48,11 +48,15 @@ class TemplateDebugPanel(DebugPanel):
return ''
def process_request(self, request):
- self.context_processors = dict(
- [("%s.%s" % (k.__module__, k.__name__), pformat(k(request))) for k in get_standard_processors()]
- )
+ self.request = request
def content(self):
+ context_processors = dict(
+ [
+ ("%s.%s" % (k.__module__, k.__name__),
+ pformat(k(self.request))) for k in get_standard_processors()
+ ]
+ )
template_context = []
for i, d in enumerate(self.templates):
info = {}
@@ -73,6 +77,6 @@ class TemplateDebugPanel(DebugPanel):
context = {
'templates': template_context,
'template_dirs': [normpath(x) for x in settings.TEMPLATE_DIRS],
- 'context_processors': self.context_processors,
+ 'context_processors': context_processors,
}
return render_to_string('debug_toolbar/panels/templates.html', context)