StreamField data migration reference¶
wagtail.blocks.migrations.migrate_operation¶
MigrateStreamData¶
class MigrateStreamData(RunPython)
Subclass of RunPython for StreamField data migration operations
__init__¶
def __init__(app_name,
model_name,
field_name,
operations_and_block_paths,
revisions_from=None,
chunk_size=1024,
**kwargs)
MigrateStreamData constructor
Arguments:
app_namestr - Name of the app.model_namestr - Name of the model.field_namestr - Name of theStreamField.operations_and_block_pathsList[Tuple[operation, str]] - List of operations and the block paths to apply them to.revisions_fromdatetime, optional - Only revisions created from this date onwards will be updated. PassingNoneupdates all revisions. Defaults toNone. Note that live and latest revisions will be updated regardless of what value this takes.chunk_sizeint, optional - chunk size forqueryset.iteratorandbulk_update. Defaults to 1024.**kwargs- atomic, elidable, hints for superclassRunPythoncan be given
Example:
Renaming a block named field1 to block1:
MigrateStreamData(
app_name="blog",
model_name="BlogPage",
field_name="content",
operations_and_block_paths=[
(RenameStreamChildrenOperation(old_name="field1", new_name="block1"), ""),
],
revisions_from=datetime.datetime(2022, 7, 25)
)
wagtail.blocks.migrations.operations¶
RenameStreamChildrenOperation¶
class RenameStreamChildrenOperation(BaseBlockOperation)
Renames all StreamBlock children of the given type
Notes:
The block_path_str when using this operation should point to the parent StreamBlock which contains the blocks to be renamed, not the block being renamed.
Attributes:
old_namestr - name of the child block type to be renamednew_namestr - new name to rename to
RenameStructChildrenOperation¶
class RenameStructChildrenOperation(BaseBlockOperation)
Renames all StructBlock children of the given type
Notes:
The block_path_str when using this operation should point to the parent StructBlock which contains the blocks to be renamed, not the block being renamed.
Attributes:
old_namestr - name of the child block type to be renamednew_namestr - new name to rename to
RemoveStreamChildrenOperation¶
class RemoveStreamChildrenOperation(BaseBlockOperation)
Removes all StreamBlock children of the given type
Notes:
The block_path_str when using this operation should point to the parent StreamBlock which contains the blocks to be removed, not the block being removed.
Attributes:
namestr - name of the child block type to be removed
RemoveStructChildrenOperation¶
class RemoveStructChildrenOperation(BaseBlockOperation)
Removes all StructBlock children of the given type
Notes:
The block_path_str when using this operation should point to the parent StructBlock which contains the blocks to be removed, not the block being removed.
Attributes:
namestr - name of the child block type to be removed
StreamChildrenToListBlockOperation¶
class StreamChildrenToListBlockOperation(BaseBlockOperation)
Combines StreamBlock children of the given type into a new ListBlock
Notes:
The block_path_str when using this operation should point to the parent StreamBlock which contains the blocks to be combined, not the child block itself.
Attributes:
block_namestr - name of the child block type to be combinedlist_block_namestr - name of the newListBlocktype
StreamChildrenToStreamBlockOperation¶
class StreamChildrenToStreamBlockOperation(BaseBlockOperation)
Combines StreamBlock children of the given types into a new StreamBlock
Notes:
The block_path_str when using this operation should point to the parent StreamBlock which contains the blocks to be combined, not the child block itself.
Attributes:
block_names[str] - names of the child block types to be combinedstream_block_namestr - name of the newStreamBlocktype
AlterBlockValueOperation¶
class AlterBlockValueOperation(BaseBlockOperation)
Alters the value of each block to the given value
Attributes:
new_value: new value to change to
StreamChildrenToStructBlockOperation¶
class StreamChildrenToStructBlockOperation(BaseBlockOperation)
Move each StreamBlock child of the given type inside a new StructBlock
A new StructBlock will be created as a child of the parent StreamBlock for each child block of the given type, and then that child block will be moved from the parent StreamBlocks children inside the new StructBlock as a child of that StructBlock.
Example:
Consider the following StreamField definition:
mystream = StreamField([("char1", CharBlock()), ...], ...)
Then the stream data would look like the following:
[
...,
{ "type": "char1", "value": "Value1", ... },
{ "type": "char1", "value": "Value2", ... },
...
]
And if we define the operation like this:
StreamChildrenToStructBlockOperation("char1", "struct1")
Our altered stream data would look like this:
[
...,
{ "type": "struct1", "value": { "char1": "Value1" } },
{ "type": "struct1", "value": { "char1": "Value2" } },
...,
]
Notes:
The
block_path_strwhen using this operation should point to the parentStreamBlockwhich contains the blocks to be combined, not the child block itself.Block ids are not preserved here since the new blocks are structurally different than the previous blocks.
Attributes:
block_namesstr - names of the child block types to be combinedstruct_block_namestr - name of the newStructBlocktype
wagtail.blocks.migrations.utils¶
InvalidBlockDefError¶
class InvalidBlockDefError(Exception)
Exception for invalid block definitions
map_block_value¶
def map_block_value(block_value, block_def, block_path, operation, **kwargs)
Maps the value of a block.
Arguments:
block_value: The value of the block. This would be a list or dict of children for structural blocks.block_def: The definition of the block.block_path: A"."separated list of names of the blocks from the current block (not included) to the nested block of which the value will be passed to the operation.operation: An Operation class instance (extendsBaseBlockOperation), which has anapplymethod for mapping values.
Returns:
Transformed value
map_struct_block_value¶
def map_struct_block_value(struct_block_value, block_def, block_path,
**kwargs)
Maps each child block in a StructBlock value.
Arguments:
stream_block_value: The value of theStructBlock, a dict of child blocksblock_def: The definition of theStructBlockblock_path: A"."separated list of names of the blocks from the current block (not included) to the nested block of which the value will be passed to the operation.
Returns:
mapped_value: The value of the
StructBlockafter transforming its children.
map_list_block_value¶
def map_list_block_value(list_block_value, block_def, block_path, **kwargs)
Maps each child block in a ListBlock value.
Arguments:
stream_block_value: The value of theListBlock, a list of child blocksblock_def: The definition of theListBlockblock_path: A"."separated list of names of the blocks from the current block (not included) to the nested block of which the value will be passed to the operation.
Returns:
mapped_value: The value of the
ListBlockafter transforming all the children.
apply_changes_to_raw_data¶
def apply_changes_to_raw_data(raw_data, block_path_str, operation, streamfield,
**kwargs)
Applies changes to raw stream data
Arguments:
raw_data: The current stream data (a list of top level blocks)block_path_str: A"."separated list of names of the blocks from the top level block to the nested block of which the value will be passed to the operation.operation: A subclass ofoperations.BaseBlockOperation. It will have theapplymethod for applying changes to the matching block values.streamfield: TheStreamFieldfor which data is being migrated. This is used to get the definitions of the blocks.
Returns:
altered_raw_data:
Block paths¶
Operations for StreamField data migrations defined in wagtail.blocks.migrations require a “block path” to determine which blocks they should be applied to.
block_path = "" | block_name ("." block_name)*
block_name = str
A block path is either:
the empty string, in which case the operation should be applied to the top-level stream; or
a
"."(period) separated sequence of block names, where block names are the names given to the blocks in theStreamFielddefinition.
Block names are the values associated with the "type" keys in the stream data’s dictionary structures. As such, traversing or selecting ListBlock members requires the use of the "item" block name.
The value that an operation’s apply method receives is the "value" member of the dict associated with the terminal block name in the block path.
For examples see the tutorial.