From d60ed64ef60af199a87d04472c7fd43bba3f5ebc Mon Sep 17 00:00:00 2001 From: Emre Yilmaz Date: Thu, 3 Dec 2015 18:51:39 +0200 Subject: [PATCH] Fixed #25855 -- Added more accurate info to migration warning on runserver command. If one have migrations waiting to be applied, runserver command gives a warning with check_migrations() method. Updated it with more accurate messages. (Unapplied migrations count and list of apps waiting their migrations applied.) Also added related unit tests and changed the "your app" text to "your project" since runserver command has a project-wide usage. --- django/core/management/commands/runserver.py | 13 +++++++--- .../app_waiting_migration/__init__.py | 0 .../migrations/0001_initial.py | 21 ++++++++++++++++ .../app_waiting_migration/migrations/__init__.py | 0 .../admin_scripts/app_waiting_migration/models.py | 10 ++++++++ tests/admin_scripts/tests.py | 28 ++++++++++++++++++++++ 6 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 tests/admin_scripts/app_waiting_migration/__init__.py create mode 100644 tests/admin_scripts/app_waiting_migration/migrations/0001_initial.py create mode 100644 tests/admin_scripts/app_waiting_migration/migrations/__init__.py create mode 100644 tests/admin_scripts/app_waiting_migration/models.py diff --git a/django/core/management/commands/runserver.py b/django/core/management/commands/runserver.py index 6d05fa8..e368751 100644 --- a/django/core/management/commands/runserver.py +++ b/django/core/management/commands/runserver.py @@ -172,9 +172,16 @@ def check_migrations(self): plan = executor.migration_plan(executor.loader.graph.leaf_nodes()) if plan: - self.stdout.write(self.style.NOTICE( - "\nYou have unapplied migrations; your app may not work properly until they are applied." - )) + apps_waiting_migration = sorted(set(migration.app_label for migration, backwards in plan)) + self.stdout.write( + self.style.NOTICE( + "\nYou have %(unpplied_migration_count)s unapplied migrations; your project may not work properly " + "until apps [%(apps_waiting_migration)s] have their migrations applied." % { + "unpplied_migration_count": len(plan), + "apps_waiting_migration": ", ".join(apps_waiting_migration) + } + ) + ) self.stdout.write(self.style.NOTICE("Run 'python manage.py migrate' to apply them.\n")) # Kept for backward compatibility diff --git a/tests/admin_scripts/app_waiting_migration/__init__.py b/tests/admin_scripts/app_waiting_migration/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/admin_scripts/app_waiting_migration/migrations/0001_initial.py b/tests/admin_scripts/app_waiting_migration/migrations/0001_initial.py new file mode 100644 index 0000000..52d594a --- /dev/null +++ b/tests/admin_scripts/app_waiting_migration/migrations/0001_initial.py @@ -0,0 +1,21 @@ +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Bar', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ], + ), + ] diff --git a/tests/admin_scripts/app_waiting_migration/migrations/__init__.py b/tests/admin_scripts/app_waiting_migration/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/admin_scripts/app_waiting_migration/models.py b/tests/admin_scripts/app_waiting_migration/models.py new file mode 100644 index 0000000..5e9f0e3 --- /dev/null +++ b/tests/admin_scripts/app_waiting_migration/models.py @@ -0,0 +1,10 @@ +from __future__ import unicode_literals + +from django.db import models + + +class Bar(models.Model): + name = models.CharField(max_length=255) + + class Meta: + app_label = 'app_waiting_migration' diff --git a/tests/admin_scripts/tests.py b/tests/admin_scripts/tests.py index 755fb0b..ccf36d3 100644 --- a/tests/admin_scripts/tests.py +++ b/tests/admin_scripts/tests.py @@ -1383,6 +1383,34 @@ def test_readonly_database(self): self.assertIn("Not checking migrations", self.output.getvalue()) +@override_settings( + MIGRATION_MODULES={ + "admin_scripts.app_waiting_migration": + "app_waiting_migration.migrations"}, + INSTALLED_APPS=["admin_scripts.app_waiting_migration"] +) +class ManageRunserverMigrationWarning(SimpleTestCase): + allow_database_queries = True + + def setUp(self): + from django.core.management.commands.runserver import Command + + self.output = StringIO() + self.runserver_command = Command(stdout=self.output) + + def test_migration_warning(self): + + self.runserver_command.check_migrations() + self.assertIn( + 'You have 1 unapplied migrations;', + self.output.getvalue() + ) + self.assertIn( + 'until apps [app_waiting_migration] have', + self.output.getvalue() + ) + + class ManageRunserverEmptyAllowedHosts(AdminScriptTestCase): def setUp(self): self.write_settings('settings.py', sdict={