Skip to content
Snippets Groups Projects
blocks.py 9.23 KiB
from django.utils.text import slugify
from wagtail.blocks import (
    CharBlock,
    ChoiceBlock,
    ListBlock,
    PageChooserBlock,
    RichTextBlock,
    StructBlock,
    TextBlock,
    URLBlock,
)
from wagtail.documents.blocks import DocumentChooserBlock
from wagtail.images.blocks import ImageChooserBlock

from shared.blocks import CardLinkBlockMixin, CardLinkWithHeadlineBlockMixin, CTAMixin

PROGRAM_RICH_TEXT_FEATURES = [
    "h3",
    "h4",
    "h5",
    "bold",
    "italic",
    "ol",
    "ul",
    "hr",
    "link",
    "document-link",
    "image",
    "superscript",
    "subscript",
    "strikethrough",
    "blockquote",
    "embed",
]


class CardLinkBlock(CardLinkBlockMixin):
    page = PageChooserBlock(
        label="Stránka",
        page_type=[
            "main.MainArticlesPage",
            "main.MainArticlePage",
            "main.MainProgramPage",
            "main.MainPeoplePage",
            "main.MainPersonPage",
            "main.MainSimplePage",
            "main.MainContactPage",
            "main.MainCrossroadPage",
        ],
        required=False,
    )

    class Meta:
        template = "main/includes/molecules/boxes/card_box_block.html"
        icon = "link"
        label = "Karta s odkazem"


class ProgramGroupBlockMixin(StructBlock):
    title = CharBlock(label="Titulek části programu")
    # point_list = ListBlock(ProgramBlock(), label="Jednotlivé články programu")

    class Meta:
        icon = "date"
        # label = "Skupina programů"

    def get_prep_value(self, value):
        value = super().get_prep_value(value)
        value["slug"] = slugify(value["title"])
        return value


class BoxBlock(CTAMixin, StructBlock):
    title = CharBlock(label="Nadpis")
    image = ImageChooserBlock(label="Logo/obrázek")

    class Meta:
        icon = "form"
        label = "Box"


class BoxesBlock(StructBlock):
    title = CharBlock(label="Nadpis")
    list = ListBlock(BoxBlock, label="Boxíky")
    image = ImageChooserBlock(label="Obrázek pozadí", required=False)

    class Meta:
        template = "main/blocks/boxes_block.html"
        icon = "grip"
        label = "Skupina boxů"


class HomePageCarouseSlideBlock(StructBlock):
    desktop_line_1 = TextBlock(label="Desktop první řádek")
    desktop_line_2 = TextBlock(label="Desktop druhý řádek")

    mobile_line_1 = TextBlock(label="První mobilní řádek")
    mobile_line_2 = TextBlock(label="Druhý mobilní řádek")
    mobile_line_3 = TextBlock(label="Třetí mobilní řádek")

    class Meta:
        template = "main/includes/molecules/menus/carousel.html"
        icon = "form"
        label = "Carousel"


class NewsBlock(StructBlock):
    title = CharBlock(
        label="Titulek",
        help_text="Nejnovější články se načtou automaticky",
    )
    description = TextBlock(label="Popis")

    class Meta:
        template = "main/includes/organisms/articles/articles_section.html"
        icon = "doc-full-inverse"
        label = "Novinky"


class EuroparlNewsBlock(StructBlock):
    class Meta:
        template = "main/includes/organisms/articles/europarl_articles_section.html"
        icon = "doc-full-inverse"
        label = "Novinky z Eurovoleb"


class PeopleGroupBlock(StructBlock):
    title = CharBlock(label="Titulek")
    slug = CharBlock(
        label="Slug skupiny",
        required=False,
        help_text="Není třeba vyplňovat, bude automaticky vyplněno",
    )
    person_list = ListBlock(
        PageChooserBlock(page_type="main.MainPersonPage", label="Detail osoby"),
        label="Skupina osob",
    )

    class Meta:
        icon = "group"
        label = "Slug skupiny"

    def get_prep_value(self, value):
        value = super().get_prep_value(value)
        value["slug"] = slugify(value["title"])
        return value


class PeopleOverviewBlock(StructBlock):
    title_line_1 = CharBlock(label="První řádek titulku")
    title_line_2 = CharBlock(label="Druhý řádek titulku")

    description = TextBlock(label="Popis")

    list = ListBlock(BoxBlock, label="Boxíky")

    class Meta:
        template = "main/includes/organisms/main_section/representatives_section.html"
        icon = "group"
        label = "Skupina osob"


class ProgramBlock(StructBlock):
    url = URLBlock(
        label="Odkaz pokrývající celou tuto část",
        required=False,
    )
    icon = ImageChooserBlock(
        label="Ikona",
        required=False,
    )
    title = CharBlock(label="Titulek článku programu")
    text = RichTextBlock(
        label="Obsah",
        features=PROGRAM_RICH_TEXT_FEATURES,
    )

    class Meta:
        icon = "date"
        label = "Článek programu"


class ProgramBlockPopout(StructBlock):
    title = CharBlock(label="Titulek vyskakovacího bloku")
    content = RichTextBlock(
        label="Obsah",
        features=PROGRAM_RICH_TEXT_FEATURES,
    )

    class Meta:
        icon = "date"
        label = "Blok programu"


class ProgramPopoutCategory(StructBlock):
    name = CharBlock(label="Název")
    icon = ImageChooserBlock(label="Ikona", required=False)

    point_list = ListBlock(ProgramBlockPopout(), label="Jednotlivé bloky programu")

    class Meta:
        icon = "date"
        label = "Kategorie programu"


class ProgramGroupBlock(ProgramGroupBlockMixin):
    point_list = ListBlock(ProgramBlock(), label="Jednotlivé články programu")

    class Meta:
        icon = "date"
        label = "Běžný program"


class ProgramGroupBlockCrossroad(ProgramGroupBlockMixin):
    point_list = ListBlock(CardLinkBlock(), label="Karty programu")

    class Meta:
        icon = "date"
        label = "Rozcestníkový program"


class ProgramGroupBlockPopout(ProgramGroupBlockMixin):
    categories = ListBlock(ProgramPopoutCategory(), label="Kategorie programu")

    class Meta:
        icon = "date"
        label = "Vyskakovací program"


class RegionsBlock(StructBlock):
    title = CharBlock(
        label="Titulek",
        help_text="Články pro regiony se načtou automaticky",
    )

    class Meta:
        template = "main/includes/organisms/main_section/region_section.html"
        icon = "view"
        label = "Články pro regiony"


class PersonContactBoxBlock(StructBlock):
    title = CharBlock(label="Titulek")
    image = ImageChooserBlock(label="Ikona")
    subtitle = CharBlock(label="Podtitulek")

    class Meta:
        icon = "mail"
        label = "Kontakty"


# ARTICLE BLOCKS
class ArticleQuoteBlock(StructBlock):
    quote = CharBlock(label="Citace")
    autor_name = CharBlock(label="Jméno autora")

    class Meta:
        icon = "user"
        label = "Blok citace"
        template = "main/includes/legacy/article_quote_block.html"


class ArticleImageMixin(StructBlock):
    image = ImageChooserBlock(label="Obrázek")
    image_source = CharBlock(
        label="Zdroj obrázku",
        help_text="Např. 'europoslankyně Markéta Gregorová'",
        required=False,
    )

    text = RichTextBlock(label="Text")


class ArticleLeftImageBlock(ArticleImageMixin):
    class Meta:
        icon = "image"
        label = "Text s obrázkem vlevo"
        template = "main/includes/molecules/articles/article_richtext_content_with_left_image.html"


class ArticleRightImageBlock(ArticleImageMixin):
    class Meta:
        icon = "image"
        label = "Text s obrázkem vpravo"
        template = "main/includes/molecules/articles/article_richtext_content_with_right_image.html"


class ArticleDownloadBlock(StructBlock):
    file = DocumentChooserBlock(label="Stáhnutelný soubor")

    class Meta:
        icon = "user"
        label = "Blok stáhnutelného dokumentu"
        template = "main/includes/molecules/blocks/article_download_block.html"


class TwoTextColumnBlock(StructBlock):
    text_column_1 = RichTextBlock(label="První sloupec textu")
    text_column_2 = RichTextBlock(label="Druhý sloupec textu")

    class Meta:
        icon = "doc-full"
        label = "Text ve dvou sloupcích"


class CardLinkWithHeadlineBlock(CardLinkWithHeadlineBlockMixin):
    card_items = ListBlock(
        CardLinkBlock(template="main/includes/molecules/boxes/card_box_block.html"),
        label="Karty s odkazy",
    )

    class Meta:
        template = "main/includes/molecules/boxes/card_box_with_headline_block.html"
        icon = "link"
        label = "Karty odkazů s nadpisem"


class HoaxBlock(StructBlock):
    title = CharBlock(label="Titulek")
    hoax = RichTextBlock(label="Hoax")
    image = ImageChooserBlock(label="Obrázek")
    image_explanation = CharBlock(label="Popis obrázku", required=False)
    reality = RichTextBlock(label="Realita")

    class Meta:
        icon = "view"
        label = "Hoax"
        template = "main/blocks/hoax_block.html"


class TeamBlock(StructBlock):
    title = CharBlock(label="Název sekce týmů")
    slug = CharBlock(
        label="Slug sekce",
        required=False,
        help_text="Není třeba vyplňovat, bude automaticky vyplněno",
    )
    team_list = ListBlock(
        CardLinkWithHeadlineBlock(label="Karta týmu"),
        label="Týmy",
    )

    class Meta:
        icon = "group"
        label = "Týmy"

    def get_prep_value(self, value):
        value = super().get_prep_value(value)
        value["slug"] = slugify(value["title"])
        return value


# --- TODO: Remove legacy blocks used in migrations only

class LinkBlock(StructBlock):
    pass