changeset 203:40e5903903e1

Should have added signals.py in r203.
author Brian Neal <bgneal@gmail.com>
date Wed, 28 Apr 2010 03:00:31 +0000
parents 7aa061ed387c
children b4305e18d3af
files gpp/downloads/signals.py
diffstat 1 files changed, 41 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gpp/downloads/signals.py	Wed Apr 28 03:00:31 2010 +0000
@@ -0,0 +1,41 @@
+"""Signals for the downloads application.
+We use signals to compute the denormalized category counts whenever a download
+is saved."""
+from django.db.models.signals import post_save
+from django.db.models.signals import post_delete
+
+from downloads.models import Category, Download
+
+
+def on_download_save(sender, **kwargs):
+    """This function updates the count field for all categories.
+    It is called whenever a download is saved via a signal.
+    """
+    if kwargs['created']:
+        # we only have to update the parent category
+        download = kwargs['instance']
+        cat = download.category
+        cat.count = Download.public_objects.filter(category=cat).count()
+        cat.save()
+    else:
+        # update all categories just to be safe (an existing download could
+        # have been moved from one category to another
+        cats = Category.objects.all()
+        for cat in cats:
+            cat.count = Download.public_objects.filter(category=cat).count()
+            cat.save()
+
+
+def on_download_delete(sender, **kwargs):
+    """This function updates the count field for the download's parent
+    category. It is called when a download is deleted via a signal.
+    """
+    # update the parent category
+    download = kwargs['instance']
+    cat = download.category
+    cat.count = Download.public_objects.filter(category=cat).count()
+    cat.save()
+
+
+post_save.connect(on_download_save, sender=Download)
+post_delete.connect(on_download_delete, sender=Download)