summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Luc <chris.luc.dev@gmail.com>2015-03-28 17:09:44 -0700
committerTim Graham <timograham@gmail.com>2015-04-10 07:04:26 -0400
commita7bc00e17bebe34cdf23f744937b3c386ee73d81 (patch)
treed7112ede95acbdd5052df1dbfbbb4a88be0581b1
parentd5d92260bbc5b00abc9d59a1987efb6a322bd3cd (diff)
Fixed #24514 -- Made migration writer omit models import if it's unused.
-rw-r--r--django/db/migrations/writer.py12
-rw-r--r--tests/migrations/test_writer.py16
2 files changed, 26 insertions, 2 deletions
diff --git a/django/db/migrations/writer.py b/django/db/migrations/writer.py
index 4102b79697..a0832ff4f6 100644
--- a/django/db/migrations/writer.py
+++ b/django/db/migrations/writer.py
@@ -158,7 +158,7 @@ class MigrationWriter(object):
"replaces_str": "",
}
- imports = {"from django.db import migrations, models"}
+ imports = set()
# Deconstruct operations
operations = []
@@ -188,7 +188,15 @@ class MigrationWriter(object):
migration_imports.add(line.split("import")[1].strip())
imports.remove(line)
self.needs_manual_porting = True
- imports.discard("from django.db import models")
+
+ # django.db.migrations is always used, but models import may not be.
+ # If models import exists, merge it with migrations import.
+ if "from django.db import models" in imports:
+ imports.discard("from django.db import models")
+ imports.add("from django.db import migrations, models")
+ else:
+ imports.add("from django.db import migrations")
+
# Sort imports by the package / module to be imported (the part after
# "from" in "from ... import ..." or after "import" in "import ...").
sorted_imports = sorted(imports, key=lambda i: i.split()[1])
diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py
index 46531df791..f0edfd3e30 100644
--- a/tests/migrations/test_writer.py
+++ b/tests/migrations/test_writer.py
@@ -512,6 +512,22 @@ class WriterTests(TestCase):
output
)
+ def test_models_import_omitted(self):
+ """
+ django.db.models shouldn't be imported if unused.
+ """
+ migration = type(str("Migration"), (migrations.Migration,), {
+ "operations": [
+ migrations.AlterModelOptions(
+ name='model',
+ options={'verbose_name': 'model', 'verbose_name_plural': 'models'},
+ ),
+ ]
+ })
+ writer = MigrationWriter(migration)
+ output = writer.as_string().decode('utf-8')
+ self.assertIn("from django.db import migrations\n", output)
+
def test_deconstruct_class_arguments(self):
# Yes, it doesn't make sense to use a class as a default for a
# CharField. It does make sense for custom fields though, for example