bgneal@203: """Signals for the downloads application.
bgneal@203: We use signals to compute the denormalized category counts whenever a download
bgneal@203: is saved."""
bgneal@203: from django.db.models.signals import post_save
bgneal@203: from django.db.models.signals import post_delete
bgneal@203: 
bgneal@203: from downloads.models import Category, Download
bgneal@203: 
bgneal@203: 
bgneal@203: def on_download_save(sender, **kwargs):
bgneal@203:     """This function updates the count field for all categories.
bgneal@203:     It is called whenever a download is saved via a signal.
bgneal@203:     """
bgneal@203:     if kwargs['created']:
bgneal@203:         # we only have to update the parent category
bgneal@203:         download = kwargs['instance']
bgneal@203:         cat = download.category
bgneal@203:         cat.count = Download.public_objects.filter(category=cat).count()
bgneal@203:         cat.save()
bgneal@203:     else:
bgneal@203:         # update all categories just to be safe (an existing download could
bgneal@203:         # have been moved from one category to another
bgneal@203:         cats = Category.objects.all()
bgneal@203:         for cat in cats:
bgneal@203:             cat.count = Download.public_objects.filter(category=cat).count()
bgneal@203:             cat.save()
bgneal@203: 
bgneal@203: 
bgneal@203: def on_download_delete(sender, **kwargs):
bgneal@203:     """This function updates the count field for the download's parent
bgneal@203:     category. It is called when a download is deleted via a signal.
bgneal@203:     """
bgneal@203:     # update the parent category
bgneal@203:     download = kwargs['instance']
bgneal@203:     cat = download.category
bgneal@203:     cat.count = Download.public_objects.filter(category=cat).count()
bgneal@203:     cat.save()
bgneal@203: 
bgneal@203: 
bgneal@260: post_save.connect(on_download_save, sender=Download,
bgneal@260:         dispatch_uid='downloads.signals')
bgneal@260: post_delete.connect(on_download_delete, sender=Download,
bgneal@260:         dispatch_uid='downloads.signals')