Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed #3760 -- Added the ability to manually set feed- and item-level id

elements in Atom feeds. This is fully backwards compatible. Based on a patch
from spark343@cs.ubc.ca.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@5643 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 86640f33c1f290a64452ce700e6f3da1ba618bdf 1 parent 87d8976
@malcolmt malcolmt authored
View
3  django/contrib/syndication/feeds.py
@@ -83,6 +83,7 @@ def get_feed(self, url=None):
author_email = self.__get_dynamic_attr('author_email', obj),
categories = self.__get_dynamic_attr('categories', obj),
feed_copyright = self.__get_dynamic_attr('feed_copyright', obj),
+ feed_guid = self.__get_dynamic_attr('feed_guid', obj),
)
try:
@@ -114,7 +115,7 @@ def get_feed(self, url=None):
title = title_tmp.render(Context({'obj': item, 'site': current_site})),
link = link,
description = description_tmp.render(Context({'obj': item, 'site': current_site})),
- unique_id = link,
+ unique_id = self.__get_dynamic_attr('item_guid', item, link),
enclosure = enc,
pubdate = self.__get_dynamic_attr('item_pubdate', item),
author_name = author_name,
View
5 django/utils/feedgenerator.py
@@ -41,7 +41,7 @@ class SyndicationFeed(object):
"Base class for all syndication feeds. Subclasses should provide write()"
def __init__(self, title, link, description, language=None, author_email=None,
author_name=None, author_link=None, subtitle=None, categories=None,
- feed_url=None, feed_copyright=None):
+ feed_url=None, feed_copyright=None, feed_guid=None):
to_unicode = lambda s: force_unicode(s, strings_only=True)
if categories:
categories = [force_unicode(c) for c in categories]
@@ -57,6 +57,7 @@ def __init__(self, title, link, description, language=None, author_email=None,
'categories': categories or (),
'feed_url': iri_to_uri(feed_url),
'feed_copyright': to_unicode(feed_copyright),
+ 'id': feed_guid or link,
}
self.items = []
@@ -213,7 +214,7 @@ def write(self, outfile, encoding):
handler.addQuickElement(u"link", "", {u"rel": u"alternate", u"href": self.feed['link']})
if self.feed['feed_url'] is not None:
handler.addQuickElement(u"link", "", {u"rel": u"self", u"href": self.feed['feed_url']})
- handler.addQuickElement(u"id", self.feed['link'])
+ handler.addQuickElement(u"id", self.feed['id'])
handler.addQuickElement(u"updated", rfc3339_date(self.latest_post_date()).decode('ascii'))
if self.feed['author_name'] is not None:
handler.startElement(u"author", {})
View
27 docs/syndication_feeds.txt
@@ -416,6 +416,24 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
link = '/foo/bar/' # Hard-coded link.
+ # GUID -- One of the following three is optional. The framework looks
+ # for them in this order. This property is only used for Atom feeds
+ # (where it is the feed-level id element). If not provided, the feed
+ # link is used as the id.
+
+ def feed_guid(self, obj):
+ """
+ Takes the object returned by get_object() and returns the globally
+ unique id for the feed as a normal Python string.
+ """
+
+ def feed_guid(self):
+ """
+ Returns the feed's globally unique id as a normal Python string.
+ """
+
+ feed_guid = '/foo/bar/1234' # Hard-coded guid.
+
# DESCRIPTION -- One of the following three is required. The framework
# looks for them in this order.
@@ -556,6 +574,15 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
Returns the URL for every item in the feed.
"""
+ # ITEM_GUID -- The following method is optional. This property is
+ # only used for Atom feeds (it is the id element for an item in an
+ # Atom feed). If not provided, the item's link is used by default.
+
+ def item_guid(self, obj):
+ """
+ Takes an item, as return by items(), and returns the item's id.
+ """
+
# ITEM AUTHOR NAME --One of the following three is optional. The
# framework looks for them in this order.
Please sign in to comment.
Something went wrong with that request. Please try again.