web/lib/django/contrib/gis/admin/options.py
author ymh <ymh.work@gmail.com>
Wed, 02 Jun 2010 18:57:35 +0200
changeset 38 77b6da96e6f1
permissions -rw-r--r--
update django
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
from django.conf import settings
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
from django.contrib.admin import ModelAdmin
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
from django.contrib.gis.admin.widgets import OpenLayersWidget
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
from django.contrib.gis.gdal import OGRGeomType
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
from django.contrib.gis.db import models
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
class GeoModelAdmin(ModelAdmin):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
    The administration options class for Geographic models. Map settings
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
    may be overloaded from their defaults to create custom maps.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
    """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
    # The default map settings that may be overloaded -- still subject
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
    # to API changes.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
    default_lon = 0
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    default_lat = 0
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    default_zoom = 4
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
    display_wkt = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    display_srid = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    extra_js = []
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    num_zoom = 18
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    max_zoom = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    min_zoom = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    units = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    max_resolution = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    max_extent = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    modifiable = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    mouse_position = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    scale_text = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    layerswitcher = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    scrollable = True
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
    map_width = 600
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    map_height = 400
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    map_srid = 4326
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    map_template = 'gis/admin/openlayers.html'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    openlayers_url = 'http://openlayers.org/api/2.8/OpenLayers.js'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
    point_zoom = num_zoom - 6
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    wms_url = 'http://labs.metacarta.com/wms/vmap0'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    wms_layer = 'basic'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    wms_name = 'OpenLayers WMS'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    debug = False
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
    widget = OpenLayersWidget
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    def _media(self):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
        "Injects OpenLayers JavaScript into the admin."
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        media = super(GeoModelAdmin, self)._media()
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        media.add_js([self.openlayers_url])
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
        media.add_js(self.extra_js)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        return media
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    media = property(_media)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    def formfield_for_dbfield(self, db_field, **kwargs):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        Overloaded from ModelAdmin so that an OpenLayersWidget is used
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
        for viewing/editing GeometryFields.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
        if isinstance(db_field, models.GeometryField):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
            request = kwargs.pop('request', None)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
            # Setting the widget with the newly defined widget.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
            kwargs['widget'] = self.get_map_widget(db_field)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
            return db_field.formfield(**kwargs)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
            return super(GeoModelAdmin, self).formfield_for_dbfield(db_field, **kwargs)
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
    def get_map_widget(self, db_field):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        Returns a subclass of the OpenLayersWidget (or whatever was specified
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        in the `widget` attribute) using the settings from the attributes set
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
        in this class.
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
        """
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        is_collection = db_field.geom_type in ('MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON', 'GEOMETRYCOLLECTION')
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
        if is_collection:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
            if db_field.geom_type == 'GEOMETRYCOLLECTION': collection_type = 'Any'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
            else: collection_type = OGRGeomType(db_field.geom_type.replace('MULTI', ''))
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        else:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
            collection_type = 'None'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
        class OLMap(self.widget):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
            template = self.map_template
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
            geom_type = db_field.geom_type
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
            params = {'default_lon' : self.default_lon,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
                      'default_lat' : self.default_lat,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
                      'default_zoom' : self.default_zoom,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
                      'display_wkt' : self.debug or self.display_wkt,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
                      'geom_type' : OGRGeomType(db_field.geom_type),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
                      'field_name' : db_field.name,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
                      'is_collection' : is_collection,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
                      'scrollable' : self.scrollable,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
                      'layerswitcher' : self.layerswitcher,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
                      'collection_type' : collection_type,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
                      'is_linestring' : db_field.geom_type in ('LINESTRING', 'MULTILINESTRING'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
                      'is_polygon' : db_field.geom_type in ('POLYGON', 'MULTIPOLYGON'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
                      'is_point' : db_field.geom_type in ('POINT', 'MULTIPOINT'),
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
                      'num_zoom' : self.num_zoom,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
                      'max_zoom' : self.max_zoom,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
                      'min_zoom' : self.min_zoom,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
                      'units' : self.units, #likely shoud get from object
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
                      'max_resolution' : self.max_resolution,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
                      'max_extent' : self.max_extent,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
                      'modifiable' : self.modifiable,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
                      'mouse_position' : self.mouse_position,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
                      'scale_text' : self.scale_text,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
                      'map_width' : self.map_width,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
                      'map_height' : self.map_height,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
                      'point_zoom' : self.point_zoom,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
                      'srid' : self.map_srid,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
                      'display_srid' : self.display_srid,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
                      'wms_url' : self.wms_url,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
                      'wms_layer' : self.wms_layer,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
                      'wms_name' : self.wms_name,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
                      'debug' : self.debug,
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
                      }
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        return OLMap
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
from django.contrib.gis import gdal
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
if gdal.HAS_GDAL:
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    class OSMGeoAdmin(GeoModelAdmin):
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        map_template = 'gis/admin/osm.html'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        extra_js = ['http://openstreetmap.org/openlayers/OpenStreetMap.js']
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        num_zoom = 20
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        map_srid = 900913
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        max_extent = '-20037508,-20037508,20037508,20037508'
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        max_resolution = 156543.0339
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
        point_zoom = num_zoom - 6
77b6da96e6f1 update django
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        units = 'm'