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@1001
|
31 if story.version == 0:
|
bgneal@1001
|
32 story.comment_count = 0
|
bgneal@1001
|
33 elif story.forums_topic:
|
bgneal@1001
|
34 # for convenience/consistency with old models...
|
bgneal@1001
|
35 story.comment_count = story.forums_comment_count()
|
bgneal@399
|
36
|
bgneal@399
|
37 # attach tags
|
bgneal@399
|
38 for item in tagged_items:
|
bgneal@399
|
39 stories_dict[item.object_id].tag_list.append(item.tag.name)
|
bgneal@399
|
40
|
bgneal@1001
|
41 # Now get all the comment counts out in one fell swoop. This is only needed
|
bgneal@1001
|
42 # for older news stories...
|
bgneal@399
|
43
|
bgneal@1001
|
44 story_ids = [pk for pk in story_ids if stories_dict[pk].version == 0]
|
bgneal@399
|
45
|
bgneal@1001
|
46 if story_ids:
|
bgneal@1001
|
47 story_ids = Comment.objects.filter(content_type=ct,
|
bgneal@1001
|
48 object_id__in=story_ids).values_list('object_id', flat=True)
|
bgneal@1001
|
49
|
bgneal@1001
|
50 # compute comment_count
|
bgneal@1001
|
51 for story_id in story_ids:
|
bgneal@1001
|
52 stories_dict[story_id].comment_count += 1
|