|synopsis:||Signals fired before and after a command is executed.|
A signal is thrown pre/post each management command allowing your application to hook into each commands execution.
An example hooking into show_template_tags:
from django_extensions.management.signals import pre_command, post_command from django_extensions.management.commands.show_template_tags import Command def pre_receiver(sender, args, kwargs): # I'm executed prior to the management command def post_receiver(sender, args, kwargs, outcome): # I'm executed after the management command pre_command.connect(pre_receiver, Command) post_command.connect(post_receiver, Command)
Custom Permissions For All Models¶
You can use the post signal to hook into the
update_permissions command so that
you can add your own permissions to each model.
For instance, lets say you want to add
view permissions to
each model. You could do this by adding them to the
permissions tuple inside
Meta class but this gets pretty tedious.
An easier solution is to hook into the
update_permissions call, as follows;
from django.db.models.signals import post_syncdb from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import Permission from django_extensions.management.signals import post_command from django_extensions.management.commands.update_permissions import Command as UpdatePermissionsCommand def add_permissions(sender, **kwargs): """ Add view and list permissions to all content types. """ # for each of our content types for content_type in ContentType.objects.all(): for action in ['view', 'list']: # build our permission slug codename = "%s_%s" % (action, content_type.model) try: Permission.objects.get(content_type=content_type, codename=codename) # Already exists, ignore except Permission.DoesNotExist: # Doesn't exist, add it Permission.objects.create(content_type=content_type, codename=codename, name="Can %s %s" % (action, content_type.name)) print "Added %s permission for %s" % (action, content_type.name) post_command.connect(add_permissions, UpdatePermissionsCommand)
update_permissions is called
add_permissions will be called which
ensures there are view and list permissions to all content types.
Using pre/post signals on your own commands¶
The signals are implemented using a decorator on the handle method of a management command, thus using this functionality in your own application is trivial:
from django_extensions.management.utils import signalcommand class Command(BaseCommand): @signalcommand def handle(self, *args, **kwargs): ... ...