mirror of https://github.com/django/django.git
Fixed #9664 -- `LayerMapping` now works with MySQL spatial backends.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@9688 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
d39540af92
commit
50cd258a24
|
@ -29,7 +29,7 @@ def geo_suite():
|
||||||
elif postgis:
|
elif postgis:
|
||||||
test_models += ['distapp', 'layermap', 'relatedapp']
|
test_models += ['distapp', 'layermap', 'relatedapp']
|
||||||
elif mysql:
|
elif mysql:
|
||||||
test_models += ['relatedapp']
|
test_models += ['relatedapp', 'layermap']
|
||||||
|
|
||||||
test_suite_names += [
|
test_suite_names += [
|
||||||
'test_gdal_driver',
|
'test_gdal_driver',
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import os, unittest
|
import os, unittest
|
||||||
from copy import copy
|
from copy import copy
|
||||||
from datetime import date
|
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from models import City, County, CountyFeat, Interstate, State, city_mapping, co_mapping, cofeat_mapping, inter_mapping
|
from models import City, County, CountyFeat, Interstate, State, city_mapping, co_mapping, cofeat_mapping, inter_mapping
|
||||||
|
from django.contrib.gis.db.backend import SpatialBackend
|
||||||
from django.contrib.gis.utils.layermapping import LayerMapping, LayerMapError, InvalidDecimal, MissingForeignKey
|
from django.contrib.gis.utils.layermapping import LayerMapping, LayerMapError, InvalidDecimal, MissingForeignKey
|
||||||
from django.contrib.gis.gdal import DataSource
|
from django.contrib.gis.gdal import DataSource
|
||||||
|
|
||||||
|
@ -85,7 +85,8 @@ class LayerMapTest(unittest.TestCase):
|
||||||
lm = LayerMapping(Interstate, inter_shp, inter_mapping)
|
lm = LayerMapping(Interstate, inter_shp, inter_mapping)
|
||||||
lm.save(silent=True, strict=True)
|
lm.save(silent=True, strict=True)
|
||||||
except InvalidDecimal:
|
except InvalidDecimal:
|
||||||
pass
|
# No transactions for geoms on MySQL; delete added features.
|
||||||
|
if SpatialBackend.mysql: Interstate.objects.all().delete()
|
||||||
else:
|
else:
|
||||||
self.fail('Should have failed on strict import with invalid decimal values.')
|
self.fail('Should have failed on strict import with invalid decimal values.')
|
||||||
|
|
||||||
|
@ -151,7 +152,8 @@ class LayerMapTest(unittest.TestCase):
|
||||||
self.assertRaises(e, LayerMapping, County, co_shp, co_mapping, transform=False, unique=arg)
|
self.assertRaises(e, LayerMapping, County, co_shp, co_mapping, transform=False, unique=arg)
|
||||||
|
|
||||||
# No source reference system defined in the shapefile, should raise an error.
|
# No source reference system defined in the shapefile, should raise an error.
|
||||||
self.assertRaises(LayerMapError, LayerMapping, County, co_shp, co_mapping)
|
if not SpatialBackend.mysql:
|
||||||
|
self.assertRaises(LayerMapError, LayerMapping, County, co_shp, co_mapping)
|
||||||
|
|
||||||
# Passing in invalid ForeignKey mapping parameters -- must be a dictionary
|
# Passing in invalid ForeignKey mapping parameters -- must be a dictionary
|
||||||
# mapping for the model the ForeignKey points to.
|
# mapping for the model the ForeignKey points to.
|
||||||
|
@ -227,8 +229,9 @@ class LayerMapTest(unittest.TestCase):
|
||||||
lm.save(fid_range=slice(None, 1), silent=True, strict=True) # layer[:1]
|
lm.save(fid_range=slice(None, 1), silent=True, strict=True) # layer[:1]
|
||||||
|
|
||||||
# Only Pueblo & Honolulu counties should be present because of
|
# Only Pueblo & Honolulu counties should be present because of
|
||||||
# the `unique` keyword.
|
# the `unique` keyword. Have to set `order_by` on this QuerySet
|
||||||
qs = County.objects.all()
|
# or else MySQL will return a different ordering than the other dbs.
|
||||||
|
qs = County.objects.order_by('name')
|
||||||
self.assertEqual(2, qs.count())
|
self.assertEqual(2, qs.count())
|
||||||
hi, co = tuple(qs)
|
hi, co = tuple(qs)
|
||||||
hi_idx, co_idx = tuple(map(NAMES.index, ('Honolulu', 'Pueblo')))
|
hi_idx, co_idx = tuple(map(NAMES.index, ('Honolulu', 'Pueblo')))
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
from tests import *
|
|
@ -116,7 +116,6 @@ from django.contrib.gis.gdal import CoordTransform, DataSource, \
|
||||||
OGRException, OGRGeometry, OGRGeomType, SpatialReference
|
OGRException, OGRGeometry, OGRGeomType, SpatialReference
|
||||||
from django.contrib.gis.gdal.field import \
|
from django.contrib.gis.gdal.field import \
|
||||||
OFTDate, OFTDateTime, OFTInteger, OFTReal, OFTString, OFTTime
|
OFTDate, OFTDateTime, OFTInteger, OFTReal, OFTString, OFTTime
|
||||||
from django.contrib.gis.models import GeometryColumns, SpatialRefSys
|
|
||||||
from django.db import models, transaction
|
from django.db import models, transaction
|
||||||
from django.contrib.localflavor.us.models import USStateField
|
from django.contrib.localflavor.us.models import USStateField
|
||||||
|
|
||||||
|
@ -189,7 +188,10 @@ class LayerMapping(object):
|
||||||
|
|
||||||
# Getting the geometry column associated with the model (an
|
# Getting the geometry column associated with the model (an
|
||||||
# exception will be raised if there is no geometry column).
|
# exception will be raised if there is no geometry column).
|
||||||
self.geo_col = self.geometry_column()
|
if SpatialBackend.mysql:
|
||||||
|
transform = False
|
||||||
|
else:
|
||||||
|
self.geo_col = self.geometry_column()
|
||||||
|
|
||||||
# Checking the source spatial reference system, and getting
|
# Checking the source spatial reference system, and getting
|
||||||
# the coordinate transformation object (unless the `transform`
|
# the coordinate transformation object (unless the `transform`
|
||||||
|
@ -327,6 +329,7 @@ class LayerMapping(object):
|
||||||
|
|
||||||
def check_srs(self, source_srs):
|
def check_srs(self, source_srs):
|
||||||
"Checks the compatibility of the given spatial reference object."
|
"Checks the compatibility of the given spatial reference object."
|
||||||
|
from django.contrib.gis.models import SpatialRefSys
|
||||||
if isinstance(source_srs, SpatialReference):
|
if isinstance(source_srs, SpatialReference):
|
||||||
sr = source_srs
|
sr = source_srs
|
||||||
elif isinstance(source_srs, SpatialRefSys):
|
elif isinstance(source_srs, SpatialRefSys):
|
||||||
|
@ -498,6 +501,7 @@ class LayerMapping(object):
|
||||||
#### Other model methods ####
|
#### Other model methods ####
|
||||||
def coord_transform(self):
|
def coord_transform(self):
|
||||||
"Returns the coordinate transformation object."
|
"Returns the coordinate transformation object."
|
||||||
|
from django.contrib.gis.models import SpatialRefSys
|
||||||
try:
|
try:
|
||||||
# Getting the target spatial reference system
|
# Getting the target spatial reference system
|
||||||
target_srs = SpatialRefSys.objects.get(srid=self.geo_col.srid).srs
|
target_srs = SpatialRefSys.objects.get(srid=self.geo_col.srid).srs
|
||||||
|
@ -509,11 +513,12 @@ class LayerMapping(object):
|
||||||
|
|
||||||
def geometry_column(self):
|
def geometry_column(self):
|
||||||
"Returns the GeometryColumn model associated with the geographic column."
|
"Returns the GeometryColumn model associated with the geographic column."
|
||||||
|
from django.contrib.gis.models import GeometryColumns
|
||||||
# Getting the GeometryColumn object.
|
# Getting the GeometryColumn object.
|
||||||
try:
|
try:
|
||||||
db_table = self.model._meta.db_table
|
db_table = self.model._meta.db_table
|
||||||
geo_col = self.geom_field
|
geo_col = self.geom_field
|
||||||
if SpatialBackend.name == 'oracle':
|
if SpatialBackend.oracle:
|
||||||
# Making upper case for Oracle.
|
# Making upper case for Oracle.
|
||||||
db_table = db_table.upper()
|
db_table = db_table.upper()
|
||||||
geo_col = geo_col.upper()
|
geo_col = geo_col.upper()
|
||||||
|
|
Loading…
Reference in New Issue