Fixed #9957: feeds now respect time zone information provided by the pub date.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10435 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
a6356cad4d
commit
2c3c1f3ec4
|
@ -145,7 +145,7 @@ class Feed(object):
|
||||||
author_email = author_link = None
|
author_email = author_link = None
|
||||||
|
|
||||||
pubdate = self.__get_dynamic_attr('item_pubdate', item)
|
pubdate = self.__get_dynamic_attr('item_pubdate', item)
|
||||||
if pubdate:
|
if pubdate and not pubdate.tzinfo:
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
utcnow = datetime.utcnow()
|
utcnow = datetime.utcnow()
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from django.contrib.syndication import feeds
|
from django.contrib.syndication import feeds
|
||||||
from django.utils.feedgenerator import Atom1Feed
|
from django.utils.feedgenerator import Atom1Feed
|
||||||
|
from django.utils import tzinfo
|
||||||
|
|
||||||
class ComplexFeed(feeds.Feed):
|
class ComplexFeed(feeds.Feed):
|
||||||
def get_object(self, bits):
|
def get_object(self, bits):
|
||||||
|
@ -46,3 +47,20 @@ class MyCustomAtom1Feed(Atom1Feed):
|
||||||
|
|
||||||
class TestCustomFeed(TestAtomFeed):
|
class TestCustomFeed(TestAtomFeed):
|
||||||
feed_type = MyCustomAtom1Feed
|
feed_type = MyCustomAtom1Feed
|
||||||
|
|
||||||
|
class NaiveDatesFeed(TestAtomFeed):
|
||||||
|
"""
|
||||||
|
A feed with naive (non-timezone-aware) dates.
|
||||||
|
"""
|
||||||
|
def item_pubdate(self, item):
|
||||||
|
return item.date
|
||||||
|
|
||||||
|
class TZAwareDatesFeed(TestAtomFeed):
|
||||||
|
"""
|
||||||
|
A feed with timezone-aware dates.
|
||||||
|
"""
|
||||||
|
def item_pubdate(self, item):
|
||||||
|
# Provide a weird offset so that the test can know it's getting this
|
||||||
|
# specific offset and not accidentally getting on from
|
||||||
|
# settings.TIME_ZONE.
|
||||||
|
return item.date.replace(tzinfo=tzinfo.FixedOffset(42))
|
|
@ -1,8 +1,10 @@
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import datetime
|
||||||
from xml.dom import minidom
|
from xml.dom import minidom
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
|
from django.utils import tzinfo
|
||||||
from models import Entry
|
from models import Entry
|
||||||
try:
|
try:
|
||||||
set
|
set
|
||||||
|
@ -91,4 +93,27 @@ class SyndicationFeedTest(TestCase):
|
||||||
link = item.getElementsByTagName('link')[0]
|
link = item.getElementsByTagName('link')[0]
|
||||||
if link.firstChild.wholeText == 'http://example.com/blog/4/':
|
if link.firstChild.wholeText == 'http://example.com/blog/4/':
|
||||||
title = item.getElementsByTagName('title')[0]
|
title = item.getElementsByTagName('title')[0]
|
||||||
self.assertEquals(title.firstChild.wholeText, u'A & B < C > D')
|
self.assertEquals(title.firstChild.wholeText, u'A & B < C > D')
|
||||||
|
|
||||||
|
def test_naive_datetime_conversion(self):
|
||||||
|
"""
|
||||||
|
Test that datetimes are correctly converted to the local time zone.
|
||||||
|
"""
|
||||||
|
# Naive date times passed in get converted to the local time zone, so
|
||||||
|
# check the recived zone offset against the local offset.
|
||||||
|
response = self.client.get('/syndication/feeds/naive-dates/')
|
||||||
|
doc = minidom.parseString(response.content)
|
||||||
|
updated = doc.getElementsByTagName('updated')[0].firstChild.wholeText
|
||||||
|
tz = tzinfo.LocalTimezone(datetime.datetime.now())
|
||||||
|
now = datetime.datetime.now(tz)
|
||||||
|
self.assertEqual(updated[-6:], str(now)[-6:])
|
||||||
|
|
||||||
|
def test_aware_datetime_conversion(self):
|
||||||
|
"""
|
||||||
|
Test that datetimes with timezones don't get trodden on.
|
||||||
|
"""
|
||||||
|
response = self.client.get('/syndication/feeds/aware-dates/')
|
||||||
|
doc = minidom.parseString(response.content)
|
||||||
|
updated = doc.getElementsByTagName('updated')[0].firstChild.wholeText
|
||||||
|
self.assertEqual(updated[-6:], '+00:42')
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
from feeds import TestRssFeed, TestAtomFeed, TestCustomFeed, ComplexFeed
|
import feeds
|
||||||
from django.conf.urls.defaults import patterns
|
from django.conf.urls.defaults import patterns
|
||||||
|
|
||||||
feed_dict = {
|
feed_dict = {
|
||||||
'complex': ComplexFeed,
|
'complex': feeds.ComplexFeed,
|
||||||
'rss': TestRssFeed,
|
'rss': feeds.TestRssFeed,
|
||||||
'atom': TestAtomFeed,
|
'atom': feeds.TestAtomFeed,
|
||||||
'custom': TestCustomFeed,
|
'custom': feeds.TestCustomFeed,
|
||||||
|
'naive-dates': feeds.NaiveDatesFeed,
|
||||||
|
'aware-dates': feeds.TZAwareDatesFeed,
|
||||||
}
|
}
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feed_dict})
|
(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feed_dict})
|
||||||
|
|
Loading…
Reference in New Issue