mirror of https://github.com/django/django.git
Fixed #787 -- High-level syndication framework now picks up author details. Also updated documentation. Thanks, mattycakes
git-svn-id: http://code.djangoproject.com/svn/django/trunk@1228 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
7626cb0581
commit
74865663bb
|
@ -27,8 +27,11 @@ class Feed:
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
raise ImproperlyConfigured, "Give your %s class a get_absolute_url() method, or define an item_link() method in your Feed class." % item.__class__.__name__
|
raise ImproperlyConfigured, "Give your %s class a get_absolute_url() method, or define an item_link() method in your Feed class." % item.__class__.__name__
|
||||||
|
|
||||||
def __get_dynamic_attr(self, attname, obj):
|
def __get_dynamic_attr(self, attname, obj, default=None):
|
||||||
attr = getattr(self, attname)
|
try:
|
||||||
|
attr = getattr(self, attname)
|
||||||
|
except AttributeError:
|
||||||
|
return default
|
||||||
if callable(attr):
|
if callable(attr):
|
||||||
try:
|
try:
|
||||||
return attr(obj)
|
return attr(obj)
|
||||||
|
@ -59,6 +62,9 @@ class Feed:
|
||||||
description = self.__get_dynamic_attr('description', obj),
|
description = self.__get_dynamic_attr('description', obj),
|
||||||
language = LANGUAGE_CODE.decode(),
|
language = LANGUAGE_CODE.decode(),
|
||||||
feed_url = add_domain(current_site, self.feed_url),
|
feed_url = add_domain(current_site, self.feed_url),
|
||||||
|
author_name = self.__get_dynamic_attr('author_name', obj),
|
||||||
|
author_link = self.__get_dynamic_attr('author_link', obj),
|
||||||
|
author_email = self.__get_dynamic_attr('author_email', obj),
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -80,6 +86,12 @@ class Feed:
|
||||||
length = str(self.__get_dynamic_attr('item_enclosure_length', item)).decode('utf-8'),
|
length = str(self.__get_dynamic_attr('item_enclosure_length', item)).decode('utf-8'),
|
||||||
mime_type = self.__get_dynamic_attr('item_enclosure_mime_type', item).decode('utf-8'),
|
mime_type = self.__get_dynamic_attr('item_enclosure_mime_type', item).decode('utf-8'),
|
||||||
)
|
)
|
||||||
|
author_name = self.__get_dynamic_attr('item_author_name', item)
|
||||||
|
if author_name is not None:
|
||||||
|
author_email = self.__get_dynamic_attr('item_author_email', item)
|
||||||
|
author_link = self.__get_dynamic_attr('item_author_link', item)
|
||||||
|
else:
|
||||||
|
author_email = author_link = None
|
||||||
feed.add_item(
|
feed.add_item(
|
||||||
title = title_template.render(Context({'obj': item, 'site': current_site})).decode('utf-8'),
|
title = title_template.render(Context({'obj': item, 'site': current_site})).decode('utf-8'),
|
||||||
link = link,
|
link = link,
|
||||||
|
@ -87,5 +99,8 @@ class Feed:
|
||||||
unique_id = link,
|
unique_id = link,
|
||||||
enclosure = enc,
|
enclosure = enc,
|
||||||
pubdate = self.__get_dynamic_attr('item_pubdate', item),
|
pubdate = self.__get_dynamic_attr('item_pubdate', item),
|
||||||
|
author_name = author_name,
|
||||||
|
author_email = author_email,
|
||||||
|
author_link = author_link,
|
||||||
)
|
)
|
||||||
return feed
|
return feed
|
||||||
|
|
|
@ -58,7 +58,7 @@ class SyndicationFeed:
|
||||||
self.items = []
|
self.items = []
|
||||||
|
|
||||||
def add_item(self, title, link, description, author_email=None,
|
def add_item(self, title, link, description, author_email=None,
|
||||||
author_name=None, pubdate=None, comments=None,
|
author_name=None, author_link=None, pubdate=None, comments=None,
|
||||||
unique_id=None, enclosure=None, categories=()):
|
unique_id=None, enclosure=None, categories=()):
|
||||||
"""
|
"""
|
||||||
Adds an item to the feed. All args are expected to be Python Unicode
|
Adds an item to the feed. All args are expected to be Python Unicode
|
||||||
|
@ -71,6 +71,7 @@ class SyndicationFeed:
|
||||||
'description': description,
|
'description': description,
|
||||||
'author_email': author_email,
|
'author_email': author_email,
|
||||||
'author_name': author_name,
|
'author_name': author_name,
|
||||||
|
'author_link': author_link,
|
||||||
'pubdate': pubdate,
|
'pubdate': pubdate,
|
||||||
'comments': comments,
|
'comments': comments,
|
||||||
'unique_id': unique_id,
|
'unique_id': unique_id,
|
||||||
|
@ -226,6 +227,8 @@ class Atom1Feed(SyndicationFeed):
|
||||||
handler.addQuickElement(u"name", item['author_name'])
|
handler.addQuickElement(u"name", item['author_name'])
|
||||||
if item['author_email'] is not None:
|
if item['author_email'] is not None:
|
||||||
handler.addQuickElement(u"email", item['author_email'])
|
handler.addQuickElement(u"email", item['author_email'])
|
||||||
|
if item['author_link'] is not None:
|
||||||
|
handler.addQuickElement(u"uri", item['author_link'])
|
||||||
handler.endElement(u"author")
|
handler.endElement(u"author")
|
||||||
|
|
||||||
# Unique ID.
|
# Unique ID.
|
||||||
|
|
|
@ -386,6 +386,55 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
|
||||||
|
|
||||||
description = 'Foo bar baz.' # Hard-coded description.
|
description = 'Foo bar baz.' # Hard-coded description.
|
||||||
|
|
||||||
|
# AUTHOR NAME --One of the following three is optional. The framework
|
||||||
|
# looks for them in this order.
|
||||||
|
|
||||||
|
def author_name(self, obj):
|
||||||
|
"""
|
||||||
|
Takes the object returned by get_object() and returns the feed's
|
||||||
|
author's name as a normal Python string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def author_name(self):
|
||||||
|
"""
|
||||||
|
Returns the feed's author's name as a normal Python string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
author_name = 'Sally Smith' # Hard-coded author name.
|
||||||
|
|
||||||
|
# AUTHOR E-MAIL --One of the following three is optional. The framework
|
||||||
|
# looks for them in this order.
|
||||||
|
|
||||||
|
def author_email(self, obj):
|
||||||
|
"""
|
||||||
|
Takes the object returned by get_object() and returns the feed's
|
||||||
|
author's e-mail as a normal Python string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def author_name(self):
|
||||||
|
"""
|
||||||
|
Returns the feed's author's e-mail as a normal Python string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
author_email = 'test@example.com' # Hard-coded author e-mail.
|
||||||
|
|
||||||
|
# AUTHOR LINK --One of the following three is optional. The framework
|
||||||
|
# looks for them in this order. In each case, the URL should include
|
||||||
|
# the "http://" and domain name.
|
||||||
|
|
||||||
|
def author_link(self, obj):
|
||||||
|
"""
|
||||||
|
Takes the object returned by get_object() and returns the feed's
|
||||||
|
author's URL as a normal Python string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def author_link(self):
|
||||||
|
"""
|
||||||
|
Returns the feed's author's URL as a normal Python string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
author_link = 'http://www.example.com/' # Hard-coded author URL.
|
||||||
|
|
||||||
# ITEMS -- One of the following three is required. The framework looks
|
# ITEMS -- One of the following three is required. The framework looks
|
||||||
# for them in this order.
|
# for them in this order.
|
||||||
|
|
||||||
|
@ -428,6 +477,59 @@ This example illustrates all possible attributes and methods for a ``Feed`` clas
|
||||||
Returns the URL for every item in the feed.
|
Returns the URL for every item in the feed.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# ITEM AUTHOR NAME --One of the following three is optional. The
|
||||||
|
# framework looks for them in this order.
|
||||||
|
|
||||||
|
def item_author_name(self, item):
|
||||||
|
"""
|
||||||
|
Takes an item, as returned by items(), and returns the item's
|
||||||
|
author's name as a normal Python string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def item_author_name(self):
|
||||||
|
"""
|
||||||
|
Returns the author name for every item in the feed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
item_author_name = 'Sally Smith' # Hard-coded author name.
|
||||||
|
|
||||||
|
# ITEM AUTHOR E-MAIL --One of the following three is optional. The
|
||||||
|
# framework looks for them in this order.
|
||||||
|
#
|
||||||
|
# If you specify this, you must specify item_author_name.
|
||||||
|
|
||||||
|
def item_author_email(self, obj):
|
||||||
|
"""
|
||||||
|
Takes an item, as returned by items(), and returns the item's
|
||||||
|
author's e-mail as a normal Python string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def item_author_email(self):
|
||||||
|
"""
|
||||||
|
Returns the author e-mail for every item in the feed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
item_author_email = 'test@example.com' # Hard-coded author e-mail.
|
||||||
|
|
||||||
|
# ITEM AUTHOR LINK --One of the following three is optional. The
|
||||||
|
# framework looks for them in this order. In each case, the URL should
|
||||||
|
# include the "http://" and domain name.
|
||||||
|
#
|
||||||
|
# If you specify this, you must specify item_author_name.
|
||||||
|
|
||||||
|
def item_author_link(self, obj):
|
||||||
|
"""
|
||||||
|
Takes an item, as returned by items(), and returns the item's
|
||||||
|
author's URL as a normal Python string.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def item_author_link(self):
|
||||||
|
"""
|
||||||
|
Returns the author URL for every item in the feed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
item_author_link = 'http://www.example.com/' # Hard-coded author URL.
|
||||||
|
|
||||||
# ITEM ENCLOSURE URL -- One of these three is required if you're
|
# ITEM ENCLOSURE URL -- One of these three is required if you're
|
||||||
# publishing enclosures. The framework looks for them in this order.
|
# publishing enclosures. The framework looks for them in this order.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue