bgneal@921
|
1 """Signal handlers for the weblinks application.
|
bgneal@921
|
2
|
bgneal@202
|
3 We use signals to compute the denormalized category counts whenever a weblink
|
bgneal@921
|
4 is saved.
|
bgneal@921
|
5 """
|
bgneal@202
|
6 from django.db.models.signals import post_save
|
bgneal@202
|
7 from django.db.models.signals import post_delete
|
bgneal@202
|
8
|
bgneal@202
|
9 from weblinks.models import Category, Link
|
bgneal@202
|
10
|
bgneal@202
|
11
|
bgneal@202
|
12 def on_link_save(sender, **kwargs):
|
bgneal@202
|
13 """This function updates the count field for all categories.
|
bgneal@202
|
14 It is called whenever a link is saved via a signal.
|
bgneal@202
|
15 """
|
bgneal@202
|
16 if kwargs['created']:
|
bgneal@202
|
17 # we only have to update the parent category
|
bgneal@202
|
18 link = kwargs['instance']
|
bgneal@202
|
19 cat = link.category
|
bgneal@202
|
20 cat.count = Link.public_objects.filter(category=cat).count()
|
bgneal@202
|
21 cat.save()
|
bgneal@202
|
22 else:
|
bgneal@202
|
23 # update all categories just to be safe (an existing link could
|
bgneal@202
|
24 # have been moved from one category to another
|
bgneal@202
|
25 cats = Category.objects.all()
|
bgneal@202
|
26 for cat in cats:
|
bgneal@202
|
27 cat.count = Link.public_objects.filter(category=cat).count()
|
bgneal@202
|
28 cat.save()
|
bgneal@202
|
29
|
bgneal@202
|
30
|
bgneal@202
|
31 def on_link_delete(sender, **kwargs):
|
bgneal@202
|
32 """This function updates the count field for the link's parent
|
bgneal@202
|
33 category. It is called when a link is deleted via a signal.
|
bgneal@202
|
34 """
|
bgneal@202
|
35 # update the parent category
|
bgneal@202
|
36 link = kwargs['instance']
|
bgneal@202
|
37 cat = link.category
|
bgneal@202
|
38 cat.count = Link.public_objects.filter(category=cat).count()
|
bgneal@202
|
39 cat.save()
|
bgneal@202
|
40
|
bgneal@202
|
41
|
bgneal@921
|
42 post_save.connect(on_link_save, sender=Link, dispatch_uid='weblinks.receivers')
|
bgneal@921
|
43 post_delete.connect(on_link_delete, sender=Link, dispatch_uid='weblinks.receivers')
|