Improved syndication feed framework to use RequestSite if the sites framework is not installed -- i.e., the sites framework is no longer required to use the syndication feed framework. This is backwards incompatible if anybody has subclassed Feed and overridden __init__(), because the second parameter is now expected to be an HttpRequest object instead of request.path

git-svn-id: http://code.djangoproject.com/svn/django/trunk@5654 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Adrian Holovaty 2007-07-12 05:29:32 +00:00
parent dcd5750d7a
commit 090aa5210e
3 changed files with 25 additions and 7 deletions

View File

@ -1,6 +1,6 @@
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
from django.template import Context, loader, Template, TemplateDoesNotExist from django.template import Context, loader, Template, TemplateDoesNotExist
from django.contrib.sites.models import Site from django.contrib.sites.models import Site, RequestSite
from django.utils import feedgenerator from django.utils import feedgenerator
from django.utils.encoding import smart_unicode, iri_to_uri from django.utils.encoding import smart_unicode, iri_to_uri
from django.conf import settings from django.conf import settings
@ -22,9 +22,10 @@ class Feed(object):
title_template = None title_template = None
description_template = None description_template = None
def __init__(self, slug, feed_url): def __init__(self, slug, request):
self.slug = slug self.slug = slug
self.feed_url = feed_url self.request = request
self.feed_url = request.path
self.title_template_name = self.title_template or ('feeds/%s_title.html' % slug) self.title_template_name = self.title_template or ('feeds/%s_title.html' % slug)
self.description_template_name = self.description_template or ('feeds/%s_description.html' % slug) self.description_template_name = self.description_template or ('feeds/%s_description.html' % slug)
@ -67,7 +68,11 @@ class Feed(object):
else: else:
obj = None obj = None
current_site = Site.objects.get_current() if Site._meta.installed:
current_site = Site.objects.get_current()
else:
current_site = RequestSite(self.request)
link = self.__get_dynamic_attr('link', obj) link = self.__get_dynamic_attr('link', obj)
link = add_domain(current_site.domain, link) link = add_domain(current_site.domain, link)

View File

@ -16,7 +16,7 @@ def feed(request, url, feed_dict=None):
raise Http404, "Slug %r isn't registered." % slug raise Http404, "Slug %r isn't registered." % slug
try: try:
feedgen = f(slug, request.path).get_feed(param) feedgen = f(slug, request).get_feed(param)
except feeds.FeedDoesNotExist: except feeds.FeedDoesNotExist:
raise Http404, "Invalid feed parameters. Slug %r is valid, but other parameters, or lack thereof, are not." % slug raise Http404, "Invalid feed parameters. Slug %r is valid, but other parameters, or lack thereof, are not." % slug

View File

@ -31,6 +31,12 @@ To create a feed, just write a ``Feed`` class and point to it in your URLconf_.
Initialization Initialization
-------------- --------------
If you're not using the latest Django development version, you'll need to make
sure Django's sites framework is installed -- including its database table.
(See the `sites framework documentation`_ for more information.) This has
changed in the Django development version; the syndication feed framework no
longer requires the sites framework.
To activate syndication feeds on your Django site, add this line to your To activate syndication feeds on your Django site, add this line to your
URLconf_:: URLconf_::
@ -72,6 +78,7 @@ The above example registers two feeds:
Once that's set up, you just need to define the ``Feed`` classes themselves. Once that's set up, you just need to define the ``Feed`` classes themselves.
.. _sites framework documentation: ../sites/
.. _URLconf: ../url_dispatch/ .. _URLconf: ../url_dispatch/
.. _settings file: ../settings/ .. _settings file: ../settings/
@ -131,9 +138,14 @@ put into those elements.
* ``{{ obj }}`` -- The current object (one of whichever objects you * ``{{ obj }}`` -- The current object (one of whichever objects you
returned in ``items()``). returned in ``items()``).
* ``{{ site }}`` -- A ``django.models.core.sites.Site`` object * ``{{ site }}`` -- A ``django.contrib.sites.models.Site`` object
representing the current site. This is useful for representing the current site. This is useful for
``{{ site.domain }}`` or ``{{ site.name }}``. ``{{ site.domain }}`` or ``{{ site.name }}``. Note that if you're
using the latest Django development version and do *not* have the
Django sites framework installed, this will be set to a
``django.contrib.sites.models.RequestSite`` object. See the
`RequestSite section of the sites framework documentation`_ for
more.
If you don't create a template for either the title or description, the If you don't create a template for either the title or description, the
framework will use the template ``"{{ obj }}"`` by default -- that is, framework will use the template ``"{{ obj }}"`` by default -- that is,
@ -164,6 +176,7 @@ put into those elements.
.. _chicagocrime.org: http://www.chicagocrime.org/ .. _chicagocrime.org: http://www.chicagocrime.org/
.. _object-relational mapper: ../db-api/ .. _object-relational mapper: ../db-api/
.. _Django templates: ../templates/ .. _Django templates: ../templates/
.. _RequestSite section of the sites framework documentation: ../sites/#requestsite-objects
A complex example A complex example
----------------- -----------------