Commit 58038a8b authored by Russell Keith-Magee's avatar Russell Keith-Magee
Browse files

[1.2.X] Fixed #14176 -- Added forwards compatibility to the legacy syndication...

[1.2.X] Fixed #14176 -- Added forwards compatibility to the legacy syndication feed view. This allows class-based feeds to be deployed using the old-style feed view, as long as the feed requires no arguments (i.e., get_object returns None). Thanks to psychcf for the report, cwhaines for the investigation, and Andrew Godwin for the assist.

Backport of r15189 from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15190 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 857b49d1
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -188,6 +188,7 @@ class Feed(object):

def feed(request, url, feed_dict=None):
    """Provided for backwards compatibility."""
    from django.contrib.syndication.feeds import Feed as LegacyFeed
    import warnings
    warnings.warn('The syndication feed() view is deprecated. Please use the '
                  'new class based view API.',
@@ -206,6 +207,18 @@ def feed(request, url, feed_dict=None):
    except KeyError:
        raise Http404("Slug %r isn't registered." % slug)

    # Backwards compatibility within the backwards compatibility;
    # Feeds can be updated to be class-based, but still be deployed
    # using the legacy feed view. This only works if the feed takes
    # no arguments (i.e., get_object returns None). Refs #14176.
    if not issubclass(f, LegacyFeed):
        instance = f()
        instance.feed_url = getattr(f, 'feed_url', None) or request.path
        instance.title_template = f.title_template or ('feeds/%s_title.html' % slug)
        instance.description_template = f.description_template or ('feeds/%s_description.html' % slug)

        return instance(request)

    try:
        feedgen = f(slug, request).get_feed(param)
    except FeedDoesNotExist:
+1 −0
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ class CommentTestCase(TestCase):
        return d

from regressiontests.comment_tests.tests.app_api_tests import *
from regressiontests.comment_tests.tests.feed_tests import *
from regressiontests.comment_tests.tests.model_tests import *
from regressiontests.comment_tests.tests.comment_form_tests import *
from regressiontests.comment_tests.tests.templatetag_tests import *
+33 −0
Original line number Diff line number Diff line
import warnings

from django.test.utils import get_warnings_state, restore_warnings_state

from regressiontests.comment_tests.tests import CommentTestCase


class CommentFeedTests(CommentTestCase):
    urls = 'regressiontests.comment_tests.urls'
    feed_url = '/rss/comments/'

    def test_feed(self):
        response = self.client.get(self.feed_url)
        self.assertEquals(response.status_code, 200)
        self.assertEquals(response['Content-Type'], 'application/rss+xml')
        self.assertContains(response, '<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">')
        self.assertContains(response, '<title>example.com comments</title>')
        self.assertContains(response, '<link>http://example.com/</link>')
        self.assertContains(response, '</rss>')


class LegacyCommentFeedTests(CommentFeedTests):
    feed_url = '/rss/legacy/comments/'

    def setUp(self):
        self._warnings_state = get_warnings_state()
        warnings.filterwarnings("ignore", category=DeprecationWarning,
                                module='django.contrib.syndication.views')
        warnings.filterwarnings("ignore", category=DeprecationWarning,
                                module='django.contrib.syndication.feeds')

    def tearDown(self):
        restore_warnings_state(self._warnings_state)
+9 −0
Original line number Diff line number Diff line
from django.conf.urls.defaults import *
from django.contrib.comments.feeds import LatestCommentFeed

feeds = {
     'comments': LatestCommentFeed,
}

urlpatterns = patterns('regressiontests.comment_tests.custom_comments.views',
    url(r'^post/$',          'custom_submit_comment'),
@@ -7,3 +12,7 @@ urlpatterns = patterns('regressiontests.comment_tests.custom_comments.views',
    url(r'^approve/(\d+)/$', 'custom_approve_comment'),
)

urlpatterns += patterns('',
    (r'^rss/legacy/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feeds}),
    (r'^rss/comments/$', LatestCommentFeed()),
)