summaryrefslogtreecommitdiff
path: root/django/core/rss.py
diff options
context:
space:
mode:
authorAdrian Holovaty <adrian@holovaty.com>2005-07-13 01:25:57 +0000
committerAdrian Holovaty <adrian@holovaty.com>2005-07-13 01:25:57 +0000
commited114e15106192b22ebb78ef5bf5bce72b419d13 (patch)
treef7c27f035cca8d50bd69e2ecbd7497fccec4a35a /django/core/rss.py
parent07ffc7d605cc96557db28a9e35da69bc0719611b (diff)
Imported Django from private SVN repository (created from r. 8825)
git-svn-id: http://code.djangoproject.com/svn/django/trunk@3 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/core/rss.py')
-rw-r--r--django/core/rss.py136
1 files changed, 136 insertions, 0 deletions
diff --git a/django/core/rss.py b/django/core/rss.py
new file mode 100644
index 0000000000..a381a9cd78
--- /dev/null
+++ b/django/core/rss.py
@@ -0,0 +1,136 @@
+from django.core import template_loader
+from django.core.exceptions import ObjectDoesNotExist
+from django.core.template import Context
+from django.models.core import sites
+from django.utils import feedgenerator
+from django.conf.settings import LANGUAGE_CODE, SETTINGS_MODULE
+
+class FeedConfiguration:
+ def __init__(self, slug, title_cb, link_cb, description_cb, get_list_func_cb, get_list_kwargs,
+ param_func=None, param_kwargs_cb=None, get_list_kwargs_cb=None,
+ enc_url=None, enc_length=None, enc_mime_type=None):
+ """
+ slug -- Normal Python string. Used to register the feed.
+
+ title_cb, link_cb, description_cb -- Functions that take the param
+ (if applicable) and return a normal Python string.
+
+ get_list_func_cb -- Function that takes the param and returns a
+ function to use in retrieving items.
+
+ get_list_kwargs -- Dictionary of kwargs to pass to the function
+ returned by get_list_func_cb.
+
+ param_func -- Function to use in retrieving the param (if applicable).
+
+ param_kwargs_cb -- Function that takes the slug and returns a
+ dictionary of kwargs to use in param_func.
+
+ get_list_kwargs_cb -- Function that takes the param and returns a
+ dictionary to use in addition to get_list_kwargs (if applicable).
+
+ The three enc_* parameters are strings representing methods or
+ attributes to call on a particular item to get its enclosure
+ information. Each of those methods/attributes should return a normal
+ Python string.
+ """
+ self.slug = slug
+ self.title_cb, self.link_cb = title_cb, link_cb
+ self.description_cb = description_cb
+ self.get_list_func_cb = get_list_func_cb
+ self.get_list_kwargs = get_list_kwargs
+ self.param_func, self.param_kwargs_cb = param_func, param_kwargs_cb
+ self.get_list_kwargs_cb = get_list_kwargs_cb
+ assert (None == enc_url == enc_length == enc_mime_type) or (enc_url is not None and enc_length is not None and enc_mime_type is not None)
+ self.enc_url = enc_url
+ self.enc_length = enc_length
+ self.enc_mime_type = enc_mime_type
+
+ def get_feed(self, param_slug=None):
+ """
+ Returns a utils.feedgenerator.DefaultRssFeed object, fully populated,
+ representing this FeedConfiguration.
+ """
+ if param_slug:
+ try:
+ param = self.param_func(**self.param_kwargs_cb(param_slug))
+ except ObjectDoesNotExist:
+ raise FeedIsNotRegistered
+ else:
+ param = None
+ current_site = sites.get_current()
+ f = self._get_feed_generator_object(param)
+ title_template = template_loader.get_template('rss/%s_title' % self.slug)
+ description_template = template_loader.get_template('rss/%s_description' % self.slug)
+ kwargs = self.get_list_kwargs.copy()
+ if param and self.get_list_kwargs_cb:
+ kwargs.update(self.get_list_kwargs_cb(param))
+ get_list_func = self.get_list_func_cb(param)
+ for obj in get_list_func(**kwargs):
+ link = obj.get_absolute_url()
+ if not link.startswith('http://'):
+ link = u'http://%s%s' % (current_site.domain, link)
+ enc = None
+ if self.enc_url:
+ enc_url = getattr(obj, self.enc_url)
+ enc_length = getattr(obj, self.enc_length)
+ enc_mime_type = getattr(obj, self.enc_mime_type)
+ try:
+ enc_url = enc_url()
+ except TypeError:
+ pass
+ try:
+ enc_length = enc_length()
+ except TypeError:
+ pass
+ try:
+ enc_mime_type = enc_mime_type()
+ except TypeError:
+ pass
+ enc = feedgenerator.Enclosure(enc_url.decode('utf-8'),
+ (enc_length and str(enc_length).decode('utf-8') or ''), enc_mime_type.decode('utf-8'))
+ f.add_item(
+ title = title_template.render(Context({'obj': obj, 'site': current_site})).decode('utf-8'),
+ link = link,
+ description = description_template.render(Context({'obj': obj, 'site': current_site})).decode('utf-8'),
+ unique_id=link,
+ enclosure=enc,
+ )
+ return f
+
+ def _get_feed_generator_object(self, param):
+ current_site = sites.get_current()
+ link = self.link_cb(param).decode()
+ if not link.startswith('http://'):
+ link = u'http://%s%s' % (current_site.domain, link)
+ return feedgenerator.DefaultRssFeed(
+ title = self.title_cb(param).decode(),
+ link = link,
+ description = self.description_cb(param).decode(),
+ language = LANGUAGE_CODE.decode(),
+ )
+
+
+# global dict used by register_feed and get_registered_feed
+_registered_feeds = {}
+
+class FeedIsNotRegistered(Exception):
+ pass
+
+class FeedRequiresParam(Exception):
+ pass
+
+def register_feed(feed):
+ _registered_feeds[feed.slug] = feed
+
+def get_registered_feed(slug):
+ # try to load a RSS settings module so that feeds can be registered
+ try:
+ __import__(SETTINGS_MODULE + '_rss', '', '', [''])
+ except (KeyError, ImportError, ValueError):
+ pass
+ try:
+ return _registered_feeds[slug]
+ except KeyError:
+ raise FeedIsNotRegistered
+