-#!/usr/bin/env python
-#encoding:utf-8
-#-------------------------------------------------------------------------------
-# Name: Syndication feed class for subsribtion
-# Purpose:
-#
-# Author: Mike
-#
-# Created: 29/01/2009
-# Copyright: (c) CNPROG.COM 2009
-# Licence: GPL V2
-#-------------------------------------------------------------------------------
-from django.contrib.syndication.feeds import Feed, FeedDoesNotExist
+# -*- coding: utf-8 -*-
+
+try:
+ from django.contrib.syndication.views import Feed, FeedDoesNotExist, add_domain
+ old_version = False
+except:
+ from django.contrib.syndication.feeds import Feed, FeedDoesNotExist, add_domain
+ old_version = True
+
+from django.http import HttpResponse
+from django.utils.encoding import smart_unicode
from django.utils.translation import ugettext as _
+from django.utils.safestring import mark_safe
from models import Question
-from django.conf import settings
-class RssLastestQuestionsFeed(Feed):
- title = str(settings.APP_TITLE) + _(' - ')+ _('latest questions')
- link = settings.APP_URL #+ '/' + _('question/')
- description = settings.APP_DESCRIPTION
- #ttl = 10
- copyright = settings.APP_COPYRIGHT
+from forum import settings
+from forum.modules import decorate
+from forum.utils.pagination import generate_uri
+
+@decorate(add_domain, needs_origin=False)
+def add_domain(domain, url, *args, **kwargs):
+ return "%s%s" % (settings.APP_BASE_URL, url)
+
+class BaseNodeFeed(Feed):
+ if old_version:
+ title_template = "feeds/rss_title.html"
+ description_template = "feeds/rss_description.html"
+
+ def __init__(self, request, title, description, url):
+ self._title = u"%s" % smart_unicode(title)
+ self._description = mark_safe(u"%s" % smart_unicode(description))
+ self._url = url
+
+ if old_version:
+ super(BaseNodeFeed, self).__init__('', request)
+
+ def title(self):
+ return u"%s" % smart_unicode(self._title)
+
+ def link(self):
+ return self._url
+
+ def description(self):
+ return u"%s" % smart_unicode(self._description)
+
+ def item_title(self, item):
+ return u"%s" % smart_unicode(item.title)
+
+ def item_description(self, item):
+ return u"%s" % smart_unicode(item.html)
def item_link(self, item):
- return self.link + item.get_absolute_url()
+ return item.leaf.get_absolute_url()
def item_author_name(self, item):
- return item.author.username
+ return u"%s" % smart_unicode(item.author.username)
def item_author_link(self, item):
return item.author.get_profile_url()
def item_pubdate(self, item):
return item.added_at
- def items(self, item):
- return Question.objects.filter(deleted=False).order_by('-last_activity_at')[:30]
+ if old_version:
+ def __call__(self, request):
+ feedgen = self.get_feed('')
+ response = HttpResponse(mimetype=feedgen.mime_type)
+ feedgen.write(response, 'utf-8')
+ return response
+
+
+class RssQuestionFeed(BaseNodeFeed):
+ def __init__(self, request, question_list, title, description):
+ url = request.path + "?" + generate_uri(request.GET, (_('page'), _('pagesize'), _('sort')))
+ super(RssQuestionFeed, self).__init__(request, title, description, url)
+
+ self._question_list = question_list
+
+ def item_categories(self, item):
+ return item.tagname_list()
+
+ def _items(self):
+ return self._question_list
+
+ def items(self):
+ return self._items()[:30]
+
+class RssAnswerFeed(BaseNodeFeed):
+ if old_version:
+ title_template = "feeds/rss_answer_title.html"
+
+ def __init__(self, request, question, include_comments=False):
+ super(RssAnswerFeed, self).__init__(
+ request, _("Answers to: %s") % smart_unicode(question.title),
+ question.html,
+ question.get_absolute_url()
+ )
+ self._question = question
+ self._include_comments = include_comments
+
+ def _items(self):
+ if self._include_comments:
+ qs = self._question.all_children
+ else:
+ qs = self._question.answers
+
+ return qs.filter_state(deleted=False).order_by('-added_at')
-def main():
- pass
+ def items(self):
+ return self._items()[:30]
-if __name__ == '__main__':
- main()
+ def item_title(self, item):
+ if item.node_type == "answer":
+ return _("Answer by %s") % smart_unicode(item.author.username)
+ else:
+ return _("Comment by %(cauthor)s on %(pauthor)s's %(qora)s") % dict(
+ cauthor=smart_unicode(item.author.username),
+ pauthor=smart_unicode(item.parent.author.username),
+ qora=(item.parent.node_type == "answer" and _("answer") or _("question"))
+ )