Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

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
  • Loading branch information...
commit 50cd258a24275f2de2b45fb702d8e217a6d0a843 1 parent d39540a
@jbronn jbronn authored
View
2  django/contrib/gis/tests/__init__.py
@@ -29,7 +29,7 @@ def geo_suite():
elif postgis:
test_models += ['distapp', 'layermap', 'relatedapp']
elif mysql:
- test_models += ['relatedapp']
+ test_models += ['relatedapp', 'layermap']
test_suite_names += [
'test_gdal_driver',
View
13 django/contrib/gis/tests/layermap/tests.py
@@ -1,8 +1,8 @@
import os, unittest
from copy import copy
-from datetime import date
from decimal import Decimal
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.gdal import DataSource
@@ -85,7 +85,8 @@ def test03_layermap_strict(self):
lm = LayerMapping(Interstate, inter_shp, inter_mapping)
lm.save(silent=True, strict=True)
except InvalidDecimal:
- pass
+ # No transactions for geoms on MySQL; delete added features.
+ if SpatialBackend.mysql: Interstate.objects.all().delete()
else:
self.fail('Should have failed on strict import with invalid decimal values.')
@@ -151,7 +152,8 @@ def test04_layermap_unique_multigeometry_fk(self):
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.
- 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
# mapping for the model the ForeignKey points to.
@@ -227,8 +229,9 @@ def clear_counties(): County.objects.all().delete()
lm.save(fid_range=slice(None, 1), silent=True, strict=True) # layer[:1]
# Only Pueblo & Honolulu counties should be present because of
- # the `unique` keyword.
- qs = County.objects.all()
+ # the `unique` keyword. Have to set `order_by` on this QuerySet
+ # or else MySQL will return a different ordering than the other dbs.
+ qs = County.objects.order_by('name')
self.assertEqual(2, qs.count())
hi, co = tuple(qs)
hi_idx, co_idx = tuple(map(NAMES.index, ('Honolulu', 'Pueblo')))
View
1  django/contrib/gis/tests/layermap/tests_mysql.py
@@ -0,0 +1 @@
+from tests import *
View
11 django/contrib/gis/utils/layermapping.py
@@ -116,7 +116,6 @@ def __str__(self):
OGRException, OGRGeometry, OGRGeomType, SpatialReference
from django.contrib.gis.gdal.field import \
OFTDate, OFTDateTime, OFTInteger, OFTReal, OFTString, OFTTime
-from django.contrib.gis.models import GeometryColumns, SpatialRefSys
from django.db import models, transaction
from django.contrib.localflavor.us.models import USStateField
@@ -189,7 +188,10 @@ def __init__(self, model, data, mapping, layer=0,
# Getting the geometry column associated with the model (an
# 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
# the coordinate transformation object (unless the `transform`
@@ -327,6 +329,7 @@ def check_ogr_fld(ogr_map_fld):
def check_srs(self, source_srs):
"Checks the compatibility of the given spatial reference object."
+ from django.contrib.gis.models import SpatialRefSys
if isinstance(source_srs, SpatialReference):
sr = source_srs
elif isinstance(source_srs, SpatialRefSys):
@@ -498,6 +501,7 @@ def verify_geom(self, geom, model_field):
#### Other model methods ####
def coord_transform(self):
"Returns the coordinate transformation object."
+ from django.contrib.gis.models import SpatialRefSys
try:
# Getting the target spatial reference system
target_srs = SpatialRefSys.objects.get(srid=self.geo_col.srid).srs
@@ -509,11 +513,12 @@ def coord_transform(self):
def geometry_column(self):
"Returns the GeometryColumn model associated with the geographic column."
+ from django.contrib.gis.models import GeometryColumns
# Getting the GeometryColumn object.
try:
db_table = self.model._meta.db_table
geo_col = self.geom_field
- if SpatialBackend.name == 'oracle':
+ if SpatialBackend.oracle:
# Making upper case for Oracle.
db_table = db_table.upper()
geo_col = geo_col.upper()

0 comments on commit 50cd258

Please sign in to comment.
Something went wrong with that request. Please try again.