diff --git a/django/contrib/gis/sitemaps/__init__.py b/django/contrib/gis/sitemaps/__init__.py index 4da3400a7cb..7337e65a9c7 100644 --- a/django/contrib/gis/sitemaps/__init__.py +++ b/django/contrib/gis/sitemaps/__init__.py @@ -1,5 +1,4 @@ # Geo-enabled Sitemap classes. -from django.contrib.gis.sitemaps.georss import GeoRSSSitemap from django.contrib.gis.sitemaps.kml import KMLSitemap, KMZSitemap -__all__ = ['GeoRSSSitemap', 'KMLSitemap', 'KMZSitemap'] +__all__ = ['KMLSitemap', 'KMZSitemap'] diff --git a/django/contrib/gis/sitemaps/georss.py b/django/contrib/gis/sitemaps/georss.py deleted file mode 100644 index effa06f98e9..00000000000 --- a/django/contrib/gis/sitemaps/georss.py +++ /dev/null @@ -1,55 +0,0 @@ -from django.core import urlresolvers -from django.contrib.sitemaps import Sitemap - - -class GeoRSSSitemap(Sitemap): - """ - A minimal hook to produce sitemaps for GeoRSS feeds. - """ - def __init__(self, feed_dict, slug_dict=None): - """ - This sitemap object initializes on a feed dictionary (as would be passed - to `django.contrib.gis.views.feed`) and a slug dictionary. - If the slug dictionary is not defined, then it's assumed the keys provide - the URL parameter to the feed. However, if you have a complex feed (e.g., - you override `get_object`, then you'll need to provide a slug dictionary. - The slug dictionary should have the same keys as the feed dictionary, but - each value in the slug dictionary should be a sequence of slugs that may - be used for valid feeds. For example, let's say we have a feed that - returns objects for a specific ZIP code in our feed dictionary: - - feed_dict = {'zipcode' : ZipFeed} - - Then we would use a slug dictionary with a list of the zip code slugs - corresponding to feeds you want listed in the sitemap: - - slug_dict = {'zipcode' : ['77002', '77054']} - """ - # Setting up. - self.feed_dict = feed_dict - self.locations = [] - if slug_dict is None: - slug_dict = {} - # Getting the feed locations. - for section in feed_dict.keys(): - if slug_dict.get(section, False): - for slug in slug_dict[section]: - self.locations.append('%s/%s' % (section, slug)) - else: - self.locations.append(section) - - def get_urls(self, page=1, site=None): - """ - This method is overrridden so the appropriate `geo_format` attribute - is placed on each URL element. - """ - urls = Sitemap.get_urls(self, page=page, site=site) - for url in urls: - url['geo_format'] = 'georss' - return urls - - def items(self): - return self.locations - - def location(self, obj): - return urlresolvers.reverse('django.contrib.gis.views.feed', args=(obj,)) diff --git a/django/contrib/gis/sitemaps/kml.py b/django/contrib/gis/sitemaps/kml.py index 74d7acd772c..d052cf63506 100644 --- a/django/contrib/gis/sitemaps/kml.py +++ b/django/contrib/gis/sitemaps/kml.py @@ -42,12 +42,12 @@ class KMLSitemap(Sitemap): raise TypeError('KML Sources must be a model or a 3-tuple.') return kml_sources - def get_urls(self, page=1, site=None): + def get_urls(self, page=1, site=None, protocol=None): """ This method is overrridden so the appropriate `geo_format` attribute is placed on each URL element. """ - urls = Sitemap.get_urls(self, page=page, site=site) + urls = Sitemap.get_urls(self, page=page, site=site, protocol=protocol) for url in urls: url['geo_format'] = self.geo_format return urls diff --git a/django/contrib/gis/sitemaps/views.py b/django/contrib/gis/sitemaps/views.py index be995166899..13c24d5bf04 100644 --- a/django/contrib/gis/sitemaps/views.py +++ b/django/contrib/gis/sitemaps/views.py @@ -1,77 +1,11 @@ from __future__ import unicode_literals -import warnings - from django.apps import apps -from django.http import HttpResponse, Http404 -from django.template import loader -from django.contrib.sites.shortcuts import get_current_site -from django.core import urlresolvers -from django.core.paginator import EmptyPage, PageNotAnInteger +from django.http import Http404 from django.contrib.gis.db.models.fields import GeometryField +from django.contrib.gis.shortcuts import render_to_kml, render_to_kmz from django.db import connections, DEFAULT_DB_ALIAS from django.db.models.fields import FieldDoesNotExist -from django.utils import six -from django.utils.deprecation import RemovedInDjango18Warning -from django.utils.translation import ugettext as _ - -from django.contrib.gis.shortcuts import render_to_kml, render_to_kmz - - -def index(request, sitemaps): - """ - This view generates a sitemap index that uses the proper view - for resolving geographic section sitemap URLs. - """ - warnings.warn("Geo Sitemaps are deprecated. Use plain sitemaps from " - "django.contrib.sitemaps instead", RemovedInDjango18Warning, stacklevel=2) - current_site = get_current_site(request) - sites = [] - protocol = request.scheme - for section, site in sitemaps.items(): - if callable(site): - pages = site().paginator.num_pages - else: - pages = site.paginator.num_pages - sitemap_url = urlresolvers.reverse('django.contrib.gis.sitemaps.views.sitemap', kwargs={'section': section}) - sites.append('%s://%s%s' % (protocol, current_site.domain, sitemap_url)) - - if pages > 1: - for page in range(2, pages + 1): - sites.append('%s://%s%s?p=%s' % (protocol, current_site.domain, sitemap_url, page)) - xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': sites}) - return HttpResponse(xml, content_type='application/xml') - - -def sitemap(request, sitemaps, section=None): - """ - This view generates a sitemap with additional geographic - elements defined by Google. - """ - warnings.warn("Geo Sitemaps are deprecated. Use plain sitemaps from " - "django.contrib.sitemaps instead", RemovedInDjango18Warning, stacklevel=2) - maps, urls = [], [] - if section is not None: - if section not in sitemaps: - raise Http404(_("No sitemap available for section: %r") % section) - maps.append(sitemaps[section]) - else: - maps = list(six.itervalues(sitemaps)) - - page = request.GET.get("p", 1) - current_site = get_current_site(request) - 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)) - except EmptyPage: - raise Http404(_("Page %s empty") % page) - except PageNotAnInteger: - raise Http404(_("No page '%s'") % page) - xml = loader.render_to_string('gis/sitemaps/geo_sitemap.xml', {'urlset': urls}) - return HttpResponse(xml, content_type='application/xml') def kml(request, label, model, field_name=None, compress=False, using=DEFAULT_DB_ALIAS): diff --git a/django/contrib/gis/templates/gis/sitemaps/geo_sitemap.xml b/django/contrib/gis/templates/gis/sitemaps/geo_sitemap.xml deleted file mode 100644 index dbf858e40db..00000000000 --- a/django/contrib/gis/templates/gis/sitemaps/geo_sitemap.xml +++ /dev/null @@ -1,17 +0,0 @@ -{% autoescape off %} - -{% spaceless %} -{% for url in urlset %} - - {{ url.location|escape }} - {% if url.lastmod %}{{ url.lastmod|date:"Y-m-d" }}{% endif %} - {% if url.changefreq %}{{ url.changefreq }}{% endif %} - {% if url.priority %}{{ url.priority }}{% endif %} - {% if url.geo_format %} - {{ url.geo_format }} - {% endif %} - -{% endfor %} -{% endspaceless %} - -{% endautoescape %} diff --git a/django/contrib/gis/tests/geoapp/sitemaps.py b/django/contrib/gis/tests/geoapp/sitemaps.py index 68490ace2f1..16f1f0146e8 100644 --- a/django/contrib/gis/tests/geoapp/sitemaps.py +++ b/django/contrib/gis/tests/geoapp/sitemaps.py @@ -1,10 +1,8 @@ -from django.contrib.gis.sitemaps import GeoRSSSitemap, KMLSitemap, KMZSitemap +from django.contrib.gis.sitemaps import KMLSitemap, KMZSitemap -from .feeds import feed_dict from .models import City, Country sitemaps = {'kml': KMLSitemap([City, Country]), 'kmz': KMZSitemap([City, Country]), - 'georss': GeoRSSSitemap(feed_dict), } diff --git a/django/contrib/gis/tests/geoapp/test_sitemaps.py b/django/contrib/gis/tests/geoapp/test_sitemaps.py index c41cc53674c..f4dc5e80d24 100644 --- a/django/contrib/gis/tests/geoapp/test_sitemaps.py +++ b/django/contrib/gis/tests/geoapp/test_sitemaps.py @@ -3,7 +3,6 @@ from __future__ import unicode_literals from io import BytesIO from unittest import skipUnless from xml.dom import minidom -import os import zipfile from django.conf import settings @@ -11,16 +10,14 @@ from django.contrib.gis.geos import HAS_GEOS from django.contrib.gis.tests.utils import HAS_SPATIAL_DB from django.contrib.sites.models import Site from django.test import TestCase, modify_settings -from django.test.utils import IgnoreDeprecationWarningsMixin -from django.utils._os import upath if HAS_GEOS: from .models import City, Country -@modify_settings(INSTALLED_APPS={'append': 'django.contrib.sites'}) +@modify_settings(INSTALLED_APPS={'append': ['django.contrib.sites', 'django.contrib.sitemaps']}) @skipUnless(HAS_GEOS and HAS_SPATIAL_DB, "Geos and spatial db are required.") -class GeoSitemapTest(IgnoreDeprecationWarningsMixin, TestCase): +class GeoSitemapTest(TestCase): urls = 'django.contrib.gis.tests.geoapp.urls' @@ -34,36 +31,19 @@ class GeoSitemapTest(IgnoreDeprecationWarningsMixin, TestCase): expected = set(expected) self.assertEqual(actual, expected) - def test_geositemap_index(self): - "Tests geographic sitemap index." - # Getting the geo index. - from django.contrib import sitemaps - template_dirs = settings.TEMPLATE_DIRS + ( - os.path.join(os.path.dirname(upath(sitemaps.__file__)), 'templates'),) - with self.settings(TEMPLATE_DIRS=template_dirs): - doc = minidom.parseString(self.client.get('/sitemap.xml').content) - index = doc.firstChild - self.assertEqual(index.getAttribute('xmlns'), 'http://www.sitemaps.org/schemas/sitemap/0.9') - self.assertEqual(3, len(index.getElementsByTagName('sitemap'))) - def test_geositemap_kml(self): "Tests KML/KMZ geographic sitemaps." for kml_type in ('kml', 'kmz'): doc = minidom.parseString(self.client.get('/sitemaps/%s.xml' % kml_type).content) - # Ensuring the right sitemaps namespaces are present. + # Ensuring the right sitemaps namespace is present. urlset = doc.firstChild self.assertEqual(urlset.getAttribute('xmlns'), 'http://www.sitemaps.org/schemas/sitemap/0.9') - self.assertEqual(urlset.getAttribute('xmlns:geo'), 'http://www.google.com/geo/schemas/sitemap/1.0') urls = urlset.getElementsByTagName('url') self.assertEqual(2, len(urls)) # Should only be 2 sitemaps. for url in urls: - self.assertChildNodes(url, ['loc', 'geo:geo']) - # Making sure the 'geo:format' element was properly set. - geo_elem = url.getElementsByTagName('geo:geo')[0] - geo_format = geo_elem.getElementsByTagName('geo:format')[0] - self.assertEqual(kml_type, geo_format.childNodes[0].data) + self.assertChildNodes(url, ['loc']) # Getting the relative URL since we don't have a real site. kml_url = url.getElementsByTagName('loc')[0].childNodes[0].data.split('http://example.com')[1] @@ -84,25 +64,3 @@ class GeoSitemapTest(IgnoreDeprecationWarningsMixin, TestCase): elif 'country' in kml_url: model = Country self.assertEqual(model.objects.count(), len(kml_doc.getElementsByTagName('Placemark'))) - - def test_geositemap_georss(self): - "Tests GeoRSS geographic sitemaps." - from .feeds import feed_dict - - doc = minidom.parseString(self.client.get('/sitemaps/georss.xml').content) - - # Ensuring the right sitemaps namespaces are present. - urlset = doc.firstChild - self.assertEqual(urlset.getAttribute('xmlns'), 'http://www.sitemaps.org/schemas/sitemap/0.9') - self.assertEqual(urlset.getAttribute('xmlns:geo'), 'http://www.google.com/geo/schemas/sitemap/1.0') - - # Making sure the correct number of feed URLs were included. - urls = urlset.getElementsByTagName('url') - self.assertEqual(len(feed_dict), len(urls)) - - for url in urls: - self.assertChildNodes(url, ['loc', 'geo:geo']) - # Making sure the 'geo:format' element was properly set to 'georss'. - geo_elem = url.getElementsByTagName('geo:geo')[0] - geo_format = geo_elem.getElementsByTagName('geo:format')[0] - self.assertEqual('georss', geo_format.childNodes[0].data) diff --git a/django/contrib/gis/tests/geoapp/urls.py b/django/contrib/gis/tests/geoapp/urls.py index 6aba9e525ae..a81ab0a85bd 100644 --- a/django/contrib/gis/tests/geoapp/urls.py +++ b/django/contrib/gis/tests/geoapp/urls.py @@ -10,9 +10,11 @@ urlpatterns = patterns('', (r'^feeds/(?P.*)/$', 'django.contrib.gis.views.feed', {'feed_dict': feed_dict}), ) -urlpatterns += patterns('django.contrib.gis.sitemaps.views', - (r'^sitemap.xml$', 'index', {'sitemaps': sitemaps}), +urlpatterns += patterns('django.contrib.sitemaps.views', (r'^sitemaps/(?P
\w+)\.xml$', 'sitemap', {'sitemaps': sitemaps}), +) + +urlpatterns += patterns('django.contrib.gis.sitemaps.views', (r'^sitemaps/kml/(?P