annotate gpp/forums/feeds.py @ 318:c550933ff5b6

Fix a bug where you'd get an error when trying to delete a forum thread (topic does not exist). Apparently when you call topic.delete() the posts would get deleted, but the signal handler for each one would run, and it would try to update the topic's post count or something, but the topic was gone? Reworked the code a bit and explicitly delete the posts first. I also added a sync() call on the parent forum since post counts were not getting adjusted.
author Brian Neal <bgneal@gmail.com>
date Sat, 05 Feb 2011 21:46:52 +0000
parents 9b63ad1f2ad2
children 2a03c69792d8
rev   line source
bgneal@170 1 """This file contains the feed class for the forums application."""
bgneal@170 2
bgneal@176 3 from django.contrib.syndication.views import Feed
bgneal@170 4 from django.core.exceptions import ObjectDoesNotExist
bgneal@176 5 from django.shortcuts import get_object_or_404
bgneal@170 6
bgneal@170 7 from forums.models import Forum
bgneal@170 8 from forums.models import Post
bgneal@176 9 from core.functions import copyright_str
bgneal@170 10
bgneal@170 11
bgneal@170 12 class ForumsFeed(Feed):
bgneal@176 13 """The Feed class for a specific forum"""
bgneal@170 14
bgneal@176 15 ttl = '720'
bgneal@176 16 author_name = 'Brian Neal'
bgneal@176 17 author_email = 'admin@surfguitar101.com'
bgneal@176 18
bgneal@176 19 def get_object(self, request, forum_slug):
bgneal@170 20 # only return public forums
bgneal@176 21 if forum_slug:
bgneal@176 22 forum = get_object_or_404(Forum, slug=forum_slug)
bgneal@170 23 if forum.category.groups.count() > 0:
bgneal@170 24 raise ObjectDoesNotExist
bgneal@170 25 return forum
bgneal@170 26
bgneal@176 27 else:
bgneal@170 28 # return None to indicate we want a combined feed
bgneal@170 29 return None
bgneal@170 30
bgneal@170 31 def title(self, obj):
bgneal@170 32 if obj is None:
bgneal@170 33 forum_name = 'Combined'
bgneal@170 34 else:
bgneal@170 35 forum_name = obj.name
bgneal@170 36
bgneal@170 37 return 'SurfGuitar101.com %s Forum Feed' % forum_name
bgneal@170 38
bgneal@170 39 def link(self, obj):
bgneal@170 40 if obj is None:
bgneal@170 41 bits = ''
bgneal@170 42 else:
bgneal@170 43 bits = obj.slug + '/'
bgneal@170 44
bgneal@170 45 return '/feeds/forums/' + bits
bgneal@170 46
bgneal@170 47 def description(self, obj):
bgneal@170 48 if obj is None:
bgneal@170 49 return "User posts to SurfGuitar101.com forums."
bgneal@170 50 return obj.description
bgneal@170 51
bgneal@176 52 def feed_copyright(self):
bgneal@176 53 return copyright_str()
bgneal@170 54
bgneal@170 55 def items(self, obj):
bgneal@170 56 if obj is None:
bgneal@170 57 # return a combined feed of public forum threads
bgneal@170 58 items = Post.objects.filter(
bgneal@170 59 topic__forum__in=Forum.objects.public_forums())
bgneal@170 60 else:
bgneal@170 61 items = Post.objects.filter(topic__forum__id=obj.id)
bgneal@170 62 return items.order_by('-creation_date').select_related()[:10]
bgneal@170 63
bgneal@176 64 def item_title(self, item):
bgneal@176 65 return item.topic.name
bgneal@176 66
bgneal@176 67 def item_description(self, item):
bgneal@176 68 return item.html
bgneal@176 69
bgneal@176 70 def item_author_name(self, item):
bgneal@176 71 return item.user.username
bgneal@176 72
bgneal@170 73 def item_pubdate(self, item):
bgneal@170 74 return item.creation_date
bgneal@170 75
bgneal@170 76 def item_categories(self, item):
bgneal@170 77 return (item.topic.forum.name, )