summaryrefslogtreecommitdiffstats
path: root/webapp/django/contrib/gis/sitemaps/kml.py
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/django/contrib/gis/sitemaps/kml.py')
-rw-r--r--webapp/django/contrib/gis/sitemaps/kml.py63
1 files changed, 63 insertions, 0 deletions
diff --git a/webapp/django/contrib/gis/sitemaps/kml.py b/webapp/django/contrib/gis/sitemaps/kml.py
new file mode 100644
index 0000000000..d85744f0f9
--- /dev/null
+++ b/webapp/django/contrib/gis/sitemaps/kml.py
@@ -0,0 +1,63 @@
+from django.core import urlresolvers
+from django.contrib.sitemaps import Sitemap
+from django.contrib.gis.db.models.fields import GeometryField
+from django.db import models
+
+class KMLSitemap(Sitemap):
+ """
+ A minimal hook to produce KML sitemaps.
+ """
+ geo_format = 'kml'
+
+ def __init__(self, locations=None):
+ # If no locations specified, then we try to build for
+ # every model in installed applications.
+ self.locations = self._build_kml_sources(locations)
+
+ def _build_kml_sources(self, sources):
+ """
+ Goes through the given sources and returns a 3-tuple of
+ the application label, module name, and field name of every
+ GeometryField encountered in the sources.
+
+ If no sources are provided, then all models.
+ """
+ kml_sources = []
+ if sources is None:
+ sources = models.get_models()
+ for source in sources:
+ if isinstance(source, models.base.ModelBase):
+ for field in source._meta.fields:
+ if isinstance(field, GeometryField):
+ kml_sources.append((source._meta.app_label,
+ source._meta.module_name,
+ field.name))
+ elif isinstance(source, (list, tuple)):
+ if len(source) != 3:
+ raise ValueError('Must specify a 3-tuple of (app_label, module_name, field_name).')
+ kml_sources.append(source)
+ else:
+ raise TypeError('KML Sources must be a model or a 3-tuple.')
+ return kml_sources
+
+ def get_urls(self, page=1):
+ """
+ This method is overrridden so the appropriate `geo_format` attribute
+ is placed on each URL element.
+ """
+ urls = Sitemap.get_urls(self, page=page)
+ for url in urls: url['geo_format'] = self.geo_format
+ return urls
+
+ def items(self):
+ return self.locations
+
+ def location(self, obj):
+ return urlresolvers.reverse('django.contrib.gis.sitemaps.views.%s' % self.geo_format,
+ kwargs={'label' : obj[0],
+ 'model' : obj[1],
+ 'field_name': obj[2],
+ }
+ )
+class KMZSitemap(KMLSitemap):
+ geo_format = 'kmz'