]> git.openstreetmap.org Git - osqa.git/commitdiff
Adds feeds for answers or comments to questions.
authorhernani <hernani@0cfe37f9-358a-4d5e-be75-b63607b5c754>
Thu, 8 Jul 2010 18:33:06 +0000 (18:33 +0000)
committerhernani <hernani@0cfe37f9-358a-4d5e-be75-b63607b5c754>
Thu, 8 Jul 2010 18:33:06 +0000 (18:33 +0000)
git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@503 0cfe37f9-358a-4d5e-be75-b63607b5c754

forum/feed.py
forum/skins/default/templates/feeds/rss_answer_title.html [new file with mode: 0644]
forum/skins/default/templates/feeds/rss_title.html
forum/skins/default/templates/question.html
forum/skins/default/templates/subscription_status.html
forum/views/readers.py

index 15a8ab9da366e97e7ae307e198dfe146ecc92268..bbbf3e701d4975fd249eef2fabab538ffdcac003 100644 (file)
@@ -7,21 +7,22 @@ except:
 
 from django.http import HttpResponse
 from django.utils.translation import ugettext as _
+from django.utils.safestring import mark_safe
 from models import Question
 from forum import settings
 
+class BaseNodeFeed(Feed):
+    if old_version:
+        title_template = "feeds/rss_title.html"
+        description_template = "feeds/rss_description.html"
 
-class RssQuestionFeed(Feed):
-    copyright = settings.APP_COPYRIGHT
-
-    def __init__(self, question_list, title, description, request):
+    def __init__(self, request, title, description, url):
         self._title = title
-        self._description = description
-        self._question_list = question_list
-        self._url = request.path + "&" + "&".join(["%s=%s" % (k, v) for k, v in request.GET.items() if not k in ('page', 'pagesize', 'sort')])
+        self._description = mark_safe(description)
+        self._url = url
 
         if old_version:
-            super(RssQuestionFeed, self).__init__('', request)
+            super(BaseNodeFeed, self).__init__('', request)
 
     def title(self):
         return self._title
@@ -29,8 +30,17 @@ class RssQuestionFeed(Feed):
     def link(self):
         return self._url
 
+    def description(self):
+        return self._description
+
+    def item_title(self, item):
+        return item.title
+
+    def item_description(self, item):
+        return item.html
+
     def item_link(self, item):
-        return item.get_absolute_url()
+        return item.leaf.get_absolute_url()
 
     def item_author_name(self, item):
         return item.author.username
@@ -41,16 +51,52 @@ class RssQuestionFeed(Feed):
     def item_pubdate(self, item):
         return item.added_at
 
-    def item_categories(self, item):
-        return item.tagname_list()  
-
-    def items(self, item):
-       return self._question_list[: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 + "&" + "&".join(["%s=%s" % (k, v) for k, v in request.GET.items() if not k in (_('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[: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") % 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')[:30]
+
+    def item_title(self, item):
+        if item.node_type == "answer":
+            return _("Answer by %s") % item.author.username
+        else:
+            return _("Comment by %(cauthor)s on %(pauthor)s's %(qora)s") % dict(
+                cauthor=item.author.username, pauthor=item.parent.author.username, qora=(item.parent.node_type == "answer" and _("answer") or _("question"))
+            )
+
+
+
+
diff --git a/forum/skins/default/templates/feeds/rss_answer_title.html b/forum/skins/default/templates/feeds/rss_answer_title.html
new file mode 100644 (file)
index 0000000..6b5d5ec
--- /dev/null
@@ -0,0 +1,2 @@
+{% load i18n %}
+{% blocktrans with obj.author.username as author %}Answer by {{ author }}{% endblocktrans %}
\ No newline at end of file
index 7899fce3e8e65efd1d72972ae1c02c44547a04c5..be322ee31c34ded5f805643030a1cefb1e4a1f78 100644 (file)
@@ -1 +1 @@
-{{ obj.title }}
\ No newline at end of file
+{{ obj.title|safe }}
\ No newline at end of file
index 305f62c37ad153f688482ecf223b7af36b3a9114..4d5ff090009aa196a96087b217d76ed45a975e27 100644 (file)
@@ -13,6 +13,7 @@
 {% block title %}{% spaceless %}{{ question.headline }}{% endspaceless %}{% endblock %}\r
 {% block forejs %}\r
         <link rel="canonical" href="{{settings.APP_URL}}{{question.get_absolute_url}}" />\r
+        <link rel="alternate" type="application/rss+xml" title="RSS" href="{{ question.get_absolute_url }}?type=rss">\r
         {% if not question.nis.closed %}\r
         <script type='text/javascript' src='{% media  "/media/js/wmd/showdown.js" %}'></script>\r
         <script type='text/javascript' src='{% media  "/media/js/wmd/wmd.js" %}'></script>\r
index c489da1922dc13e21026d828441a3ad2b7d44127..46ad235beaeb75728646588cb392afaf18c3781f 100644 (file)
@@ -1,6 +1,7 @@
-{% load i18n %}\r
-\r
-<h3 class="subtitle">{% trans "Subscription" %}:</h3>\r
+{% spaceless %}\r
+{% load i18n extra_tags %}\r
+<h3 class="subtitle">{% trans "Follow this question" %}</h3>\r
+<strong>{% trans "By Email" %}:</strong>\r
 {% if request.user.is_authenticated %}\r
     <div class="subscription-status">\r
         {% if subscription %}\r
 {% else %}\r
     <p>{% trans "Once you sign in you will be able to subscribe for any updates here" %}</p>\r
 {% endif %}\r
+<strong>{% trans "By RSS" %}:</strong>\r
+<p>\r
+    <a class="feed-icon" style="background-image:url('{% media "media/images/feed-icon-small.png" %}');"\r
+        href="{{ question.get_absolute_url }}?type=rss" title="{% trans "subscribe to answers" %}"></a>\r
+    {% trans "Answers" %}\r
+</p>\r
+<p>\r
+    <a class="feed-icon" style="background-image:url('{% media "media/images/feed-icon-small.png" %}');"\r
+        href="{{ question.get_absolute_url }}?type=rss&comments=yes" title="{% trans "subscribe to comments and answers" %}"></a>\r
+    {% trans "Answers and Comments" %}\r
+</p>\r
+{% endspaceless %}\r
index da881d78ec28dc240d816c7c23bf019aab63053e..a60db45b2ea6735326b011618df9683dc3f4219c 100644 (file)
@@ -28,7 +28,7 @@ from forum.models import *
 from forum.forms import get_next_url
 from forum.actions import QuestionViewAction
 from forum.http_responses import HttpResponseUnauthorized
-from forum.feed import RssQuestionFeed
+from forum.feed import RssQuestionFeed, RssAnswerFeed
 import decorators
 
 class QuestionListPaginatorContext(pagination.PaginatorContext):
@@ -148,7 +148,8 @@ def question_list(request, initial,
         page_title = _("Questions")
 
     if request.GET.get('type', None) == 'rss':
-        return RssQuestionFeed(questions, page_title, list_description, request)(request)
+        questions = questions.order_by('-added_at')
+        return RssQuestionFeed(request, questions, page_title, list_description)(request)
 
     keywords =  ""
     if request.GET.get("q"):
@@ -294,6 +295,9 @@ def question(request, id, slug=None, answer=None):
     if question.nis.deleted and not request.user.can_view_deleted_post(question):
         raise Http404
 
+    if request.GET.get('type', None) == 'rss':
+        return RssAnswerFeed(request, question, include_comments=request.GET.get('comments', None) == 'yes')(request)
+
     if answer:
         answer = get_object_or_404(Answer, id=answer)