Skip to content

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Show all signals receivers in Django project
# coding:utf-8
import gc
from sys import modules
import inspect
from optparse import make_option
import weakref
from django.core.management.base import BaseCommand
from django.dispatch import Signal, saferef
REF_TYPES = (weakref.ReferenceType, saferef.BoundMethodWeakref, saferef.BoundMethodWeakref)
FORMATS = {
'vim': '{path}:{line}:{name}',
'human': '{name} in line {line} of {path}',
}
class Command(BaseCommand):
help = 'Show all signals receivers'
option_list = BaseCommand.option_list + (
make_option('--format',
dest='line_format',
default='human',
choices=FORMATS.keys(),
help='Line format (available choices: {0})'.format(', '.join(FORMATS)),
),
)
def handle(self, *args, **options):
line_format = options['line_format']
if line_format not in FORMATS:
raise CommandError('format must be on of {0}, not {1}'.format(line_format, FORMATS.keys()))
msg = FORMATS[line_format]
signals = [obj for obj in gc.get_objects() if isinstance(obj, Signal)]
for signal in signals:
for receiver in signal.receivers:
_, receiver = receiver
# django.contrib.contenttypes.generic.GenericForeignKey.instance_pre_init is not weakref
if isinstance(receiver, REF_TYPES):
receiver = receiver()
print msg.format(name=receiver.func_name, line=inspect.getsourcelines(receiver)[1], path=inspect.getsourcefile(receiver))
@hugorodgerbrown

@voldmar - this is really helpful - thanks for posting. Is it possible to get the name of the Signal as well as the receiver function - I've tried myself but can't work out how to do it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.