X-Git-Url: https://git.openstreetmap.org/osqa.git/blobdiff_plain/1a949f7c97dc2f34c135f5cdf088df2927d3d652..99d077e46d0eb3efd5e96a65f120e6e4b6197db0:/forum/feed.py diff --git a/forum/feed.py b/forum/feed.py index e4b929e..810a742 100644 --- a/forum/feed.py +++ b/forum/feed.py @@ -1,31 +1,58 @@ -#!/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 = 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() @@ -33,11 +60,60 @@ class RssLastestQuestionsFeed(Feed): 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(content_type=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")) + )