diff options
| author | Percy Perez-Pinedo | 2009-07-20 15:46:57 -0700 |
|---|---|---|
| committer | Percy Perez-Pinedo | 2009-07-20 15:46:57 -0700 |
| commit | b7629d5768295131c35d613dbb16d9a070474c77 (patch) | |
| tree | f7557bdc972287765a0bb687c2fecf04ddd0718f /debug_toolbar/panels | |
| parent | 073ab2c8255ebc310a54e9f937b4b17f94f7eac2 (diff) | |
| parent | 4dc0710b6a5eedec0448909f6b90e55a4f3555d4 (diff) | |
| download | django-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.py | 79 | ||||
| -rw-r--r-- | debug_toolbar/panels/sql.py | 39 | ||||
| -rw-r--r-- | debug_toolbar/panels/template.py | 12 |
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) |
