mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Fixed #12093 -- LayerMapping now takes into account model inheritance when looking for the geometry column; forgot to diable extent regression test on MySQL. 
				
					
				
			git-svn-id: http://code.djangoproject.com/svn/django/trunk@11703 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -28,6 +28,7 @@ class GeoRegressionTests(unittest.TestCase): | ||||
|         kmz = render_to_kmz('gis/kml/placemarks.kml', {'places' : places}) | ||||
|  | ||||
|     @no_spatialite | ||||
|     @no_mysql | ||||
|     def test03_extent(self): | ||||
|         "Testing `extent` on a table with a single point, see #11827." | ||||
|         pnt = City.objects.get(name='Pueblo').point | ||||
|   | ||||
| @@ -29,6 +29,20 @@ class Interstate(models.Model): | ||||
|     path = models.LineStringField() | ||||
|     objects = models.GeoManager() | ||||
|  | ||||
| # Same as `City` above, but for testing model inheritance. | ||||
| class CityBase(models.Model): | ||||
|     name = models.CharField(max_length=25) | ||||
|     population = models.IntegerField() | ||||
|     density = models.DecimalField(max_digits=7, decimal_places=1) | ||||
|     point = models.PointField() | ||||
|     objects = models.GeoManager() | ||||
|  | ||||
| class ICity1(CityBase): | ||||
|     dt = models.DateField() | ||||
|      | ||||
| class ICity2(ICity1): | ||||
|     dt_time = models.DateTimeField(auto_now=True) | ||||
|  | ||||
| # Mapping dictionaries for the models above. | ||||
| co_mapping = {'name' : 'Name', | ||||
|               'state' : {'name' : 'State'}, # ForeignKey's use another mapping dictionary for the _related_ Model (State in this case). | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| import os, unittest | ||||
| from copy import copy | ||||
| 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, ICity1, ICity2, 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 | ||||
| @@ -242,6 +242,26 @@ class LayerMapTest(unittest.TestCase): | ||||
|             lm.save(step=st, strict=True) | ||||
|             self.county_helper(county_feat=False) | ||||
|  | ||||
|     def test06_model_inheritance(self): | ||||
|         "Tests LayerMapping on inherited models.  See #12093." | ||||
|         icity_mapping = {'name' : 'Name', | ||||
|                          'population' : 'Population', | ||||
|                          'density' : 'Density', | ||||
|                          'point' : 'POINT', | ||||
|                          'dt' : 'Created', | ||||
|                          } | ||||
|  | ||||
|         # Parent model has geometry field. | ||||
|         lm1 = LayerMapping(ICity1, city_shp, icity_mapping) | ||||
|         lm1.save() | ||||
|  | ||||
|         # Grandparent has geometry field. | ||||
|         lm2 = LayerMapping(ICity2, city_shp, icity_mapping) | ||||
|         lm2.save() | ||||
|  | ||||
|         self.assertEqual(6, ICity1.objects.count()) | ||||
|         self.assertEqual(3, ICity2.objects.count()) | ||||
|          | ||||
| def suite(): | ||||
|     s = unittest.TestSuite() | ||||
|     s.addTest(unittest.makeSuite(LayerMapTest)) | ||||
|   | ||||
| @@ -514,16 +514,26 @@ class LayerMapping(object): | ||||
|     def geometry_column(self): | ||||
|         "Returns the GeometryColumn model associated with the geographic column." | ||||
|         from django.contrib.gis.models import GeometryColumns | ||||
|         # Getting the GeometryColumn object. | ||||
|         # Use the `get_field_by_name` on the model's options so that we | ||||
|         # get the correct model if there's model inheritance -- otherwise | ||||
|         # the returned model is None. | ||||
|         opts = self.model._meta | ||||
|         fld, model, direct, m2m = opts.get_field_by_name(self.geom_field) | ||||
|         if model is None: model = self.model | ||||
|  | ||||
|         # Trying to get the `GeometryColumns` object that corresponds to the | ||||
|         # the geometry field. | ||||
|         try: | ||||
|             db_table = self.model._meta.db_table | ||||
|             geo_col = self.geom_field | ||||
|             db_table = model._meta.db_table | ||||
|             geo_col = fld.column | ||||
|  | ||||
|             if SpatialBackend.oracle: | ||||
|                 # Making upper case for Oracle. | ||||
|                 db_table = db_table.upper() | ||||
|                 geo_col = geo_col.upper() | ||||
|             gc_kwargs = {GeometryColumns.table_name_col() : db_table, | ||||
|                          GeometryColumns.geom_col_name() : geo_col, | ||||
|  | ||||
|             gc_kwargs = { GeometryColumns.table_name_col() : db_table, | ||||
|                           GeometryColumns.geom_col_name() : geo_col, | ||||
|                          } | ||||
|             return GeometryColumns.objects.get(**gc_kwargs) | ||||
|         except Exception, msg: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user