view downloads/receivers.py @ 943:cf9918328c64

Haystack tweaks for Django 1.7.7. I had to upgrade to Haystack 2.3.1 to get it to work with Django 1.7.7. I also had to update the Xapian backend. But I ran into problems. On my laptop anyway (Ubuntu 14.0.4), xapian gets mad when search terms are greater than 245 chars (or something) when indexing. So I created a custom field that would simply omit terms greater than 64 chars and used this field everywhere I previously used a CharField. Secondly, the custom search form was broken now. Something changed in the Xapian backend and exact searches stopped working. Fortunately the auto_query (which I was using originally and broke during an upgrade) started working again. So I cut the search form back over to doing an auto_query. I kept the form the same (3 fields) because I didn't want to change the form and I think it's better that way.
author Brian Neal <bgneal@gmail.com>
date Wed, 13 May 2015 20:25:07 -0500
parents 1a832625c047
children
line wrap: on
line source
"""Signal handlers 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, PendingDownload


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.

    We now delete the uploaded file when the download is deleted.
    """
    # update the parent category
    download = kwargs['instance']
    cat = download.category
    cat.count = Download.public_objects.filter(category=cat).count()
    cat.save()

    # delete the actual file
    if download.file:
        download.file.delete(save=False)


def on_pending_download_delete(sender, **kwargs):
    """Delete the uploaded file if it exists."""

    download = kwargs['instance']
    # delete the actual file
    if download.file:
        download.file.delete(save=False)


post_save.connect(on_download_save, sender=Download,
        dispatch_uid='downloads.receivers')
post_delete.connect(on_download_delete, sender=Download,
        dispatch_uid='downloads.receivers')
post_delete.connect(on_pending_download_delete, sender=PendingDownload,
        dispatch_uid='downloads.receivers')