Răsfoiți Sursa

Fixed #23799 -- Made makemigrations respect --no-optimize.

Thanks to yamila-moreno for the idea of a skip message.
Tillmann Karras 10 ani în urmă
părinte
comite
d188101319

+ 22 - 15
django/core/management/commands/squashmigrations.py

@@ -26,7 +26,9 @@ class Command(BaseCommand):
 
         self.verbosity = options.get('verbosity')
         self.interactive = options.get('interactive')
-        app_label, migration_name = options['app_label'], options['migration_name']
+        app_label = options['app_label']
+        migration_name = options['migration_name']
+        no_optimize = options['no_optimize']
 
         # Load the current graph state, check the app and migration they asked for exists
         executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
@@ -95,20 +97,25 @@ class Command(BaseCommand):
                 elif dependency[0] != smigration.app_label:
                     dependencies.add(dependency)
 
-        if self.verbosity > 0:
-            self.stdout.write(self.style.MIGRATE_HEADING("Optimizing..."))
-
-        optimizer = MigrationOptimizer()
-        new_operations = optimizer.optimize(operations, migration.app_label)
-
-        if self.verbosity > 0:
-            if len(new_operations) == len(operations):
-                self.stdout.write("  No optimizations possible.")
-            else:
-                self.stdout.write(
-                    "  Optimized from %s operations to %s operations." %
-                    (len(operations), len(new_operations))
-                )
+        if no_optimize:
+            if self.verbosity > 0:
+                self.stdout.write(self.style.MIGRATE_HEADING("(Skipping optimization.)"))
+            new_operations = operations
+        else:
+            if self.verbosity > 0:
+                self.stdout.write(self.style.MIGRATE_HEADING("Optimizing..."))
+
+            optimizer = MigrationOptimizer()
+            new_operations = optimizer.optimize(operations, migration.app_label)
+
+            if self.verbosity > 0:
+                if len(new_operations) == len(operations):
+                    self.stdout.write("  No optimizations possible.")
+                else:
+                    self.stdout.write(
+                        "  Optimized from %s operations to %s operations." %
+                        (len(operations), len(new_operations))
+                    )
 
         # Work out the value of replaces (any squashed ones we're re-squashing)
         # need to feed their replaces into ours

+ 3 - 0
docs/releases/1.7.2.txt

@@ -62,3 +62,6 @@ Bugfixes
 
 * Fixed a migration crash when a field is renamed that is part of an
   ``index_together`` (:ticket:`23859`).
+
+* Fixed :djadmin:`squashmigrations` to respect the  ``--no-optimize`` parameter
+  (:ticket:`23799`).

+ 39 - 0
tests/migrations/test_commands.py

@@ -543,3 +543,42 @@ class MakeMigrationsTests(MigrationTestBase):
         content = cmd("0002", migration_name_0002, "--empty")
         self.assertIn("dependencies=[\n('migrations','0001_%s'),\n]" % migration_name_0001, content)
         self.assertIn("operations=[\n]", content)
+
+
+class SquashMigrationsTest(MigrationTestBase):
+    """
+    Tests running the squashmigrations command.
+    """
+
+    path = "migrations/test_migrations/0001_squashed_0002_second.py"
+
+    def tearDown(self):
+        if os.path.exists(self.path):
+            os.remove(self.path)
+
+    @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
+    def test_squashmigrations_squashes(self):
+        """
+        Tests that squashmigrations squashes migrations.
+        """
+        call_command("squashmigrations", "migrations", "0002", interactive=False, verbosity=0)
+        self.assertTrue(os.path.exists(self.path))
+
+    @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
+    def test_squashmigrations_optimizes(self):
+        """
+        Tests that squashmigrations optimizes operations.
+        """
+        out = six.StringIO()
+        call_command("squashmigrations", "migrations", "0002", interactive=False, verbosity=1, stdout=out)
+        self.assertIn("Optimized from 7 operations to 5 operations.", out.getvalue())
+
+    @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
+    def test_ticket_23799_squashmigrations_no_optimize(self):
+        """
+        Makes sure that squashmigrations --no-optimize really doesn't optimize operations.
+        """
+        out = six.StringIO()
+        call_command("squashmigrations", "migrations", "0002",
+                     interactive=False, verbosity=1, no_optimize=True, stdout=out)
+        self.assertIn("Skipping optimization", out.getvalue())