diff options
Diffstat (limited to 'debug_toolbar/panels/signals.py')
| -rw-r--r-- | debug_toolbar/panels/signals.py | 73 | 
1 files changed, 73 insertions, 0 deletions
| 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}) | 
