web/lib/django/contrib/gis/sitemaps/views.py
changeset 29 cc9b7e14412b
parent 0 0d40e90630ef
equal deleted inserted replaced
28:b758351d191f 29:cc9b7e14412b
     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)