annotate gpp/news/utils.py @ 467:b910cc1460c8

Add the ability to conditionally add model instances to the search index on update. This is not perfect, as some instances should be deleted from the index if they are updated such that they should not be in the index anymore. Will think about and address that later.
author Brian Neal <bgneal@gmail.com>
date Sun, 24 Jul 2011 18:12:20 +0000
parents 24f1230f3ee3
children
rev   line source
bgneal@399 1 """
bgneal@399 2 Common utility/helper code for the news app.
bgneal@399 3
bgneal@399 4 """
bgneal@399 5 from django.contrib.contenttypes.models import ContentType
bgneal@399 6
bgneal@399 7 from comments.models import Comment
bgneal@399 8 from tagging.models import TaggedItem
bgneal@399 9 from news.models import Story
bgneal@399 10
bgneal@399 11
bgneal@399 12 def attach_extra_attrs(stories):
bgneal@399 13 """
bgneal@399 14 For each story in the input stories list, attach 2 new attributes:
bgneal@399 15 tag_list and comment_count. The tags and comment count info is pulled from
bgneal@399 16 the database in bulk. This saves database queries when lots of news
bgneal@399 17 stories are displayed at once. For best results, use ".defer('tags')"
bgneal@399 18 when retrieve the stories from the database.
bgneal@399 19
bgneal@399 20 """
bgneal@399 21 stories_dict = dict((story.id, story) for story in stories)
bgneal@399 22 story_ids = stories_dict.keys()
bgneal@399 23
bgneal@399 24 # Get all the tags out in one query
bgneal@399 25 ct = ContentType.objects.get_for_model(Story)
bgneal@399 26 tagged_items = TaggedItem.objects.filter(content_type=ct,
bgneal@399 27 object_id__in=story_ids).select_related('tag')
bgneal@399 28
bgneal@399 29 for story in stories_dict.values():
bgneal@399 30 story.tag_list = []
bgneal@399 31 story.comment_count = 0
bgneal@399 32
bgneal@399 33 # attach tags
bgneal@399 34 for item in tagged_items:
bgneal@399 35 stories_dict[item.object_id].tag_list.append(item.tag.name)
bgneal@399 36
bgneal@399 37 # Now get all the comment counts out in one fell swoop
bgneal@399 38
bgneal@399 39 story_ids = Comment.objects.filter(content_type=ct,
bgneal@399 40 object_id__in=story_ids).values_list('object_id', flat=True)
bgneal@399 41
bgneal@399 42 # compute comment_count
bgneal@399 43 for story_id in story_ids:
bgneal@399 44 stories_dict[story_id].comment_count += 1