Kaydet (Commit) 7c68cea7 authored tarafından tschilling's avatar tschilling Kaydeden (comit) Tim Graham

Fixed #30186 -- Made showmigrations --list display the applied datetimes at verbosity 2+.

üst 371ddade
...@@ -22,7 +22,11 @@ class Command(BaseCommand): ...@@ -22,7 +22,11 @@ class Command(BaseCommand):
formats = parser.add_mutually_exclusive_group() formats = parser.add_mutually_exclusive_group()
formats.add_argument( formats.add_argument(
'--list', '-l', action='store_const', dest='format', const='list', '--list', '-l', action='store_const', dest='format', const='list',
help='Shows a list of all migrations and which are applied.', help=(
'Shows a list of all migrations and which are applied. '
'With a verbosity level of 2 or above, the applied datetimes '
'will be included.'
),
) )
formats.add_argument( formats.add_argument(
'--plan', '-p', action='store_const', dest='format', const='plan', '--plan', '-p', action='store_const', dest='format', const='plan',
...@@ -84,9 +88,13 @@ class Command(BaseCommand): ...@@ -84,9 +88,13 @@ class Command(BaseCommand):
title = plan_node[1] title = plan_node[1]
if graph.nodes[plan_node].replaces: if graph.nodes[plan_node].replaces:
title += " (%s squashed migrations)" % len(graph.nodes[plan_node].replaces) title += " (%s squashed migrations)" % len(graph.nodes[plan_node].replaces)
applied_migration = loader.applied_migrations.get(plan_node)
# Mark it as applied/unapplied # Mark it as applied/unapplied
if plan_node in loader.applied_migrations: if applied_migration:
self.stdout.write(" [X] %s" % title) output = ' [X] %s' % title
if self.verbosity >= 2:
output += ' (applied at %s)' % applied_migration.applied.strftime('%Y-%m-%d %H:%M:%S')
self.stdout.write(output)
else: else:
self.stdout.write(" [ ] %s" % title) self.stdout.write(" [ ] %s" % title)
shown.add(plan_node) shown.add(plan_node)
......
...@@ -1079,13 +1079,18 @@ Shows all migrations in a project. You can choose from one of two formats: ...@@ -1079,13 +1079,18 @@ Shows all migrations in a project. You can choose from one of two formats:
Lists all of the apps Django knows about, the migrations available for each Lists all of the apps Django knows about, the migrations available for each
app, and whether or not each migration is applied (marked by an ``[X]`` next to app, and whether or not each migration is applied (marked by an ``[X]`` next to
the migration name). the migration name). For a ``--verbosity`` of 2 and above, the applied
datetimes are also shown.
Apps without migrations are also listed, but have ``(no migrations)`` printed Apps without migrations are also listed, but have ``(no migrations)`` printed
under them. under them.
This is the default output format. This is the default output format.
.. versionchanged:: 3.0
Output of the applied datetimes at verbosity 2 and above was added.
.. django-admin-option:: --plan, -p .. django-admin-option:: --plan, -p
Shows the migration plan Django will follow to apply migrations. Like Shows the migration plan Django will follow to apply migrations. Like
......
...@@ -154,6 +154,9 @@ Management Commands ...@@ -154,6 +154,9 @@ Management Commands
* The new :option:`compilemessages --ignore` option allows ignoring specific * The new :option:`compilemessages --ignore` option allows ignoring specific
directories when searching for ``.po`` files to compile. directories when searching for ``.po`` files to compile.
* :option:`showmigrations --list` now shows the applied datetimes when
``--verbosity`` is 2 and above.
Migrations Migrations
~~~~~~~~~~ ~~~~~~~~~~
......
...@@ -250,6 +250,16 @@ class MigrateTests(MigrationTestBase): ...@@ -250,6 +250,16 @@ class MigrateTests(MigrationTestBase):
' [ ] 0002_second\n', ' [ ] 0002_second\n',
out.getvalue().lower() out.getvalue().lower()
) )
out = io.StringIO()
# Applied datetimes are displayed at verbosity 2+.
call_command('showmigrations', 'migrations', stdout=out, verbosity=2, no_color=True)
migration1 = MigrationRecorder(connection).migration_qs.get(app='migrations', name='0001_initial')
self.assertEqual(
'migrations\n'
' [x] 0001_initial (applied at %s)\n'
' [ ] 0002_second\n' % migration1.applied.strftime('%Y-%m-%d %H:%M:%S'),
out.getvalue().lower()
)
# Cleanup by unmigrating everything # Cleanup by unmigrating everything
call_command("migrate", "migrations", "zero", verbosity=0) call_command("migrate", "migrations", "zero", verbosity=0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment