PageRenderTime 48ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/django/contrib/gis/sitemaps/kml.py

https://code.google.com/p/mango-py/
Python | 63 lines | 41 code | 6 blank | 16 comment | 9 complexity | 15fdd38deef7d8d068e7ce3d98587235 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. from django.core import urlresolvers
  2. from django.contrib.sitemaps import Sitemap
  3. from django.contrib.gis.db.models.fields import GeometryField
  4. from django.db import models
  5. class KMLSitemap(Sitemap):
  6. """
  7. A minimal hook to produce KML sitemaps.
  8. """
  9. geo_format = 'kml'
  10. def __init__(self, locations=None):
  11. # If no locations specified, then we try to build for
  12. # every model in installed applications.
  13. self.locations = self._build_kml_sources(locations)
  14. def _build_kml_sources(self, sources):
  15. """
  16. Goes through the given sources and returns a 3-tuple of
  17. the application label, module name, and field name of every
  18. GeometryField encountered in the sources.
  19. If no sources are provided, then all models.
  20. """
  21. kml_sources = []
  22. if sources is None:
  23. sources = models.get_models()
  24. for source in sources:
  25. if isinstance(source, models.base.ModelBase):
  26. for field in source._meta.fields:
  27. if isinstance(field, GeometryField):
  28. kml_sources.append((source._meta.app_label,
  29. source._meta.module_name,
  30. field.name))
  31. elif isinstance(source, (list, tuple)):
  32. if len(source) != 3:
  33. raise ValueError('Must specify a 3-tuple of (app_label, module_name, field_name).')
  34. kml_sources.append(source)
  35. else:
  36. raise TypeError('KML Sources must be a model or a 3-tuple.')
  37. return kml_sources
  38. def get_urls(self, page=1, site=None):
  39. """
  40. This method is overrridden so the appropriate `geo_format` attribute
  41. is placed on each URL element.
  42. """
  43. urls = Sitemap.get_urls(self, page=page, site=site)
  44. for url in urls: url['geo_format'] = self.geo_format
  45. return urls
  46. def items(self):
  47. return self.locations
  48. def location(self, obj):
  49. return urlresolvers.reverse('django.contrib.gis.sitemaps.views.%s' % self.geo_format,
  50. kwargs={'label' : obj[0],
  51. 'model' : obj[1],
  52. 'field_name': obj[2],
  53. }
  54. )
  55. class KMZSitemap(KMLSitemap):
  56. geo_format = 'kmz'