From 3fe0c69332299dc1d518cc3a4f84bf435deecc1d Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Tue, 28 Jun 2011 10:16:34 +0000 Subject: [PATCH] Fixed #10907, #14190 and #15829 -- Pass item to sitemaps template to allow further customization like Google News enabled sitemaps. Thanks, manfre and lakinwecker. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16474 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/sitemaps/__init__.py | 3 +- django/contrib/sitemaps/tests/basic.py | 13 ++++- django/contrib/sitemaps/views.py | 5 +- docs/ref/contrib/sitemaps.txt | 71 +++++++++++++++++++++++--- 4 files changed, 80 insertions(+), 12 deletions(-) diff --git a/django/contrib/sitemaps/__init__.py b/django/contrib/sitemaps/__init__.py index 6b8d5a03d1..98ab353606 100644 --- a/django/contrib/sitemaps/__init__.py +++ b/django/contrib/sitemaps/__init__.py @@ -76,10 +76,11 @@ class Sitemap(object): loc = "http://%s%s" % (site.domain, self.__get('location', item)) priority = self.__get('priority', item, None) url_info = { + 'item': item, 'location': loc, 'lastmod': self.__get('lastmod', item, None), 'changefreq': self.__get('changefreq', item, None), - 'priority': str(priority is not None and priority or '') + 'priority': str(priority is not None and priority or ''), } urls.append(url_info) return urls diff --git a/django/contrib/sitemaps/tests/basic.py b/django/contrib/sitemaps/tests/basic.py index cbc5c49872..2b02b78741 100644 --- a/django/contrib/sitemaps/tests/basic.py +++ b/django/contrib/sitemaps/tests/basic.py @@ -2,7 +2,7 @@ import os from datetime import date from django.conf import settings from django.contrib.auth.models import User -from django.contrib.sitemaps import Sitemap +from django.contrib.sitemaps import Sitemap, GenericSitemap from django.contrib.sites.models import Site from django.core.exceptions import ImproperlyConfigured from django.test import TestCase @@ -171,3 +171,14 @@ class SitemapTests(TestCase): """ Site._meta.installed = False self.assertRaises(ImproperlyConfigured, Sitemap().get_urls) + + def test_sitemap_item(self): + """ + Check to make sure that the raw item is included with each + Sitemap.get_url() url result. + """ + user_sitemap = GenericSitemap({'queryset': User.objects.all()}) + def is_user(url): + return isinstance(url['item'], User) + item_in_url_info = all(map(is_user, user_sitemap.get_urls())) + self.assertTrue(item_in_url_info) diff --git a/django/contrib/sitemaps/views.py b/django/contrib/sitemaps/views.py index 83094402c6..454db40420 100644 --- a/django/contrib/sitemaps/views.py +++ b/django/contrib/sitemaps/views.py @@ -36,9 +36,8 @@ def sitemap(request, sitemaps, section=None, template_name='sitemap.xml'): for site in maps: try: if callable(site): - urls.extend(site().get_urls(page=page, site=current_site)) - else: - urls.extend(site.get_urls(page=page, site=current_site)) + site = site() + urls.extend(site.get_urls(page=page, site=current_site)) except EmptyPage: raise Http404("Page %s empty" % page) except PageNotAnInteger: diff --git a/docs/ref/contrib/sitemaps.txt b/docs/ref/contrib/sitemaps.txt index d7dcc2e512..6d8fe61f35 100644 --- a/docs/ref/contrib/sitemaps.txt +++ b/docs/ref/contrib/sitemaps.txt @@ -284,10 +284,10 @@ Here's what the relevant URLconf lines would look like for the example above:: (r'^sitemap-(?P
.+)\.xml$', 'sitemap', {'sitemaps': sitemaps}), ) -This will automatically generate a :file:`sitemap.xml` file that references both -:file:`sitemap-flatpages.xml` and :file:`sitemap-blog.xml`. The -:class:`~django.contrib.sitemaps.Sitemap` classes and the :data:`sitemaps` dict -don't change at all. +This will automatically generate a :file:`sitemap.xml` file that references +both :file:`sitemap-flatpages.xml` and :file:`sitemap-blog.xml`. The +:class:`~django.contrib.sitemaps.Sitemap` classes and the :data:`sitemaps` +dict don't change at all. You should create an index file if one of your sitemaps has more than 50,000 URLs. In this case, Django will automatically paginate the sitemap, and the @@ -298,9 +298,9 @@ index will reflect that. Template customization ====================== -If you wish to use a different template for each sitemap or sitemap index available on your site, -you may specify it by passing a `template_name` parameter to the `sitemap` and `index` views via -the URLconf:: +If you wish to use a different template for each sitemap or sitemap index +available on your site, you may specify it by passing a ``template_name`` +parameter to the ``sitemap`` and ``index`` views via the URLconf:: urlpatterns = patterns('django.contrib.sitemaps.views', (r'^custom-sitemap\.xml$', 'index', { @@ -313,6 +313,63 @@ the URLconf:: }), ) +Context variables +------------------ + +When customizing the templates for the :func:`~django.contrib.sitemaps.views.index` +and ~:func:`django.contrib.sitemaps.views.sitemaps` views, you can rely on the +following context variables. + +Index +----- + +The variable :data:`sitemaps` is a list of absolute URLs to each of the sitemaps. + +Sitemap +------- + +The variable :data:`urlset` is a list of URLs that should appear in the +sitemap. Each URL exposes attributes as defined in the +:class:`~django.contrib.sitemaps.Sitemap` class: + + - ``changefreq`` + - ``item`` + - ``lastmod`` + - ``location`` + - ``priority`` + +.. versionadded:: 1.4 + +The ``item`` attribute has been added for each URL to allow more flexible +customization of the templates, such as `Google news sitemaps`_. Assuming +Sitemap's :attr:`~Sitemap.items()` would return a list of items with +``publication_data`` and a ``tags`` field something like this would +generate a Google News compatible sitemap: + +.. code-block:: xml+django + + + + {% spaceless %} + {% for url in urlset %} + + {{ url.location }} + {% if url.lastmod %}{{ url.lastmod|date:"Y-m-d" }}{% endif %} + {% if url.changefreq %}{{ url.changefreq }}{% endif %} + {% if url.priority %}{{ url.priority }}{% endif %} + + {% if url.item.publication_date %}{{ url.item.publication_date|date:"Y-m-d" }}{% endif %} + {% if url.item.tags %}{{ url.item.tags }}{% endif %} + + + {% endfor %} + {% endspaceless %} + + +.. _`Google news sitemaps`: http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=74288 + Pinging Google ==============