diff --git a/django/contrib/admin/migrations/0001_initial.py b/django/contrib/admin/migrations/0001_initial.py new file mode 100644 index 0000000000..988d84dc59 --- /dev/null +++ b/django/contrib/admin/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '__latest__'), + ] + + operations = [ + migrations.CreateModel( + name='LogEntry', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('action_time', models.DateTimeField(auto_now=True, verbose_name='action time')), + ('object_id', models.TextField(null=True, verbose_name='object id', blank=True)), + ('object_repr', models.CharField(max_length=200, verbose_name='object repr')), + ('action_flag', models.PositiveSmallIntegerField(verbose_name='action flag')), + ('change_message', models.TextField(verbose_name='change message', blank=True)), + ('content_type', models.ForeignKey(to_field='id', blank=True, to='contenttypes.ContentType', null=True)), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, to_field='id')), + ], + options={ + 'ordering': ('-action_time',), + 'db_table': 'django_admin_log', + 'verbose_name': 'log entry', + 'verbose_name_plural': 'log entries', + }, + bases=(models.Model,), + ), + ] diff --git a/django/contrib/admin/migrations/__init__.py b/django/contrib/admin/migrations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py index 6ed6edc38e..38371d2556 100644 --- a/django/db/migrations/autodetector.py +++ b/django/db/migrations/autodetector.py @@ -205,7 +205,7 @@ class MigrationAutodetector(object): elif dep[0] != app_label: # External app dependency. See if it's not yet # satisfied. - for other_operation in self.generated_operations[dep[0]]: + for other_operation in self.generated_operations.get(dep[0], []): if self.check_dependency(other_operation, dep): deps_satisfied = False break diff --git a/django/db/migrations/loader.py b/django/db/migrations/loader.py index 4d37cf080c..0d961c2b69 100644 --- a/django/db/migrations/loader.py +++ b/django/db/migrations/loader.py @@ -135,7 +135,7 @@ class MigrationLoader(object): return self.disk_migrations[results[0]] def check_key(self, key, current_app): - if key[1] != "__first__" or key in self.graph: + if (key[1] != "__first__" and key[1] != "__latest__") or key in self.graph: return key # Special-case __first__, which means "the first migration" for # migrated apps, and is ignored for unmigrated apps. It allows @@ -151,7 +151,10 @@ class MigrationLoader(object): return if key[0] in self.migrated_apps: try: - return list(self.graph.root_nodes(key[0]))[0] + if key[1] == "__first__": + return list(self.graph.root_nodes(key[0]))[0] + else: + return list(self.graph.root_nodes(key[0]))[-1] except IndexError: raise ValueError("Dependency on app with no migrations: %s" % key[0]) raise ValueError("Dependency on unknown app: %s" % key[0])