浏览代码

Fixed #22983: Alert when squashing RunPython operations with referred functions.

Andrew Godwin 10 年之前
父节点
当前提交
ebb13bbd88
共有 2 个文件被更改,包括 19 次插入1 次删除
  1. 6 0
      django/core/management/commands/squashmigrations.py
  2. 13 1
      django/db/migrations/writer.py

+ 6 - 0
django/core/management/commands/squashmigrations.py

@@ -107,3 +107,9 @@ class Command(BaseCommand):
             self.stdout.write("  the new migration will be used for new installs. Once you are sure")
             self.stdout.write("  all instances of the codebase have applied the migrations you squashed,")
             self.stdout.write("  you can delete them.")
+            if writer.needs_manual_porting:
+                self.stdout.write(self.style.MIGRATE_HEADING("Manual porting required"))
+                self.stdout.write("  Your migrations contained functions that must be manually copied over,")
+                self.stdout.write("  as we could not safely copy their implementation.")
+                self.stdout.write("  See the comment at the top of the squashed migration for details.")
+

+ 13 - 1
django/db/migrations/writer.py

@@ -111,6 +111,7 @@ class MigrationWriter(object):
 
     def __init__(self, migration):
         self.migration = migration
+        self.needs_manual_porting = False
 
     def as_string(self):
         """
@@ -142,9 +143,20 @@ class MigrationWriter(object):
                 dependencies.append("        %s," % self.serialize(dependency)[0])
         items["dependencies"] = "\n".join(dependencies) + "\n" if dependencies else ""
 
-        # Format imports nicely
+        # Format imports nicely, swapping imports of functions from migration files
+        # for comments
+        migration_imports = set()
+        for line in list(imports):
+            if re.match("^import (.*)\.\d+[^\s]*$", line):
+                migration_imports.add(line.split("import")[1].strip())
+                imports.remove(line)
+                self.needs_manual_porting = True
         imports.discard("from django.db import models")
         items["imports"] = "\n".join(imports) + "\n" if imports else ""
+        if migration_imports:
+            items["imports"] += "\n\n# Functions from the following migrations need manual copying.\n# Move them and any dependencies into this file, then update the\n# RunPython operations to refer to the local versions:\n# %s" % (
+                "\n# ".join(migration_imports)
+            )
 
         # If there's a replaces, make a string for it
         if self.migration.replaces: