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