Skip to content

Commit

Permalink
Fixed #8253: fixed xmlns regression for Atom feeds, and in the proces…
Browse files Browse the repository at this point in the history
…s added a hook for adding attributes specifically on the root <rss> element (for RSS feeds only, of course). Patch by Justin Bronn.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@8331 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
jacobian committed Aug 12, 2008
1 parent ca020a5 commit d05c725
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 5 deletions.
7 changes: 5 additions & 2 deletions django/utils/feedgenerator.py
Expand Up @@ -178,13 +178,16 @@ class RssFeed(SyndicationFeed):
def write(self, outfile, encoding): def write(self, outfile, encoding):
handler = SimplerXMLGenerator(outfile, encoding) handler = SimplerXMLGenerator(outfile, encoding)
handler.startDocument() handler.startDocument()
handler.startElement(u"rss", {u"version": self._version}) handler.startElement(u"rss", self.rss_attributes())
handler.startElement(u"channel", self.root_attributes()) handler.startElement(u"channel", self.root_attributes())
self.add_root_elements(handler) self.add_root_elements(handler)
self.write_items(handler) self.write_items(handler)
self.endChannelElement(handler) self.endChannelElement(handler)
handler.endElement(u"rss") handler.endElement(u"rss")


def rss_attributes(self):
return {u"version": self._version}

def write_items(self, handler): def write_items(self, handler):
for item in self.items: for item in self.items:
handler.startElement(u'item', self.item_attributes(item)) handler.startElement(u'item', self.item_attributes(item))
Expand Down Expand Up @@ -266,7 +269,7 @@ def write(self, outfile, encoding):
self.write_items(handler) self.write_items(handler)
handler.endElement(u"feed") handler.endElement(u"feed")


def root_element_attributes(self): def root_attributes(self):
if self.feed['language'] is not None: if self.feed['language'] is not None:
return {u"xmlns": self.ns, u"xml:lang": self.feed['language']} return {u"xmlns": self.ns, u"xml:lang": self.feed['language']}
else: else:
Expand Down
17 changes: 14 additions & 3 deletions tests/regressiontests/syndication/tests.py
Expand Up @@ -20,9 +20,19 @@ def assertChildNodes(self, elem, expected):
def test_rss_feed(self): def test_rss_feed(self):
response = self.client.get('/syndication/feeds/rss/') response = self.client.get('/syndication/feeds/rss/')
doc = minidom.parseString(response.content) doc = minidom.parseString(response.content)
self.assertEqual(len(doc.getElementsByTagName('channel')), 1)

# Making sure there's only 1 `rss` element and that the correct
chan = doc.getElementsByTagName('channel')[0] # RSS version was specified.
feed_elem = doc.getElementsByTagName('rss')
self.assertEqual(len(feed_elem), 1)
feed = feed_elem[0]
self.assertEqual(feed.getAttribute('version'), '2.0')

# Making sure there's only one `channel` element w/in the
# `rss` element.
chan_elem = feed.getElementsByTagName('channel')
self.assertEqual(len(chan_elem), 1)
chan = chan_elem[0]
self.assertChildNodes(chan, ['title', 'link', 'description', 'language', 'lastBuildDate', 'item']) self.assertChildNodes(chan, ['title', 'link', 'description', 'language', 'lastBuildDate', 'item'])


items = chan.getElementsByTagName('item') items = chan.getElementsByTagName('item')
Expand All @@ -36,6 +46,7 @@ def test_atom_feed(self):


feed = doc.firstChild feed = doc.firstChild
self.assertEqual(feed.nodeName, 'feed') self.assertEqual(feed.nodeName, 'feed')
self.assertEqual(feed.getAttribute('xmlns'), 'http://www.w3.org/2005/Atom')
self.assertChildNodes(feed, ['title', 'link', 'id', 'updated', 'entry']) self.assertChildNodes(feed, ['title', 'link', 'id', 'updated', 'entry'])


entries = feed.getElementsByTagName('entry') entries = feed.getElementsByTagName('entry')
Expand Down

0 comments on commit d05c725

Please sign in to comment.