annotate downloads/signals.py @ 697:67f8d49a9377

Cleaned up the code a bit. Separated the S3 stuff out into its own class. This class maybe should be in core. Still want to do some kind of context manager around the temporary file we are creating to ensure it gets deleted.
author Brian Neal <bgneal@gmail.com>
date Sun, 08 Sep 2013 21:02:58 -0500
parents 929d0e637a37
children
rev   line source
bgneal@203 1 """Signals for the downloads application.
bgneal@203 2 We use signals to compute the denormalized category counts whenever a download
bgneal@203 3 is saved."""
bgneal@203 4 from django.db.models.signals import post_save
bgneal@203 5 from django.db.models.signals import post_delete
bgneal@203 6
bgneal@664 7 from downloads.models import Category, Download, PendingDownload
bgneal@203 8
bgneal@203 9
bgneal@203 10 def on_download_save(sender, **kwargs):
bgneal@203 11 """This function updates the count field for all categories.
bgneal@203 12 It is called whenever a download is saved via a signal.
bgneal@203 13 """
bgneal@203 14 if kwargs['created']:
bgneal@203 15 # we only have to update the parent category
bgneal@203 16 download = kwargs['instance']
bgneal@203 17 cat = download.category
bgneal@203 18 cat.count = Download.public_objects.filter(category=cat).count()
bgneal@203 19 cat.save()
bgneal@203 20 else:
bgneal@203 21 # update all categories just to be safe (an existing download could
bgneal@203 22 # have been moved from one category to another
bgneal@203 23 cats = Category.objects.all()
bgneal@203 24 for cat in cats:
bgneal@203 25 cat.count = Download.public_objects.filter(category=cat).count()
bgneal@203 26 cat.save()
bgneal@203 27
bgneal@203 28
bgneal@203 29 def on_download_delete(sender, **kwargs):
bgneal@203 30 """This function updates the count field for the download's parent
bgneal@203 31 category. It is called when a download is deleted via a signal.
bgneal@664 32
bgneal@664 33 We now delete the uploaded file when the download is deleted.
bgneal@203 34 """
bgneal@203 35 # update the parent category
bgneal@203 36 download = kwargs['instance']
bgneal@203 37 cat = download.category
bgneal@203 38 cat.count = Download.public_objects.filter(category=cat).count()
bgneal@203 39 cat.save()
bgneal@203 40
bgneal@664 41 # delete the actual file
bgneal@664 42 if download.file:
bgneal@664 43 download.file.delete(save=False)
bgneal@664 44
bgneal@664 45
bgneal@664 46 def on_pending_download_delete(sender, **kwargs):
bgneal@664 47 """Delete the uploaded file if it exists."""
bgneal@664 48
bgneal@664 49 download = kwargs['instance']
bgneal@664 50 # delete the actual file
bgneal@664 51 if download.file:
bgneal@664 52 download.file.delete(save=False)
bgneal@664 53
bgneal@203 54
bgneal@260 55 post_save.connect(on_download_save, sender=Download,
bgneal@260 56 dispatch_uid='downloads.signals')
bgneal@260 57 post_delete.connect(on_download_delete, sender=Download,
bgneal@260 58 dispatch_uid='downloads.signals')
bgneal@664 59 post_delete.connect(on_pending_download_delete, sender=PendingDownload,
bgneal@664 60 dispatch_uid='downloads.signals')