From 0072baba52caab361002330f2846db8a5a7ef622 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dan=20Braghi=C8=99?= <31622+zerolab@users.noreply.github.com> Date: Fri, 31 Jan 2025 15:23:56 +0000 Subject: [PATCH] Handle nested `ImageBlock`s (#850) --- wagtail_localize/segments/extract.py | 13 +- .../segments/tests/test_segment_extraction.py | 108 ++- .../test/migrations/0001_initial.py | 314 ++++++- ...blefieldspage_test_streamfield_and_more.py | 802 ------------------ wagtail_localize/test/models.py | 16 + 5 files changed, 444 insertions(+), 809 deletions(-) delete mode 100644 wagtail_localize/test/migrations/0002_alter_testgeneratetranslatablefieldspage_test_streamfield_and_more.py diff --git a/wagtail_localize/segments/extract.py b/wagtail_localize/segments/extract.py index 0d286b8e..d75f4ea6 100644 --- a/wagtail_localize/segments/extract.py +++ b/wagtail_localize/segments/extract.py @@ -200,8 +200,15 @@ def handle_image_block(self, block, image_block_value, raw_value=None): segments = [] for field_name, block_type in block.child_blocks.items(): + if raw_value.get("type") and raw_value.get("value"): + # for top-level ImageBlock, raw_value has a + # {"type": "field_name", "value": {"image": X, "alt_text": "", "caption": ""}} format. + # whereas if the ImageBlock is part of a StructBlock, ListBlock or StreamBlock, we + # only get the "value" part. + raw_value = raw_value.get("value") + try: - block_raw_value = raw_value["value"].get(field_name) + block_raw_value = raw_value.get(field_name) block_value = ( image_block_value if field_name == "image" else block_raw_value ) @@ -209,6 +216,10 @@ def handle_image_block(self, block, image_block_value, raw_value=None): # e.g. raw_value is None, or is that from chooser block_raw_value = None block_value = None + + if isinstance(block_type, blocks.CharBlock) and block_value is None: + block_value = "" + segments.extend( segment.wrap(field_name) for segment in self.handle_block( diff --git a/wagtail_localize/segments/tests/test_segment_extraction.py b/wagtail_localize/segments/tests/test_segment_extraction.py index 614765c0..839eae99 100644 --- a/wagtail_localize/segments/tests/test_segment_extraction.py +++ b/wagtail_localize/segments/tests/test_segment_extraction.py @@ -360,7 +360,7 @@ def test_imageblock(self): { "image": test_image.pk, "decorative": False, - "alt_text": "Test alt content", + "alt_text": "The Alt text", }, ) @@ -372,7 +372,111 @@ def test_imageblock(self): f"test_streamfield.{block_id}.image", test_image.pk ), StringSegmentValue( - f"test_streamfield.{block_id}.alt_text", "Test alt content" + f"test_streamfield.{block_id}.alt_text", "The Alt text" + ), + ], + ) + + @unittest.skipUnless( + WAGTAIL_VERSION >= (6, 3), "ImageBlock was added in Wagtail 6.3" + ) + def test_imageblock_in_structblock(self): + block_id = uuid.uuid4() + test_image = get_image_model().objects.create( + title="Test image", file=get_test_image_file() + ) + page = make_test_page_with_streamfield_block( + str(block_id), + "test_imageblock_in_structblock", + { + "the_image": { + "image": test_image.pk, + "decorative": False, + "alt_text": "The Alt text", + } + }, + ) + + segments = extract_segments(page) + self.assertEqual( + segments, + [ + OverridableSegmentValue( + f"test_streamfield.{block_id}.the_image.image", test_image.pk + ), + StringSegmentValue( + f"test_streamfield.{block_id}.the_image.alt_text", "The Alt text" + ), + ], + ) + + @unittest.skipUnless( + WAGTAIL_VERSION >= (6, 3), "ImageBlock was added in Wagtail 6.3" + ) + def test_imageblock_in_listblock(self): + block_id = uuid.uuid4() + test_image = get_image_model().objects.create( + title="Test image", file=get_test_image_file() + ) + item_id = "11111111-1111-1111-1111-111111111111" + page = make_test_page_with_streamfield_block( + str(block_id), + "test_imageblock_in_listblock", + [ + { + "type": "item", + "id": item_id, + "value": { + "image": test_image.pk, + "decorative": False, + "alt_text": "", + }, + }, + ], + ) + + segments = extract_segments(page) + self.assertEqual( + segments, + [ + OverridableSegmentValue( + f"test_streamfield.{block_id}.{item_id}.image", test_image.pk + ), + ], + ) + + @unittest.skipUnless( + WAGTAIL_VERSION >= (6, 3), "ImageBlock was added in Wagtail 6.3" + ) + def test_imageblock_in_streamblock(self): + block_id = uuid.uuid4() + nested_block_id = uuid.uuid4() + test_image = get_image_model().objects.create( + title="Test image", file=get_test_image_file() + ) + page = make_test_page_with_streamfield_block( + str(block_id), + "test_imageblock_in_streamblock", + [ + { + "id": str(nested_block_id), + "type": "the_image", + "value": { + "image": test_image.pk, + "decorative": True, + "alt_text": "", + }, + }, + ], + ) + + segments = extract_segments(page) + self.assertEqual( + segments, + [ + OverridableSegmentValue( + f"test_streamfield.{block_id}.{nested_block_id}.image", + test_image.pk, ), ], ) diff --git a/wagtail_localize/test/migrations/0001_initial.py b/wagtail_localize/test/migrations/0001_initial.py index 3cac1764..97accd6a 100644 --- a/wagtail_localize/test/migrations/0001_initial.py +++ b/wagtail_localize/test/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.25 on 2024-03-10 17:20 +# Generated by Django 4.2.18 on 2025-01-31 15:00 import uuid @@ -21,9 +21,9 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ("wagtaildocs", "0012_uploadeddocument"), - ("wagtailimages", "0025_alter_image_file_alter_rendition_file"), ("wagtailcore", "0089_log_entry_data_json_null_to_object"), + ("wagtailimages", "0025_alter_image_file_alter_rendition_file"), + ("wagtaildocs", "0012_uploadeddocument"), ("wagtail_localize", "0016_rename_page_revision_translationlog_revision"), ] @@ -462,6 +462,108 @@ class Migration(migrations.Migration): ) ), ), + ( + "test_imageblock", + wagtail.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=True + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + label="Image is decorative", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + label="Alt text", required=False + ), + ), + ] + ), + ), + ( + "test_imageblock_in_structblock", + wagtail.blocks.StructBlock( + [ + ( + "the_image", + wagtail.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=True + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + label="Image is decorative", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + label="Alt text", + required=False, + ), + ), + ], + required=False, + ), + ) + ] + ), + ), + ( + "test_imageblock_in_listblock", + wagtail_localize.test.models.ImageBlockInListBlock(), + ), + ( + "test_imageblock_in_streamblock", + wagtail.blocks.StreamBlock( + [ + ( + "the_image", + wagtail.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=True + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + label="Image is decorative", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + label="Alt text", + required=False, + ), + ), + ] + ), + ) + ] + ), + ), ], blank=True, use_json_field=True, @@ -829,6 +931,108 @@ class Migration(migrations.Migration): ) ), ), + ( + "test_imageblock", + wagtail.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=True + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + label="Image is decorative", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + label="Alt text", required=False + ), + ), + ] + ), + ), + ( + "test_imageblock_in_structblock", + wagtail.blocks.StructBlock( + [ + ( + "the_image", + wagtail.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=True + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + label="Image is decorative", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + label="Alt text", + required=False, + ), + ), + ], + required=False, + ), + ) + ] + ), + ), + ( + "test_imageblock_in_listblock", + wagtail_localize.test.models.ImageBlockInListBlock(), + ), + ( + "test_imageblock_in_streamblock", + wagtail.blocks.StreamBlock( + [ + ( + "the_image", + wagtail.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=True + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + label="Image is decorative", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + label="Alt text", + required=False, + ), + ), + ] + ), + ) + ] + ), + ), ], blank=True, use_json_field=True, @@ -1111,6 +1315,108 @@ class Migration(migrations.Migration): ) ), ), + ( + "test_imageblock", + wagtail.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=True + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + label="Image is decorative", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + label="Alt text", required=False + ), + ), + ] + ), + ), + ( + "test_imageblock_in_structblock", + wagtail.blocks.StructBlock( + [ + ( + "the_image", + wagtail.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=True + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + label="Image is decorative", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + label="Alt text", + required=False, + ), + ), + ], + required=False, + ), + ) + ] + ), + ), + ( + "test_imageblock_in_listblock", + wagtail_localize.test.models.ImageBlockInListBlock(), + ), + ( + "test_imageblock_in_streamblock", + wagtail.blocks.StreamBlock( + [ + ( + "the_image", + wagtail.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + required=True + ), + ), + ( + "decorative", + wagtail.blocks.BooleanBlock( + default=False, + label="Image is decorative", + required=False, + ), + ), + ( + "alt_text", + wagtail.blocks.CharBlock( + label="Alt text", + required=False, + ), + ), + ] + ), + ) + ] + ), + ), ], blank=True, use_json_field=True, @@ -1646,7 +1952,7 @@ class Migration(migrations.Migration): ( "field", modelcluster.fields.ParentalManyToManyField( - blank=True, to="wagtail_localize_test.TestUUIDModel" + blank=True, to="wagtail_localize_test.testuuidmodel" ), ), ( diff --git a/wagtail_localize/test/migrations/0002_alter_testgeneratetranslatablefieldspage_test_streamfield_and_more.py b/wagtail_localize/test/migrations/0002_alter_testgeneratetranslatablefieldspage_test_streamfield_and_more.py deleted file mode 100644 index a23ae555..00000000 --- a/wagtail_localize/test/migrations/0002_alter_testgeneratetranslatablefieldspage_test_streamfield_and_more.py +++ /dev/null @@ -1,802 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-18 16:36 - -import wagtail.blocks -import wagtail.blocks.field_block -import wagtail.documents.blocks -import wagtail.embeds.blocks -import wagtail.fields -import wagtail.images.blocks -import wagtail.snippets.blocks - -from django.db import migrations - -import wagtail_localize.test.models - - -class Migration(migrations.Migration): - dependencies = [ - ("wagtail_localize_test", "0001_initial"), - ] - - operations = [ - migrations.AlterField( - model_name="testgeneratetranslatablefieldspage", - name="test_streamfield", - field=wagtail.fields.StreamField( - [ - ("test_charblock", wagtail.blocks.CharBlock(max_length=255)), - ("test_textblock", wagtail.blocks.TextBlock(label="text block")), - ("test_emailblock", wagtail.blocks.EmailBlock()), - ("test_urlblock", wagtail.blocks.URLBlock()), - ("test_richtextblock", wagtail.blocks.RichTextBlock()), - ("test_rawhtmlblock", wagtail.blocks.RawHTMLBlock()), - ("test_blockquoteblock", wagtail.blocks.BlockQuoteBlock()), - ( - "test_structblock", - wagtail.blocks.StructBlock( - [ - ("field_a", wagtail.blocks.TextBlock()), - ("field_b", wagtail.blocks.TextBlock()), - ] - ), - ), - ( - "test_listblock", - wagtail.blocks.ListBlock(wagtail.blocks.TextBlock()), - ), - ( - "test_listblock_in_structblock", - wagtail.blocks.StructBlock( - [ - ("title", wagtail.blocks.CharBlock(required=False)), - ( - "items", - wagtail.blocks.ListBlock( - wagtail.blocks.field_block.CharBlock - ), - ), - ( - "links_list", - wagtail.blocks.ListBlock( - wagtail.blocks.StructBlock( - [ - ( - "heading", - wagtail.blocks.CharBlock( - blank=True, - label="List Heading", - required=False, - ), - ), - ( - "pages", - wagtail.blocks.ListBlock( - wagtail.blocks.PageChooserBlock() - ), - ), - ] - ) - ), - ), - ] - ), - ), - ( - "test_nestedstreamblock", - wagtail.blocks.StreamBlock( - [ - ("block_a", wagtail.blocks.TextBlock()), - ("block_b", wagtail.blocks.TextBlock()), - ( - "block_l", - wagtail.blocks.ListBlock( - wagtail.blocks.CharBlock() - ), - ), - ("chooser", wagtail.blocks.PageChooserBlock()), - ( - "chooser_in_struct", - wagtail.blocks.StructBlock( - [("page", wagtail.blocks.PageChooserBlock())] - ), - ), - ( - "chooser_in_list", - wagtail.blocks.ListBlock( - wagtail.blocks.PageChooserBlock() - ), - ), - ] - ), - ), - ( - "test_streamblock_in_structblock", - wagtail.blocks.StructBlock( - [ - ( - "nested_stream", - wagtail.blocks.StreamBlock( - [ - ("page", wagtail.blocks.PageChooserBlock()), - ( - "checklist", - wagtail.blocks.StructBlock( - [ - ( - "page", - wagtail.blocks.PageChooserBlock(), - ) - ] - ), - ), - ] - ), - ) - ] - ), - ), - ( - "test_customstructblock", - wagtail.blocks.StructBlock( - [ - ("field_a", wagtail.blocks.TextBlock()), - ("field_b", wagtail.blocks.TextBlock()), - ] - ), - ), - ( - "test_customblockwithoutextractmethod", - wagtail_localize.test.models.CustomBlockWithoutExtractMethod(), - ), - ("test_pagechooserblock", wagtail.blocks.PageChooserBlock()), - ( - "test_pagechooserblock_with_restricted_types", - wagtail.blocks.PageChooserBlock( - [ - "wagtail_localize_test.TestHomePage", - "wagtail_localize_test.TestPage", - ] - ), - ), - ( - "test_imagechooserblock", - wagtail.images.blocks.ImageChooserBlock(), - ), - ( - "test_documentchooserblock", - wagtail.documents.blocks.DocumentChooserBlock(), - ), - ( - "test_snippetchooserblock", - wagtail.snippets.blocks.SnippetChooserBlock( - wagtail_localize.test.models.TestSnippet - ), - ), - ( - "test_nontranslatablesnippetchooserblock", - wagtail.snippets.blocks.SnippetChooserBlock( - wagtail_localize.test.models.NonTranslatableSnippet - ), - ), - ("test_embedblock", wagtail.embeds.blocks.EmbedBlock()), - ( - "test_chooserstructblock", - wagtail.blocks.StructBlock( - [("page", wagtail.blocks.PageChooserBlock())] - ), - ), - ( - "test_nestedchooserstructblock", - wagtail.blocks.StructBlock( - [ - ( - "nested_page", - wagtail.blocks.StructBlock( - [("page", wagtail.blocks.PageChooserBlock())] - ), - ) - ] - ), - ), - ( - "test_chooser_in_struct_in_listblock", - wagtail.blocks.ListBlock( - wagtail.blocks.StructBlock( - [ - ( - "page", - wagtail.blocks.PageChooserBlock(required=False), - ) - ] - ) - ), - ), - ( - "test_image_chooser_in_listblock", - wagtail.blocks.ListBlock( - wagtail.images.blocks.ImageChooserBlock() - ), - ), - ( - "test_document_chooser_in_listblock", - wagtail.blocks.ListBlock( - wagtail.documents.blocks.DocumentChooserBlock() - ), - ), - ( - "test_chooser_in_struct_in_list_in_stream_in_listblock", - wagtail.blocks.ListBlock( - wagtail.blocks.StreamBlock( - [ - ( - "list", - wagtail.blocks.ListBlock( - wagtail.blocks.StructBlock( - [ - ( - "page", - wagtail.blocks.PageChooserBlock( - required=False - ), - ) - ] - ) - ), - ) - ] - ) - ), - ), - ( - "test_imageblock", - wagtail.blocks.StructBlock( - [ - ( - "image", - wagtail.images.blocks.ImageChooserBlock( - required=True - ), - ), - ( - "decorative", - wagtail.blocks.BooleanBlock( - default=False, - label="Image is decorative", - required=False, - ), - ), - ( - "alt_text", - wagtail.blocks.CharBlock( - label="Alt text", required=False - ), - ), - ] - ), - ), - ], - blank=True, - use_json_field=True, - ), - ), - migrations.AlterField( - model_name="testpage", - name="test_streamfield", - field=wagtail.fields.StreamField( - [ - ("test_charblock", wagtail.blocks.CharBlock(max_length=255)), - ("test_textblock", wagtail.blocks.TextBlock(label="text block")), - ("test_emailblock", wagtail.blocks.EmailBlock()), - ("test_urlblock", wagtail.blocks.URLBlock()), - ("test_richtextblock", wagtail.blocks.RichTextBlock()), - ("test_rawhtmlblock", wagtail.blocks.RawHTMLBlock()), - ("test_blockquoteblock", wagtail.blocks.BlockQuoteBlock()), - ( - "test_structblock", - wagtail.blocks.StructBlock( - [ - ("field_a", wagtail.blocks.TextBlock()), - ("field_b", wagtail.blocks.TextBlock()), - ] - ), - ), - ( - "test_listblock", - wagtail.blocks.ListBlock(wagtail.blocks.TextBlock()), - ), - ( - "test_listblock_in_structblock", - wagtail.blocks.StructBlock( - [ - ("title", wagtail.blocks.CharBlock(required=False)), - ( - "items", - wagtail.blocks.ListBlock( - wagtail.blocks.field_block.CharBlock - ), - ), - ( - "links_list", - wagtail.blocks.ListBlock( - wagtail.blocks.StructBlock( - [ - ( - "heading", - wagtail.blocks.CharBlock( - blank=True, - label="List Heading", - required=False, - ), - ), - ( - "pages", - wagtail.blocks.ListBlock( - wagtail.blocks.PageChooserBlock() - ), - ), - ] - ) - ), - ), - ] - ), - ), - ( - "test_nestedstreamblock", - wagtail.blocks.StreamBlock( - [ - ("block_a", wagtail.blocks.TextBlock()), - ("block_b", wagtail.blocks.TextBlock()), - ( - "block_l", - wagtail.blocks.ListBlock( - wagtail.blocks.CharBlock() - ), - ), - ("chooser", wagtail.blocks.PageChooserBlock()), - ( - "chooser_in_struct", - wagtail.blocks.StructBlock( - [("page", wagtail.blocks.PageChooserBlock())] - ), - ), - ( - "chooser_in_list", - wagtail.blocks.ListBlock( - wagtail.blocks.PageChooserBlock() - ), - ), - ] - ), - ), - ( - "test_streamblock_in_structblock", - wagtail.blocks.StructBlock( - [ - ( - "nested_stream", - wagtail.blocks.StreamBlock( - [ - ("page", wagtail.blocks.PageChooserBlock()), - ( - "checklist", - wagtail.blocks.StructBlock( - [ - ( - "page", - wagtail.blocks.PageChooserBlock(), - ) - ] - ), - ), - ] - ), - ) - ] - ), - ), - ( - "test_customstructblock", - wagtail.blocks.StructBlock( - [ - ("field_a", wagtail.blocks.TextBlock()), - ("field_b", wagtail.blocks.TextBlock()), - ] - ), - ), - ( - "test_customblockwithoutextractmethod", - wagtail_localize.test.models.CustomBlockWithoutExtractMethod(), - ), - ("test_pagechooserblock", wagtail.blocks.PageChooserBlock()), - ( - "test_pagechooserblock_with_restricted_types", - wagtail.blocks.PageChooserBlock( - [ - "wagtail_localize_test.TestHomePage", - "wagtail_localize_test.TestPage", - ] - ), - ), - ( - "test_imagechooserblock", - wagtail.images.blocks.ImageChooserBlock(), - ), - ( - "test_documentchooserblock", - wagtail.documents.blocks.DocumentChooserBlock(), - ), - ( - "test_snippetchooserblock", - wagtail.snippets.blocks.SnippetChooserBlock( - wagtail_localize.test.models.TestSnippet - ), - ), - ( - "test_nontranslatablesnippetchooserblock", - wagtail.snippets.blocks.SnippetChooserBlock( - wagtail_localize.test.models.NonTranslatableSnippet - ), - ), - ("test_embedblock", wagtail.embeds.blocks.EmbedBlock()), - ( - "test_chooserstructblock", - wagtail.blocks.StructBlock( - [("page", wagtail.blocks.PageChooserBlock())] - ), - ), - ( - "test_nestedchooserstructblock", - wagtail.blocks.StructBlock( - [ - ( - "nested_page", - wagtail.blocks.StructBlock( - [("page", wagtail.blocks.PageChooserBlock())] - ), - ) - ] - ), - ), - ( - "test_chooser_in_struct_in_listblock", - wagtail.blocks.ListBlock( - wagtail.blocks.StructBlock( - [ - ( - "page", - wagtail.blocks.PageChooserBlock(required=False), - ) - ] - ) - ), - ), - ( - "test_image_chooser_in_listblock", - wagtail.blocks.ListBlock( - wagtail.images.blocks.ImageChooserBlock() - ), - ), - ( - "test_document_chooser_in_listblock", - wagtail.blocks.ListBlock( - wagtail.documents.blocks.DocumentChooserBlock() - ), - ), - ( - "test_chooser_in_struct_in_list_in_stream_in_listblock", - wagtail.blocks.ListBlock( - wagtail.blocks.StreamBlock( - [ - ( - "list", - wagtail.blocks.ListBlock( - wagtail.blocks.StructBlock( - [ - ( - "page", - wagtail.blocks.PageChooserBlock( - required=False - ), - ) - ] - ) - ), - ) - ] - ) - ), - ), - ( - "test_imageblock", - wagtail.blocks.StructBlock( - [ - ( - "image", - wagtail.images.blocks.ImageChooserBlock( - required=True - ), - ), - ( - "decorative", - wagtail.blocks.BooleanBlock( - default=False, - label="Image is decorative", - required=False, - ), - ), - ( - "alt_text", - wagtail.blocks.CharBlock( - label="Alt text", required=False - ), - ), - ] - ), - ), - ], - blank=True, - use_json_field=True, - ), - ), - migrations.AlterField( - model_name="testpage", - name="test_synchronized_streamfield", - field=wagtail.fields.StreamField( - [ - ("test_charblock", wagtail.blocks.CharBlock(max_length=255)), - ("test_textblock", wagtail.blocks.TextBlock(label="text block")), - ("test_emailblock", wagtail.blocks.EmailBlock()), - ("test_urlblock", wagtail.blocks.URLBlock()), - ("test_richtextblock", wagtail.blocks.RichTextBlock()), - ("test_rawhtmlblock", wagtail.blocks.RawHTMLBlock()), - ("test_blockquoteblock", wagtail.blocks.BlockQuoteBlock()), - ( - "test_structblock", - wagtail.blocks.StructBlock( - [ - ("field_a", wagtail.blocks.TextBlock()), - ("field_b", wagtail.blocks.TextBlock()), - ] - ), - ), - ( - "test_listblock", - wagtail.blocks.ListBlock(wagtail.blocks.TextBlock()), - ), - ( - "test_listblock_in_structblock", - wagtail.blocks.StructBlock( - [ - ("title", wagtail.blocks.CharBlock(required=False)), - ( - "items", - wagtail.blocks.ListBlock( - wagtail.blocks.field_block.CharBlock - ), - ), - ( - "links_list", - wagtail.blocks.ListBlock( - wagtail.blocks.StructBlock( - [ - ( - "heading", - wagtail.blocks.CharBlock( - blank=True, - label="List Heading", - required=False, - ), - ), - ( - "pages", - wagtail.blocks.ListBlock( - wagtail.blocks.PageChooserBlock() - ), - ), - ] - ) - ), - ), - ] - ), - ), - ( - "test_nestedstreamblock", - wagtail.blocks.StreamBlock( - [ - ("block_a", wagtail.blocks.TextBlock()), - ("block_b", wagtail.blocks.TextBlock()), - ( - "block_l", - wagtail.blocks.ListBlock( - wagtail.blocks.CharBlock() - ), - ), - ("chooser", wagtail.blocks.PageChooserBlock()), - ( - "chooser_in_struct", - wagtail.blocks.StructBlock( - [("page", wagtail.blocks.PageChooserBlock())] - ), - ), - ( - "chooser_in_list", - wagtail.blocks.ListBlock( - wagtail.blocks.PageChooserBlock() - ), - ), - ] - ), - ), - ( - "test_streamblock_in_structblock", - wagtail.blocks.StructBlock( - [ - ( - "nested_stream", - wagtail.blocks.StreamBlock( - [ - ("page", wagtail.blocks.PageChooserBlock()), - ( - "checklist", - wagtail.blocks.StructBlock( - [ - ( - "page", - wagtail.blocks.PageChooserBlock(), - ) - ] - ), - ), - ] - ), - ) - ] - ), - ), - ( - "test_customstructblock", - wagtail.blocks.StructBlock( - [ - ("field_a", wagtail.blocks.TextBlock()), - ("field_b", wagtail.blocks.TextBlock()), - ] - ), - ), - ( - "test_customblockwithoutextractmethod", - wagtail_localize.test.models.CustomBlockWithoutExtractMethod(), - ), - ("test_pagechooserblock", wagtail.blocks.PageChooserBlock()), - ( - "test_pagechooserblock_with_restricted_types", - wagtail.blocks.PageChooserBlock( - [ - "wagtail_localize_test.TestHomePage", - "wagtail_localize_test.TestPage", - ] - ), - ), - ( - "test_imagechooserblock", - wagtail.images.blocks.ImageChooserBlock(), - ), - ( - "test_documentchooserblock", - wagtail.documents.blocks.DocumentChooserBlock(), - ), - ( - "test_snippetchooserblock", - wagtail.snippets.blocks.SnippetChooserBlock( - wagtail_localize.test.models.TestSnippet - ), - ), - ( - "test_nontranslatablesnippetchooserblock", - wagtail.snippets.blocks.SnippetChooserBlock( - wagtail_localize.test.models.NonTranslatableSnippet - ), - ), - ("test_embedblock", wagtail.embeds.blocks.EmbedBlock()), - ( - "test_chooserstructblock", - wagtail.blocks.StructBlock( - [("page", wagtail.blocks.PageChooserBlock())] - ), - ), - ( - "test_nestedchooserstructblock", - wagtail.blocks.StructBlock( - [ - ( - "nested_page", - wagtail.blocks.StructBlock( - [("page", wagtail.blocks.PageChooserBlock())] - ), - ) - ] - ), - ), - ( - "test_chooser_in_struct_in_listblock", - wagtail.blocks.ListBlock( - wagtail.blocks.StructBlock( - [ - ( - "page", - wagtail.blocks.PageChooserBlock(required=False), - ) - ] - ) - ), - ), - ( - "test_image_chooser_in_listblock", - wagtail.blocks.ListBlock( - wagtail.images.blocks.ImageChooserBlock() - ), - ), - ( - "test_document_chooser_in_listblock", - wagtail.blocks.ListBlock( - wagtail.documents.blocks.DocumentChooserBlock() - ), - ), - ( - "test_chooser_in_struct_in_list_in_stream_in_listblock", - wagtail.blocks.ListBlock( - wagtail.blocks.StreamBlock( - [ - ( - "list", - wagtail.blocks.ListBlock( - wagtail.blocks.StructBlock( - [ - ( - "page", - wagtail.blocks.PageChooserBlock( - required=False - ), - ) - ] - ) - ), - ) - ] - ) - ), - ), - ( - "test_imageblock", - wagtail.blocks.StructBlock( - [ - ( - "image", - wagtail.images.blocks.ImageChooserBlock( - required=True - ), - ), - ( - "decorative", - wagtail.blocks.BooleanBlock( - default=False, - label="Image is decorative", - required=False, - ), - ), - ( - "alt_text", - wagtail.blocks.CharBlock( - label="Alt text", required=False - ), - ), - ] - ), - ), - ], - blank=True, - use_json_field=True, - ), - ), - ] diff --git a/wagtail_localize/test/models.py b/wagtail_localize/test/models.py index d2151bb7..247ffd55 100644 --- a/wagtail_localize/test/models.py +++ b/wagtail_localize/test/models.py @@ -214,6 +214,19 @@ def js_args(self, block): ) +class ImageBlockInStructBlock(StructBlock): + the_image = ImageBlock(required=False) + + +class ImageBlockInListBlock(blocks.ListBlock): + def __init__(self, search_index=True, **kwargs): + super().__init__(ImageBlock, search_index=search_index, **kwargs) + + +class ImageBlockInStreamBlock(blocks.StreamBlock): + the_image = ImageBlock() + + class TestStreamBlock(blocks.StreamBlock): test_charblock = blocks.CharBlock(max_length=255) test_textblock = blocks.TextBlock(label=gettext_lazy("text block")) @@ -276,6 +289,9 @@ class TestStreamBlock(blocks.StreamBlock): ) test_imageblock = ImageBlock() + test_imageblock_in_structblock = ImageBlockInStructBlock() + test_imageblock_in_listblock = ImageBlockInListBlock() + test_imageblock_in_streamblock = ImageBlockInStreamBlock() class TestCustomField(models.TextField):