123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- 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=(
- """
- <h2>Our bread pledge</h2>
- <p>As a bakery, <b>breads</b> have <i>always</i> been in our hearts.
- <a href="https://en.wikipedia.org/wiki/Staple_food">Staple foods</a>
- 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.</p>
- """
- ),
- 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",
- )
|