From e1bb6d86117346dc3af5a0d3cdb11523860873b1 Mon Sep 17 00:00:00 2001 From: hernani Date: Thu, 8 Jul 2010 18:33:06 +0000 Subject: [PATCH] Adds feeds for answers or comments to questions. git-svn-id: http://svn.osqa.net/svnroot/osqa/trunk@503 0cfe37f9-358a-4d5e-be75-b63607b5c754 --- forum/feed.py | 78 +++++++++++++++---- .../templates/feeds/rss_answer_title.html | 2 + .../default/templates/feeds/rss_title.html | 2 +- forum/skins/default/templates/question.html | 1 + .../templates/subscription_status.html | 19 ++++- forum/views/readers.py | 8 +- 6 files changed, 88 insertions(+), 22 deletions(-) create mode 100644 forum/skins/default/templates/feeds/rss_answer_title.html diff --git a/forum/feed.py b/forum/feed.py index 15a8ab9..bbbf3e7 100644 --- a/forum/feed.py +++ b/forum/feed.py @@ -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 index 0000000..6b5d5ec --- /dev/null +++ b/forum/skins/default/templates/feeds/rss_answer_title.html @@ -0,0 +1,2 @@ +{% load i18n %} +{% blocktrans with obj.author.username as author %}Answer by {{ author }}{% endblocktrans %} \ No newline at end of file diff --git a/forum/skins/default/templates/feeds/rss_title.html b/forum/skins/default/templates/feeds/rss_title.html index 7899fce..be322ee 100644 --- a/forum/skins/default/templates/feeds/rss_title.html +++ b/forum/skins/default/templates/feeds/rss_title.html @@ -1 +1 @@ -{{ obj.title }} \ No newline at end of file +{{ obj.title|safe }} \ No newline at end of file diff --git a/forum/skins/default/templates/question.html b/forum/skins/default/templates/question.html index 305f62c..4d5ff09 100644 --- a/forum/skins/default/templates/question.html +++ b/forum/skins/default/templates/question.html @@ -13,6 +13,7 @@ {% block title %}{% spaceless %}{{ question.headline }}{% endspaceless %}{% endblock %} {% block forejs %} + {% if not question.nis.closed %} diff --git a/forum/skins/default/templates/subscription_status.html b/forum/skins/default/templates/subscription_status.html index c489da1..46ad235 100644 --- a/forum/skins/default/templates/subscription_status.html +++ b/forum/skins/default/templates/subscription_status.html @@ -1,6 +1,7 @@ -{% load i18n %} - -

{% trans "Subscription" %}:

+{% spaceless %} +{% load i18n extra_tags %} +

{% trans "Follow this question" %}

+{% trans "By Email" %}: {% if request.user.is_authenticated %}
{% if subscription %} @@ -29,3 +30,15 @@ {% else %}

{% trans "Once you sign in you will be able to subscribe for any updates here" %}

{% endif %} +{% trans "By RSS" %}: +

+ + {% trans "Answers" %} +

+

+ + {% trans "Answers and Comments" %} +

+{% endspaceless %} diff --git a/forum/views/readers.py b/forum/views/readers.py index da881d7..a60db45 100644 --- a/forum/views/readers.py +++ b/forum/views/readers.py @@ -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) -- 2.39.5