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