Merge pull request #2938 from dekkers/ticket_23071
Fixed #23071 -- Use last migration's name in dependency to other app
This commit is contained in:
commit
ed4812692e
|
@ -254,13 +254,13 @@ class MigrationAutodetector(object):
|
||||||
# If we can't find the other app, we add a first/last dependency,
|
# If we can't find the other app, we add a first/last dependency,
|
||||||
# but only if we've already been through once and checked everything
|
# but only if we've already been through once and checked everything
|
||||||
if chop_mode:
|
if chop_mode:
|
||||||
# If the app already exists, we add __latest__, as we don't know which
|
# If the app already exists, we add a dependency on the last migration,
|
||||||
# migration contains the target field.
|
# as we don't know which migration contains the target field.
|
||||||
# If it's not yet migrated or has no migrations, we use __first__
|
# If it's not yet migrated or has no migrations, we use __first__
|
||||||
if graph and not graph.root_nodes(dep[0]):
|
if graph and graph.leaf_nodes(dep[0]):
|
||||||
operation_dependencies.add((dep[0], "__first__"))
|
operation_dependencies.add(graph.leaf_nodes(dep[0])[0])
|
||||||
else:
|
else:
|
||||||
operation_dependencies.add((dep[0], "__latest__"))
|
operation_dependencies.add((dep[0], "__first__"))
|
||||||
else:
|
else:
|
||||||
deps_satisfied = False
|
deps_satisfied = False
|
||||||
if deps_satisfied:
|
if deps_satisfied:
|
||||||
|
|
|
@ -136,7 +136,7 @@ class MigrationLoader(object):
|
||||||
return self.disk_migrations[results[0]]
|
return self.disk_migrations[results[0]]
|
||||||
|
|
||||||
def check_key(self, key, current_app):
|
def check_key(self, key, current_app):
|
||||||
if (key[1] != "__first__" and key[1] != "__latest__") or key in self.graph:
|
if key[1] != "__first__" or key in self.graph:
|
||||||
return key
|
return key
|
||||||
# Special-case __first__, which means "the first migration" for
|
# Special-case __first__, which means "the first migration" for
|
||||||
# migrated apps, and is ignored for unmigrated apps. It allows
|
# migrated apps, and is ignored for unmigrated apps. It allows
|
||||||
|
|
|
@ -1069,7 +1069,8 @@ class AutodetectorTests(TestCase):
|
||||||
@override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
|
@override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
|
||||||
def test_last_dependency(self):
|
def test_last_dependency(self):
|
||||||
"""
|
"""
|
||||||
Tests that a dependency to an app with existing migrations uses __latest__.
|
Tests that a dependency to an app with existing migrations uses the
|
||||||
|
last migration of that app.
|
||||||
"""
|
"""
|
||||||
# Load graph
|
# Load graph
|
||||||
loader = MigrationLoader(connection)
|
loader = MigrationLoader(connection)
|
||||||
|
@ -1084,4 +1085,4 @@ class AutodetectorTests(TestCase):
|
||||||
self.assertOperationTypes(changes, 'otherapp', 0, ["CreateModel"])
|
self.assertOperationTypes(changes, 'otherapp', 0, ["CreateModel"])
|
||||||
self.assertOperationAttributes(changes, 'otherapp', 0, 0, name="Book")
|
self.assertOperationAttributes(changes, 'otherapp', 0, 0, name="Book")
|
||||||
# Right dependencies?
|
# Right dependencies?
|
||||||
self.assertEqual(changes['otherapp'][0].dependencies, [("migrations", "__latest__")])
|
self.assertEqual(changes['otherapp'][0].dependencies, [("migrations", "0002_second")])
|
||||||
|
|
|
@ -122,26 +122,6 @@ class LoaderTests(TestCase):
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@modify_settings(INSTALLED_APPS={'append': 'basic'})
|
|
||||||
@override_settings(MIGRATION_MODULES={
|
|
||||||
"migrations": "migrations.test_migrations_latest",
|
|
||||||
"basic": "migrations.test_migrations_latest_basic",
|
|
||||||
})
|
|
||||||
def test_latest(self):
|
|
||||||
"""
|
|
||||||
Makes sure that __latest__ works correctly.
|
|
||||||
"""
|
|
||||||
# Load and test the plan
|
|
||||||
migration_loader = MigrationLoader(connection)
|
|
||||||
self.assertEqual(
|
|
||||||
migration_loader.graph.forwards_plan(("migrations", "0001_initial")),
|
|
||||||
[
|
|
||||||
("basic", "0001_initial"),
|
|
||||||
("basic", "0002_second"),
|
|
||||||
("migrations", "0001_initial"),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
@override_settings(MIGRATION_MODULES={
|
@override_settings(MIGRATION_MODULES={
|
||||||
"migrations": "migrations.test_migrations_first",
|
"migrations": "migrations.test_migrations_first",
|
||||||
"migrations2": "migrations2.test_migrations_2_first",
|
"migrations2": "migrations2.test_migrations_2_first",
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
("basic", "__latest__"),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = []
|
|
|
@ -1,11 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = []
|
|
||||||
|
|
||||||
operations = []
|
|
|
@ -1,13 +0,0 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
("basic", "0001_initial"),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = []
|
|
Loading…
Reference in New Issue