1 from django.http import HttpResponse, Http404 |
1 from django.http import HttpResponse, Http404 |
2 from django.template import loader |
2 from django.template import loader |
3 from django.contrib.gis.db.backend import SpatialBackend |
|
4 from django.contrib.sites.models import Site |
3 from django.contrib.sites.models import Site |
5 from django.core import urlresolvers |
4 from django.core import urlresolvers |
6 from django.core.paginator import EmptyPage, PageNotAnInteger |
5 from django.core.paginator import EmptyPage, PageNotAnInteger |
|
6 from django.contrib.gis.db.models.fields import GeometryField |
|
7 from django.db import connections, DEFAULT_DB_ALIAS |
7 from django.db.models import get_model |
8 from django.db.models import get_model |
8 from django.contrib.gis.db.models.fields import GeometryField |
|
9 from django.utils.encoding import smart_str |
9 from django.utils.encoding import smart_str |
10 |
10 |
11 from django.contrib.gis.shortcuts import render_to_kml, render_to_kmz |
11 from django.contrib.gis.shortcuts import render_to_kml, render_to_kmz |
12 |
12 |
13 def index(request, sitemaps): |
13 def index(request, sitemaps): |
23 pages = site().paginator.num_pages |
23 pages = site().paginator.num_pages |
24 else: |
24 else: |
25 pages = site.paginator.num_pages |
25 pages = site.paginator.num_pages |
26 sitemap_url = urlresolvers.reverse('django.contrib.gis.sitemaps.views.sitemap', kwargs={'section': section}) |
26 sitemap_url = urlresolvers.reverse('django.contrib.gis.sitemaps.views.sitemap', kwargs={'section': section}) |
27 sites.append('%s://%s%s' % (protocol, current_site.domain, sitemap_url)) |
27 sites.append('%s://%s%s' % (protocol, current_site.domain, sitemap_url)) |
28 |
28 |
29 if pages > 1: |
29 if pages > 1: |
30 for page in range(2, pages+1): |
30 for page in range(2, pages+1): |
31 sites.append('%s://%s%s?p=%s' % (protocol, current_site.domain, sitemap_url, page)) |
31 sites.append('%s://%s%s?p=%s' % (protocol, current_site.domain, sitemap_url, page)) |
32 xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': sites}) |
32 xml = loader.render_to_string('sitemap_index.xml', {'sitemaps': sites}) |
33 return HttpResponse(xml, mimetype='application/xml') |
33 return HttpResponse(xml, mimetype='application/xml') |
57 except PageNotAnInteger: |
57 except PageNotAnInteger: |
58 raise Http404("No page '%s'" % page) |
58 raise Http404("No page '%s'" % page) |
59 xml = smart_str(loader.render_to_string('gis/sitemaps/geo_sitemap.xml', {'urlset': urls})) |
59 xml = smart_str(loader.render_to_string('gis/sitemaps/geo_sitemap.xml', {'urlset': urls})) |
60 return HttpResponse(xml, mimetype='application/xml') |
60 return HttpResponse(xml, mimetype='application/xml') |
61 |
61 |
62 def kml(request, label, model, field_name=None, compress=False): |
62 def kml(request, label, model, field_name=None, compress=False, using=DEFAULT_DB_ALIAS): |
63 """ |
63 """ |
64 This view generates KML for the given app label, model, and field name. |
64 This view generates KML for the given app label, model, and field name. |
65 |
65 |
66 The model's default manager must be GeoManager, and the field name |
66 The model's default manager must be GeoManager, and the field name |
67 must be that of a geographic field. |
67 must be that of a geographic field. |
77 if not isinstance(info[0], GeometryField): |
77 if not isinstance(info[0], GeometryField): |
78 raise Exception |
78 raise Exception |
79 except: |
79 except: |
80 raise Http404('Invalid geometry field.') |
80 raise Http404('Invalid geometry field.') |
81 |
81 |
82 if SpatialBackend.postgis: |
82 connection = connections[using] |
|
83 |
|
84 if connection.ops.postgis: |
83 # PostGIS will take care of transformation. |
85 # PostGIS will take care of transformation. |
84 placemarks = klass._default_manager.kml(field_name=field_name) |
86 placemarks = klass._default_manager.using(using).kml(field_name=field_name) |
85 else: |
87 else: |
86 # There's no KML method on Oracle or MySQL, so we use the `kml` |
88 # There's no KML method on Oracle or MySQL, so we use the `kml` |
87 # attribute of the lazy geometry instead. |
89 # attribute of the lazy geometry instead. |
88 placemarks = [] |
90 placemarks = [] |
89 if SpatialBackend.oracle: |
91 if connection.ops.oracle: |
90 qs = klass._default_manager.transform(4326, field_name=field_name) |
92 qs = klass._default_manager.using(using).transform(4326, field_name=field_name) |
91 else: |
93 else: |
92 qs = klass._default_manager.all() |
94 qs = klass._default_manager.using(using).all() |
93 for mod in qs: |
95 for mod in qs: |
94 setattr(mod, 'kml', getattr(mod, field_name).kml) |
96 setattr(mod, 'kml', getattr(mod, field_name).kml) |
95 placemarks.append(mod) |
97 placemarks.append(mod) |
96 |
98 |
97 # Getting the render function and rendering to the correct. |
99 # Getting the render function and rendering to the correct. |
99 render = render_to_kmz |
101 render = render_to_kmz |
100 else: |
102 else: |
101 render = render_to_kml |
103 render = render_to_kml |
102 return render('gis/kml/placemarks.kml', {'places' : placemarks}) |
104 return render('gis/kml/placemarks.kml', {'places' : placemarks}) |
103 |
105 |
104 def kmz(request, label, model, field_name=None): |
106 def kmz(request, label, model, field_name=None, using=DEFAULT_DB_ALIAS): |
105 """ |
107 """ |
106 This view returns KMZ for the given app label, model, and field name. |
108 This view returns KMZ for the given app label, model, and field name. |
107 """ |
109 """ |
108 return kml(request, label, model, field_name, True) |
110 return kml(request, label, model, field_name, compress=True, using=using) |