annotate news/utils.py @ 887:9a15f7c27526

Actually save model object upon change. This commit was tested on the comments model. Additional logging added. Added check for Markdown image references. Added TODOs after observing behavior on comments.
author Brian Neal <bgneal@gmail.com>
date Tue, 03 Feb 2015 21:09:44 -0600
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