mirror of https://github.com/django/django.git
Fixed #24278 -- Fixed serialization of migration operations.
Fixed MigrationWriter.serialize() to correctly handle migration operations by utilizing OperationWriter. Thanks Piotr Maliński for the report.
This commit is contained in:
parent
d597174bd4
commit
e8e4f978dd
1
AUTHORS
1
AUTHORS
|
@ -441,6 +441,7 @@ answer newbie questions, and generally made Django that much better:
|
||||||
Mark Lavin <markdlavin@gmail.com>
|
Mark Lavin <markdlavin@gmail.com>
|
||||||
Mark Sandstrom <mark@deliciouslynerdy.com>
|
Mark Sandstrom <mark@deliciouslynerdy.com>
|
||||||
Markus Holtermann <https://markusholtermann.eu>
|
Markus Holtermann <https://markusholtermann.eu>
|
||||||
|
Marten Kenbeek <marten.knbk+django@gmail.com>
|
||||||
martin.glueck@gmail.com
|
martin.glueck@gmail.com
|
||||||
Martin Green
|
Martin Green
|
||||||
Martin Kosír <martin@martinkosir.net>
|
Martin Kosír <martin@martinkosir.net>
|
||||||
|
|
|
@ -13,6 +13,7 @@ from importlib import import_module
|
||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
from django.db.migrations.loader import MigrationLoader
|
from django.db.migrations.loader import MigrationLoader
|
||||||
|
from django.db.migrations.operations.base import Operation
|
||||||
from django.utils import datetime_safe, six
|
from django.utils import datetime_safe, six
|
||||||
from django.utils._os import upath
|
from django.utils._os import upath
|
||||||
from django.utils.encoding import force_text
|
from django.utils.encoding import force_text
|
||||||
|
@ -423,6 +424,10 @@ class MigrationWriter(object):
|
||||||
return "%s.as_manager()" % name, imports
|
return "%s.as_manager()" % name, imports
|
||||||
else:
|
else:
|
||||||
return cls.serialize_deconstructed(manager_path, args, kwargs)
|
return cls.serialize_deconstructed(manager_path, args, kwargs)
|
||||||
|
elif isinstance(value, Operation):
|
||||||
|
string, imports = OperationWriter(value, indentation=0).serialize()
|
||||||
|
# Nested operation, trailing comma is handled in upper OperationWriter._write()
|
||||||
|
return string.rstrip(','), imports
|
||||||
# Anything that knows how to deconstruct itself.
|
# Anything that knows how to deconstruct itself.
|
||||||
elif hasattr(value, 'deconstruct'):
|
elif hasattr(value, 'deconstruct'):
|
||||||
return cls.serialize_deconstructed(*value.deconstruct())
|
return cls.serialize_deconstructed(*value.deconstruct())
|
||||||
|
|
|
@ -17,3 +17,7 @@ Bugfixes
|
||||||
|
|
||||||
* Prevented ``TypeError`` in translation functions ``check_for_language()`` and
|
* Prevented ``TypeError`` in translation functions ``check_for_language()`` and
|
||||||
``get_language_bidi()`` when translations are deactivated (:ticket:`24569`).
|
``get_language_bidi()`` when translations are deactivated (:ticket:`24569`).
|
||||||
|
|
||||||
|
* Fixed :djadmin:`squashmigrations` command when using
|
||||||
|
:class:`~django.db.migrations.operations.SeparateDatabaseAndState`
|
||||||
|
(:ticket:`24278`).
|
||||||
|
|
|
@ -81,6 +81,27 @@ class OperationWriterTests(SimpleTestCase):
|
||||||
'),'
|
'),'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_nested_args_signature(self):
|
||||||
|
operation = custom_migration_operations.operations.ArgsOperation(
|
||||||
|
custom_migration_operations.operations.ArgsOperation(1, 2),
|
||||||
|
custom_migration_operations.operations.KwargsOperation(kwarg1=3, kwarg2=4)
|
||||||
|
)
|
||||||
|
buff, imports = OperationWriter(operation, indentation=0).serialize()
|
||||||
|
self.assertEqual(imports, {'import custom_migration_operations.operations'})
|
||||||
|
self.assertEqual(
|
||||||
|
buff,
|
||||||
|
'custom_migration_operations.operations.ArgsOperation(\n'
|
||||||
|
' arg1=custom_migration_operations.operations.ArgsOperation(\n'
|
||||||
|
' arg1=1,\n'
|
||||||
|
' arg2=2,\n'
|
||||||
|
' ),\n'
|
||||||
|
' arg2=custom_migration_operations.operations.KwargsOperation(\n'
|
||||||
|
' kwarg1=3,\n'
|
||||||
|
' kwarg2=4,\n'
|
||||||
|
' ),\n'
|
||||||
|
'),'
|
||||||
|
)
|
||||||
|
|
||||||
def test_multiline_args_signature(self):
|
def test_multiline_args_signature(self):
|
||||||
operation = custom_migration_operations.operations.ArgsOperation("test\n arg1", "test\narg2")
|
operation = custom_migration_operations.operations.ArgsOperation("test\n arg1", "test\narg2")
|
||||||
buff, imports = OperationWriter(operation, indentation=0).serialize()
|
buff, imports = OperationWriter(operation, indentation=0).serialize()
|
||||||
|
@ -107,6 +128,29 @@ class OperationWriterTests(SimpleTestCase):
|
||||||
'),'
|
'),'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_nested_operation_expand_args_signature(self):
|
||||||
|
operation = custom_migration_operations.operations.ExpandArgsOperation(
|
||||||
|
arg=[
|
||||||
|
custom_migration_operations.operations.KwargsOperation(
|
||||||
|
kwarg1=1,
|
||||||
|
kwarg2=2,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
buff, imports = OperationWriter(operation, indentation=0).serialize()
|
||||||
|
self.assertEqual(imports, {'import custom_migration_operations.operations'})
|
||||||
|
self.assertEqual(
|
||||||
|
buff,
|
||||||
|
'custom_migration_operations.operations.ExpandArgsOperation(\n'
|
||||||
|
' arg=[\n'
|
||||||
|
' custom_migration_operations.operations.KwargsOperation(\n'
|
||||||
|
' kwarg1=1,\n'
|
||||||
|
' kwarg2=2,\n'
|
||||||
|
' ),\n'
|
||||||
|
' ],\n'
|
||||||
|
'),'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class WriterTests(TestCase):
|
class WriterTests(TestCase):
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue