From 7626cb058107ac1ecb0795162e4c9fc4f92356dd Mon Sep 17 00:00:00 2001 From: Adrian Holovaty Date: Mon, 14 Nov 2005 04:59:20 +0000 Subject: [PATCH] Improved Atom feed-generating framework to output . 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 --- django/contrib/syndication/feeds.py | 6 ++++-- django/contrib/syndication/views.py | 2 +- django/utils/feedgenerator.py | 8 ++++++-- docs/syndication_feeds.txt | 18 +++++++++++++++++- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/django/contrib/syndication/feeds.py b/django/contrib/syndication/feeds.py index c495990c51e..8b49334fec1 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 3bab3bcac96..5117746f196 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 86c1a046ece..a8dd5c39dfe 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 4298bc81b66..453fe71e9d1 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 ```` 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).