From d34b5078bedf596b49c9a48cfaa57baa182884b4 Mon Sep 17 00:00:00 2001 From: Tobias Kunze Date: Wed, 10 Apr 2019 23:48:58 +0200 Subject: [PATCH] Fixed #29352 -- Allowed specifying a Feed language --- django/contrib/syndication/views.py | 5 +++-- docs/ref/contrib/syndication.txt | 5 +++++ tests/syndication_tests/feeds.py | 4 ++++ tests/syndication_tests/tests.py | 5 +++++ tests/syndication_tests/urls.py | 1 + 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/django/contrib/syndication/views.py b/django/contrib/syndication/views.py index a8b98c84ae1a7..68ffb0bfe08c1 100644 --- a/django/contrib/syndication/views.py +++ b/django/contrib/syndication/views.py @@ -1,6 +1,5 @@ from calendar import timegm -from django.conf import settings from django.contrib.sites.shortcuts import get_current_site from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist from django.http import Http404, HttpResponse @@ -10,6 +9,7 @@ from django.utils.html import escape from django.utils.http import http_date from django.utils.timezone import get_default_timezone, is_naive, make_aware +from django.utils.translation import get_language def add_domain(domain, url, secure=False): @@ -30,6 +30,7 @@ class Feed: feed_type = feedgenerator.DefaultFeed title_template = None description_template = None + language = None def __call__(self, request, *args, **kwargs): try: @@ -134,7 +135,7 @@ def get_feed(self, obj, request): subtitle=self._get_dynamic_attr('subtitle', obj), link=link, description=self._get_dynamic_attr('description', obj), - language=settings.LANGUAGE_CODE, + language=self.language or get_language(), feed_url=add_domain( current_site.domain, self._get_dynamic_attr('feed_url', obj) or request.path, diff --git a/docs/ref/contrib/syndication.txt b/docs/ref/contrib/syndication.txt index d79db5a94a732..f52fdf21012b0 100644 --- a/docs/ref/contrib/syndication.txt +++ b/docs/ref/contrib/syndication.txt @@ -406,6 +406,11 @@ This example illustrates all possible attributes and methods for a title_template = None description_template = None + # LANGUAGE -- Optional. This should be a string specifying a + # language code. + # Defaults to :func:`~django.utils.translation.get_language()` + language = 'de' + # TITLE -- One of the following three is required. The framework # looks for them in this order. diff --git a/tests/syndication_tests/feeds.py b/tests/syndication_tests/feeds.py index 0805258138645..4e9b1170b13e1 100644 --- a/tests/syndication_tests/feeds.py +++ b/tests/syndication_tests/feeds.py @@ -136,6 +136,10 @@ def get_context_data(self, **kwargs): return context +class TestLanguageFeed(TestRss2Feed): + language = 'de' + + class NaiveDatesFeed(TestAtomFeed): """ A feed with naive (non-timezone-aware) dates. diff --git a/tests/syndication_tests/tests.py b/tests/syndication_tests/tests.py index 043533d943394..b3d690e10fe34 100644 --- a/tests/syndication_tests/tests.py +++ b/tests/syndication_tests/tests.py @@ -363,6 +363,11 @@ def test_custom_feed_generator(self): summary = entry.getElementsByTagName('summary')[0] self.assertEqual(summary.getAttribute('type'), 'html') + def test_feed_generator_language_attribute(self): + response = self.client.get('/syndication/language/') + feed = minidom.parseString(response.content).firstChild + self.assertEqual(feed.firstChild.getElementsByTagName('language')[0].firstChild.nodeValue, 'de') + def test_title_escaping(self): """ Titles are escaped correctly in RSS feeds. diff --git a/tests/syndication_tests/urls.py b/tests/syndication_tests/urls.py index d23c33e21b52f..bff7bd0c8d8de 100644 --- a/tests/syndication_tests/urls.py +++ b/tests/syndication_tests/urls.py @@ -15,6 +15,7 @@ path('syndication/atom/', feeds.TestAtomFeed()), path('syndication/latest/', feeds.TestLatestFeed()), path('syndication/custom/', feeds.TestCustomFeed()), + path('syndication/language/', feeds.TestLanguageFeed()), path('syndication/naive-dates/', feeds.NaiveDatesFeed()), path('syndication/aware-dates/', feeds.TZAwareDatesFeed()), path('syndication/feedurl/', feeds.TestFeedUrlFeed()),