Back to Django Extensions

Command Signals

docs/command_signals.rst

4.12.9 KB
Original Source

Command Signals

: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.

Basic Example

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 list and view permissions to each model. You could do this by adding them to the permissions tuple inside your models 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)

Each time 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):
  ...
  ...