Fixed #23731 -- Fixed migrations crash when adding blank GeometryFields on PostGIS.

Thanks raratiru for the report and Claude Paroz for review.
This commit is contained in:
Tim Graham 2014-10-31 09:04:46 -04:00
parent 934a16dc93
commit d6d55368d4
3 changed files with 33 additions and 1 deletions

View File

@ -277,7 +277,7 @@ class GeometryField(Field):
def get_db_prep_save(self, value, connection): def get_db_prep_save(self, value, connection):
"Prepares the value for saving in the database." "Prepares the value for saving in the database."
if value is None: if not value:
return None return None
else: else:
return connection.ops.Adapter(self.get_prep_value(value)) return connection.ops.Adapter(self.get_prep_value(value))

View File

@ -67,6 +67,7 @@ class OperationTests(TransactionTestCase):
Tests the AddField operation with a GIS-enabled column. Tests the AddField operation with a GIS-enabled column.
""" """
project_state = self.set_up_test_model() project_state = self.set_up_test_model()
self.current_state = project_state
operation = migrations.AddField( operation = migrations.AddField(
"Neighborhood", "Neighborhood",
"path", "path",
@ -88,11 +89,39 @@ class OperationTests(TransactionTestCase):
indexes = connection.introspection.get_indexes(cursor, "gis_neighborhood") indexes = connection.introspection.get_indexes(cursor, "gis_neighborhood")
self.assertIn('path', indexes) self.assertIn('path', indexes)
def test_add_blank_gis_field(self):
"""
Should be able to add a GeometryField with blank=True.
"""
project_state = self.set_up_test_model()
self.current_state = project_state
operation = migrations.AddField(
"Neighborhood",
"path",
fields.LineStringField(blank=True, srid=4326),
)
new_state = project_state.clone()
operation.state_forwards("gis", new_state)
with connection.schema_editor() as editor:
operation.database_forwards("gis", editor, project_state, new_state)
self.current_state = new_state
self.assertColumnExists("gis_neighborhood", "path")
# Test GeometryColumns when available
if HAS_GEOMETRY_COLUMNS:
self.assertGeometryColumnsCount(2)
if self.has_spatial_indexes:
with connection.cursor() as cursor:
indexes = connection.introspection.get_indexes(cursor, "gis_neighborhood")
self.assertIn('path', indexes)
def test_remove_gis_field(self): def test_remove_gis_field(self):
""" """
Tests the RemoveField operation with a GIS-enabled column. Tests the RemoveField operation with a GIS-enabled column.
""" """
project_state = self.set_up_test_model() project_state = self.set_up_test_model()
self.current_state = project_state
operation = migrations.RemoveField("Neighborhood", "geom") operation = migrations.RemoveField("Neighborhood", "geom")
new_state = project_state.clone() new_state = project_state.clone()
operation.state_forwards("gis", new_state) operation.state_forwards("gis", new_state)

View File

@ -40,3 +40,6 @@ Bugfixes
* Fixed a migration crash that prevented changing a nullable field with a * Fixed a migration crash that prevented changing a nullable field with a
default to non-nullable with the same default (:ticket:`23738`). default to non-nullable with the same default (:ticket:`23738`).
* Fixed a migrations crash when adding ``GeometryField``\s with ``blank=True``
on PostGIS (:ticket:`23731`).