Django

Code

root/django/branches/gis/django/contrib/gis/sitemaps.py

Revision 6108, 1.8 kB (checked in by jbronn, 1 year ago)

gis: added the beginnings of a maps module, for generating mapping framework JavaScript?; cleaned up the sitemaps module and KML templates; added shortcuts module.

  • Property svn:eol-style set to native
Line 
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.contrib.gis.shortcuts import render_to_kml
5 from django.db.models import get_model, get_models
6 from django.http import HttpResponse
7
8 class KMLSitemap(Sitemap):
9     """
10     A minimal hook to produce KML sitemaps.
11     """
12     def __init__(self, locations=None):
13         if locations is None:
14             self.locations = _build_kml_sources()
15         else:
16             self.locations = locations
17
18     def items(self):
19         return self.locations
20
21     def location(self, obj):
22         return urlresolvers.reverse('django.contrib.gis.sitemaps.kml',
23                                     kwargs={'label':obj[0],
24                                             'field_name':obj[1]})
25
26 def _build_kml_sources():
27     "Make a mapping of all available KML sources."
28     ret = []
29     for klass in get_models():
30         for field in klass._meta.fields:
31             if isinstance(field, GeometryField):
32                 label = "%s.%s" % (klass._meta.app_label,
33                                    klass._meta.module_name)
34                
35                 ret.append((label, field.name))
36     return ret
37
38
39 class KMLNotFound(Exception):
40     pass
41
42 def kml(request, label, field_name):
43     placemarks = []
44     klass = get_model(*label.split('.'))
45     if not klass:
46         raise KMLNotFound("You must supply a valid app.model label.  Got %s" % label)
47
48     #FIXME: GMaps apparently has a limit on size of displayed kml files
49     #  check if paginating w/ external refs (i.e. linked list) helps.
50     placemarks.extend(list(klass._default_manager.kml(field_name)[:100]))
51
52     #FIXME: other KML features?
53     return render_to_kml('gis/kml/placemarks.kml', {'places' : placemarks})
54
55    
Note: See TracBrowser for help on using the browser.