summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Holovaty <adrian@holovaty.com>2005-11-14 04:59:20 +0000
committerAdrian Holovaty <adrian@holovaty.com>2005-11-14 04:59:20 +0000
commit7626cb058107ac1ecb0795162e4c9fc4f92356dd (patch)
treead0274d4cd36b067ca80f2d4eea698a8efdc2290
parent7b315b47aa09611ff293fd6cfaf21b86f7045a2b (diff)
Improved Atom feed-generating framework to output <link rel='self'>. Added a feed_url hook to feedgenerator for this purpose, and changed the syndication Feed and views to use it. Also updated docs.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@1227 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/contrib/syndication/feeds.py6
-rw-r--r--django/contrib/syndication/views.py2
-rw-r--r--django/utils/feedgenerator.py8
-rw-r--r--docs/syndication_feeds.txt18
4 files changed, 28 insertions, 6 deletions
diff --git a/django/contrib/syndication/feeds.py b/django/contrib/syndication/feeds.py
index c495990c51..8b49334fec 100644
--- a/django/contrib/syndication/feeds.py
+++ b/django/contrib/syndication/feeds.py
@@ -17,8 +17,9 @@ class Feed:
item_enclosure_url = None
feed_type = feedgenerator.DefaultFeed
- def __init__(self, slug):
+ def __init__(self, slug, feed_url):
self.slug = slug
+ self.feed_url = feed_url
def item_link(self, item):
try:
@@ -56,7 +57,8 @@ class Feed:
title = self.__get_dynamic_attr('title', obj),
link = link,
description = self.__get_dynamic_attr('description', obj),
- language = LANGUAGE_CODE.decode()
+ language = LANGUAGE_CODE.decode(),
+ feed_url = add_domain(current_site, self.feed_url),
)
try:
diff --git a/django/contrib/syndication/views.py b/django/contrib/syndication/views.py
index 3bab3bcac9..5117746f19 100644
--- a/django/contrib/syndication/views.py
+++ b/django/contrib/syndication/views.py
@@ -17,7 +17,7 @@ def feed(request, url, feed_dict=None):
raise Http404, "Slug %r isn't registered." % slug
try:
- feedgen = f(slug).get_feed(param)
+ feedgen = f(slug, request.path).get_feed(param)
except feeds.FeedDoesNotExist:
raise Http404, "Invalid feed parameters. Slug %r is valid, but other parameters, or lack thereof, are not." % slug
diff --git a/django/utils/feedgenerator.py b/django/utils/feedgenerator.py
index 86c1a046ec..a8dd5c39df 100644
--- a/django/utils/feedgenerator.py
+++ b/django/utils/feedgenerator.py
@@ -41,7 +41,8 @@ def get_tag_uri(url, date):
class SyndicationFeed:
"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):
+ author_name=None, author_link=None, subtitle=None, categories=None,
+ feed_url=None):
self.feed = {
'title': title,
'link': link,
@@ -52,6 +53,7 @@ class SyndicationFeed:
'author_link': author_link,
'subtitle': subtitle,
'categories': categories or (),
+ 'feed_url': feed_url,
}
self.items = []
@@ -190,7 +192,9 @@ class Atom1Feed(SyndicationFeed):
else:
handler.startElement(u"feed", {u"xmlns": self.ns})
handler.addQuickElement(u"title", self.feed['title'])
- handler.addQuickElement(u"link", "", {u"href": self.feed['link']})
+ 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"updated", rfc3339_date(self.latest_post_date()).decode('ascii'))
if self.feed['author_name'] is not None:
diff --git a/docs/syndication_feeds.txt b/docs/syndication_feeds.txt
index 4298bc81b6..453fe71e9d 100644
--- a/docs/syndication_feeds.txt
+++ b/docs/syndication_feeds.txt
@@ -266,6 +266,21 @@ comes directly from your `LANGUAGE_CODE setting`_.
.. _LANGUAGE_CODE setting: http://www.djangoproject.com/documentation/settings/#language-code
+URLs
+----
+
+The ``link`` method/attribute can return either an absolute URL (e.g.
+``"/blog/"``) or a URL with the fully-qualified domain and protocol (e.g.
+``"http://www.example.com/blog/"``). If ``link`` doesn't return the domain,
+the syndication framework will insert the domain of the current site, according
+to your `SITE_ID setting`_.
+
+Atom feeds require a ``<link rel="self">`` that defines the feed's current
+location. The syndication framework populates this automatically, using the
+domain of the current site according to the SITE_ID setting.
+
+.. _SITE_ID setting: http://www.djangoproject.com/documentation/settings/#site-id
+
Publishing Atom and RSS feeds in tandem
---------------------------------------
@@ -501,7 +516,8 @@ Each of these three classes knows how to render a certain type of feed as XML.
They share this interface:
``__init__(title, link, description, language=None, author_email=None,``
-``author_name=None, author_link=None, subtitle=None, categories=None)``
+``author_name=None, author_link=None, subtitle=None, categories=None,``
+``feed_url=None)``
Initializes the feed with the given metadata, which applies to the entire feed
(i.e., not just to a specific item in the feed).