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:
Justin Bronn 2008-12-26 20:04:11 +00:00
parent d39540af92
commit 50cd258a24
4 changed files with 18 additions and 9 deletions

View File

@ -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',

View File

@ -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')))

View File

@ -0,0 +1 @@
from tests import *

View File

@ -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()