annotate news/utils.py @ 989:2908859c2fe4

Smilies now use relative links. This is for upcoming switch to SSL. Currently we do not need absolute URLs for smilies. If this changes we can add it later.
author Brian Neal <bgneal@gmail.com>
date Thu, 29 Oct 2015 20:54:34 -0500
parents ee87ea74d46b
children c6c3ba5cf6eb
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