Commit 38b4adc6 authored by Andrew Godwin's avatar Andrew Godwin
Browse files

Merge pull request #2244 from mlavin/21856-migration-checks

Fixed #21856: Allow Empty DATABASES Setting
parents 46a87214 a3e0d775
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ from .registry import register, run_checks, tag_exists

# Import these to force registration of checks
import django.core.checks.compatibility.django_1_6_0  # NOQA
import django.core.checks.migrations  # NOQA
import django.core.checks.model_checks  # NOQA

__all__ = [
+31 −0
Original line number Diff line number Diff line
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.conf import settings

from . import Warning, register


@register('migrations')
def check_migrations(app_configs=None, **kwargs):
    """
    Checks to see if the set of migrations on disk matches the
    migrations in the database. Prints a warning if they don't match.
    """
    from django.db import connections, DEFAULT_DB_ALIAS
    from django.db.migrations.executor import MigrationExecutor

    errors = []
    plan = None
    if settings.DATABASES:
        executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
        plan = executor.migration_plan(executor.loader.graph.leaf_nodes())
    if plan:
        errors.append(
            Warning(
                "You have unapplied migrations; "
                "your app may not work properly until they are applied.",
                hint="Run 'python manage.py migrate' to apply them.",
            )
        )
    return errors
+0 −14
Original line number Diff line number Diff line
@@ -10,8 +10,6 @@ import socket

from django.core.management.base import BaseCommand, CommandError
from django.core.servers.basehttp import run, get_internal_wsgi_application
from django.db import connections, DEFAULT_DB_ALIAS
from django.db.migrations.executor import MigrationExecutor
from django.utils import autoreload
from django.utils import six

@@ -101,7 +99,6 @@ class Command(BaseCommand):

        self.stdout.write("Performing system checks...\n\n")
        self.validate(display_num_errors=True)
        self.check_migrations()
        now = datetime.now().strftime('%B %d, %Y - %X')
        if six.PY2:
            now = now.decode('utf-8')
@@ -146,16 +143,5 @@ class Command(BaseCommand):
                self.stdout.write(shutdown_message)
            sys.exit(0)

    def check_migrations(self):
        """
        Checks to see if the set of migrations on disk matches the
        migrations in the database. Prints a warning if they don't match.
        """
        executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
        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."))
            self.stdout.write(self.style.NOTICE("Run 'python manage.py migrate' to apply them.\n"))

# Kept for backward compatibility
BaseRunserverCommand = Command
+43 −0
Original line number Diff line number Diff line
# encoding: utf8
from django.core import checks
from django.core.checks.migrations import check_migrations
from django.test import TestCase, override_settings

from .test_base import MigrationTestBase


class CheckMigrationTests(MigrationTestBase):
    """
    Test checks for unapplied migrations.
    """

    @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
    def test_unapplied(self):
        """
        check_migrations should return a warning when there are unapplied migrations.
        """
        expected = [
            checks.Warning(
                "You have unapplied migrations; "
                "your app may not work properly until they are applied.",
                hint="Run 'python manage.py migrate' to apply them.",
            )
        ]
        errors = check_migrations()
        self.assertEqual(errors, expected)

    @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"}, DATABASES={})
    def test_no_databases(self):
        """
        Migration checks should not consider unapplied migrations if there is
        no database configured.
        """
        errors = check_migrations()
        self.assertEqual(errors, [])

    def test_no_unapplied(self):
        """
        No warning should be issued if all migrations have been applied.
        """
        errors = check_migrations()
        self.assertEqual(errors, [])