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
|