summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarten Kenbeek <marten.knbk@gmail.com>2015-05-24 21:17:39 +0200
committerTim Graham <timograham@gmail.com>2015-05-25 13:47:50 -0400
commitd73176a84273c06fa11075c65293ec28497a8423 (patch)
treef36b5140e21cd5752ee0c4009500c6efa95e8987
parent73b5b0b4a5989f159c6dadcb670ab30b01402382 (diff)
Fixed #24848 -- Fixed ValueError for faulty migrations module.
Added apps to unmigrated apps if the migrations module is a file or a folder missing __init__.py. Thanks to Ernest0x for the bug report.
-rw-r--r--django/db/migrations/loader.py2
-rw-r--r--docs/releases/1.8.3.txt3
-rw-r--r--tests/migrations/test_loader.py12
3 files changed, 15 insertions, 2 deletions
diff --git a/django/db/migrations/loader.py b/django/db/migrations/loader.py
index f1edefca9b..24c1dc1d18 100644
--- a/django/db/migrations/loader.py
+++ b/django/db/migrations/loader.py
@@ -79,9 +79,11 @@ class MigrationLoader(object):
else:
# PY3 will happily import empty dirs as namespaces.
if not hasattr(module, '__file__'):
+ self.unmigrated_apps.add(app_config.label)
continue
# Module is not a package (e.g. migrations.py).
if not hasattr(module, '__path__'):
+ self.unmigrated_apps.add(app_config.label)
continue
# Force a reload if it's already loaded (tests need this)
if was_loaded:
diff --git a/docs/releases/1.8.3.txt b/docs/releases/1.8.3.txt
index a8a649cdf0..09aa2d8fe7 100644
--- a/docs/releases/1.8.3.txt
+++ b/docs/releases/1.8.3.txt
@@ -11,3 +11,6 @@ Bugfixes
* Fixed ``BaseRangeField.prepare_value()`` to use each ``base_field``’s
``prepare_value()`` method (:ticket:`24841`).
+
+* Fixed crash during :djadmin:`makemigrations` if a migrations module either
+ is missing ``__init__.py`` or is a file (:ticket:`24848`).
diff --git a/tests/migrations/test_loader.py b/tests/migrations/test_loader.py
index 5574564f0b..5c268aa33b 100644
--- a/tests/migrations/test_loader.py
+++ b/tests/migrations/test_loader.py
@@ -164,12 +164,20 @@ class LoaderTests(TestCase):
def test_load_module_file(self):
with override_settings(MIGRATION_MODULES={"migrations": "migrations.faulty_migrations.file"}):
- MigrationLoader(connection)
+ loader = MigrationLoader(connection)
+ self.assertIn(
+ "migrations", loader.unmigrated_apps,
+ "App with migrations module file not in unmigrated apps."
+ )
@skipIf(six.PY2, "PY2 doesn't load empty dirs.")
def test_load_empty_dir(self):
with override_settings(MIGRATION_MODULES={"migrations": "migrations.faulty_migrations.namespace"}):
- MigrationLoader(connection)
+ loader = MigrationLoader(connection)
+ self.assertIn(
+ "migrations", loader.unmigrated_apps,
+ "App missing __init__.py in migrations module not in unmigrated apps."
+ )
@override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations_squashed"})
def test_loading_squashed(self):