from django.utils.functional import cached_property from wagtail.blocks import ( CharBlock, ChoiceBlock, RichTextBlock, StreamBlock, StructBlock, TextBlock, ) from wagtail.embeds.blocks import EmbedBlock from wagtail.images import get_image_model from wagtail.images.blocks import ImageChooserBlock class CaptionedImageBlock(StructBlock): """ Custom `StructBlock` for utilizing images with associated caption and attribution data """ image = ImageChooserBlock(required=True) caption = CharBlock(required=False) attribution = CharBlock(required=False) @cached_property def preview_image(self): # Cache the image object for previews to avoid repeated queries return get_image_model().objects.last() def get_preview_value(self): return { **self.meta.preview_value, "image": self.preview_image, "caption": self.preview_image.description, } class Meta: icon = "image" template = "blocks/captioned_image_block.html" preview_value = {"attribution": "The Wagtail Bakery"} description = "An image with optional caption and attribution" class HeadingBlock(StructBlock): """ Custom `StructBlock` that allows the user to select h2 - h4 sizes for headers """ heading_text = CharBlock(classname="title", required=True) size = ChoiceBlock( choices=[ ("", "Select a header size"), ("h2", "H2"), ("h3", "H3"), ("h4", "H4"), ], blank=True, required=False, ) class Meta: icon = "title" template = "blocks/heading_block.html" preview_value = {"heading_text": "Healthy bread types", "size": "h2"} description = "A heading with level two, three, or four" class BlockQuote(StructBlock): """ Custom `StructBlock` that allows the user to attribute a quote to the author """ text = TextBlock() attribute_name = CharBlock(blank=True, required=False, label="e.g. Mary Berry") class Meta: icon = "openquote" template = "blocks/blockquote.html" preview_value = { "text": ( "If you read a lot you're well read / " "If you eat a lot you're well bread." ), "attribute_name": "Willie Wagtail", } description = "A quote with an optional attribution" # StreamBlocks class BaseStreamBlock(StreamBlock): """ Define the custom blocks that `StreamField` will utilize """ heading_block = HeadingBlock() paragraph_block = RichTextBlock( icon="pilcrow", template="blocks/paragraph_block.html", preview_value=( """

Our bread pledge

As a bakery, breads have always been in our hearts. Staple foods are essential for society, and – bread is the tastiest of all. We love to transform batters and doughs into baked goods with a firm dry crust and fluffy center.

""" ), description="A rich text paragraph", ) image_block = CaptionedImageBlock() block_quote = BlockQuote() embed_block = EmbedBlock( help_text="Insert an embed URL e.g https://www.youtube.com/watch?v=SGJFWirQ3ks", icon="media", template="blocks/embed_block.html", preview_template="base/preview/static_embed_block.html", preview_value="https://www.youtube.com/watch?v=mwrGSfiB1Mg", description="An embedded video or other media", )