diff options
| author | Matthew Wilkes <git@matthewwilkes.name> | 2015-02-16 19:42:11 +0000 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2015-03-14 15:37:40 -0400 |
| commit | ae87ad005f7b62f5fa5a29ef07443fa1bbb9baf0 (patch) | |
| tree | 594191827ab15162381ed5c25c29e81a6125d60b | |
| parent | 21ffbb06ec9eb741f62ac51abab4b722fb91b9bc (diff) | |
Refs #24354 -- Prevented repointing of relations on superclasses when migrating a subclass's name change
Forwardport of test and release note from stable/1.7.x
| -rw-r--r-- | docs/releases/1.7.7.txt | 4 | ||||
| -rw-r--r-- | tests/migrations/test_operations.py | 35 |
2 files changed, 38 insertions, 1 deletions
diff --git a/docs/releases/1.7.7.txt b/docs/releases/1.7.7.txt index fa67c97de9..1c6b9325f4 100644 --- a/docs/releases/1.7.7.txt +++ b/docs/releases/1.7.7.txt @@ -9,4 +9,6 @@ Django 1.7.7 fixes several bugs in 1.7.6. Bugfixes ======== -* ... +* Fixed renaming of classes in migrations where renaming a subclass would + cause incorrect state to be recorded for objects that referenced the + superclass (:ticket:`24354`). diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index acbd389bce..a351154058 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -538,6 +538,41 @@ class OperationTests(OperationTestBase): self.assertFKExists("test_rmwsrf_rider", ["friend_id"], ("test_rmwsrf_rider", "id")) self.assertFKNotExists("test_rmwsrf_rider", ["friend_id"], ("test_rmwsrf_horserider", "id")) + def test_rename_model_with_superclass_fk(self): + """ + Tests the RenameModel operation on a model which has a superclass that + has a foreign key. + """ + project_state = self.set_up_test_model("test_rmwsc", related_model=True, mti_model=True) + # Test the state alteration + operation = migrations.RenameModel("ShetlandPony", "LittleHorse") + self.assertEqual(operation.describe(), "Rename model ShetlandPony to LittleHorse") + new_state = project_state.clone() + operation.state_forwards("test_rmwsc", new_state) + self.assertNotIn(("test_rmwsc", "shetlandpony"), new_state.models) + self.assertIn(("test_rmwsc", "littlehorse"), new_state.models) + # RenameModel shouldn't repoint the superclass's relations, only local ones + self.assertEqual( + project_state.models["test_rmwsc", "rider"].fields[1][1].rel.to, + new_state.models["test_rmwsc", "rider"].fields[1][1].rel.to + ) + # Before running the migration we have a table for Shetland Pony, not Little Horse + self.assertTableExists("test_rmwsc_shetlandpony") + self.assertTableNotExists("test_rmwsc_littlehorse") + if connection.features.supports_foreign_keys: + # and the foreign key on rider points to pony, not shetland pony + self.assertFKExists("test_rmwsc_rider", ["pony_id"], ("test_rmwsc_pony", "id")) + self.assertFKNotExists("test_rmwsc_rider", ["pony_id"], ("test_rmwsc_shetlandpony", "id")) + with connection.schema_editor() as editor: + operation.database_forwards("test_rmwsc", editor, project_state, new_state) + # Now we have a little horse table, not shetland pony + self.assertTableNotExists("test_rmwsc_shetlandpony") + self.assertTableExists("test_rmwsc_littlehorse") + if connection.features.supports_foreign_keys: + # but the Foreign keys still point at pony, not little horse + self.assertFKExists("test_rmwsc_rider", ["pony_id"], ("test_rmwsc_pony", "id")) + self.assertFKNotExists("test_rmwsc_rider", ["pony_id"], ("test_rmwsc_littlehorse", "id")) + def test_rename_model_with_self_referential_m2m(self): app_label = "test_rename_model_with_self_referential_m2m" |
