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_templatetags:
from django_extensions.management.signals import pre_command, post_command
from django_extensions.management.commands.show_templatetags 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)
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.
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):
...
...