From 1956ee540c75f9d4226f0352df5b06aae5c02703 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Wed, 27 May 2009 19:17:24 -0700 Subject: Adding a signals panel to display list of signals and their providing arguments and receivers. Thanks Alex Gaynor! Signed-off-by: Rob Hudson --- debug_toolbar/panels/signals.py | 73 ++++++++++++++++++++++ debug_toolbar/panels/sql.py | 2 +- .../templates/debug_toolbar/panels/signals.html | 19 ++++++ debug_toolbar/toolbar/loader.py | 1 + 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 debug_toolbar/panels/signals.py create mode 100644 debug_toolbar/templates/debug_toolbar/panels/signals.html (limited to 'debug_toolbar') diff --git a/debug_toolbar/panels/signals.py b/debug_toolbar/panels/signals.py new file mode 100644 index 0000000..0a75282 --- /dev/null +++ b/debug_toolbar/panels/signals.py @@ -0,0 +1,73 @@ +import sys + +from django.conf import settings +from django.core.signals import request_started, request_finished, \ + got_request_exception +from django.db.backends.signals import connection_created +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 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] + 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 8934fb3..d3ac7f3 100644 --- a/debug_toolbar/panels/sql.py +++ b/debug_toolbar/panels/sql.py @@ -98,7 +98,7 @@ 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(' WHERE ', '\nWHERE\n\t') diff --git a/debug_toolbar/templates/debug_toolbar/panels/signals.html b/debug_toolbar/templates/debug_toolbar/panels/signals.html new file mode 100644 index 0000000..e9a189e --- /dev/null +++ b/debug_toolbar/templates/debug_toolbar/panels/signals.html @@ -0,0 +1,19 @@ +

Signals

+ + + + + + + + + + {% for name, signal, receivers in signals %} + + + + + + {% endfor %} + +
SignalProviding ArgsReceivers
{{ name|escape }}{{ signal.providing_args|join:", " }}{{ receivers|join:", " }}
diff --git a/debug_toolbar/toolbar/loader.py b/debug_toolbar/toolbar/loader.py index 39fb4c6..c7f999e 100644 --- a/debug_toolbar/toolbar/loader.py +++ b/debug_toolbar/toolbar/loader.py @@ -21,6 +21,7 @@ class DebugToolbar(object): 'debug_toolbar.panels.sql.SQLDebugPanel', 'debug_toolbar.panels.template.TemplateDebugPanel', #'debug_toolbar.panels.cache.CacheDebugPanel', + 'debug_toolbar.panels.signals.SignalDebugPanel', 'debug_toolbar.panels.logger.LoggingPanel', ) self.load_panels() -- cgit v1.2.3