From cee95e6172f2ea3dbf8cfd4214562cfc92f95392 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Thu, 29 Aug 2024 18:52:31 +0100 Subject: [PATCH] Fixed #35717 -- Reduced Create/RemoveCollation operations when optimizing migrations. --- django/contrib/postgres/operations.py | 5 +++++ tests/postgres_tests/test_operations.py | 20 +++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/django/contrib/postgres/operations.py b/django/contrib/postgres/operations.py index 1ee5fbc2e2c2..84360febf90f 100644 --- a/django/contrib/postgres/operations.py +++ b/django/contrib/postgres/operations.py @@ -237,6 +237,11 @@ def describe(self): def migration_name_fragment(self): return "create_collation_%s" % self.name.lower() + def reduce(self, operation, app_label): + if isinstance(operation, RemoveCollation) and self.name == operation.name: + return [] + return super().reduce(operation, app_label) + class RemoveCollation(CollationOperation): """Remove a collation.""" diff --git a/tests/postgres_tests/test_operations.py b/tests/postgres_tests/test_operations.py index f344d4ae743c..322f38148b5d 100644 --- a/tests/postgres_tests/test_operations.py +++ b/tests/postgres_tests/test_operations.py @@ -318,7 +318,7 @@ def test_drop_nonexistent_extension(self): @unittest.skipUnless(connection.vendor == "postgresql", "PostgreSQL specific tests.") -class CreateCollationTests(PostgreSQLTestCase): +class CreateCollationTests(OptimizerTestBase, PostgreSQLTestCase): app_label = "test_allow_create_collation" @override_settings(DATABASE_ROUTERS=[NoMigrationRouter()]) @@ -459,6 +459,24 @@ def test_writer(self): "),", ) + def test_reduce_create_remove(self): + self.assertOptimizesTo( + [ + CreateCollation( + "sample_collation", + "und-u-ks-level2", + provider="icu", + deterministic=False, + ), + RemoveCollation( + "sample_collation", + # Different locale + "de-u-ks-level1", + ), + ], + [], + ) + @unittest.skipUnless(connection.vendor == "postgresql", "PostgreSQL specific tests.") class RemoveCollationTests(PostgreSQLTestCase):