Skip to content
Snippets Groups Projects
blocks.py 10.02 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

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/blocks/card_link_block.html"
        icon = "link"
        label = "Karta odkazu"


class CTAMixin(StructBlock):
    button_link = URLBlock(label="Odkaz tlačítka")
    button_text = CharBlock(label="Text tlačítka")

    class Meta:
        icon = "doc-empty"
        label = "Výzva s odkazem"
        template = "main/blocks/article_quote_block.html"


class ProgramGroupBlockMixin(StructBlock):
    title = CharBlock(label="Titulek části programu")
    slug = CharBlock(
        label="Slug části programu",
        required=False,
        help_text="Není třeba vyplňovat, bude automaticky vyplněno",
    )
    perex = RichTextBlock(
        label="Perex části programu",
        required=False,
        features=PROGRAM_RICH_TEXT_FEATURES,
    )
    # 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(CTAMixin, StructBlock):
    image = ImageChooserBlock(label="Hlavní obrázek jednoho slidu carouselu")
    line_1 = TextBlock(label="První řádek")
    line_2 = TextBlock(label="Druhý řádek")

    class Meta:
        icon = "form"
        label = "Stránka carouselu"


class HomePageCarouselBlock(StructBlock):
    slides = ListBlock(HomePageCarouseSlideBlock, label="Obrázky s nadpisy - carouselu")

    class Meta:
        template = "main/blocks/homepage_carousel_block.html"
        icon = "folder-open-1"
        label = "Carousel s  obrázky"


class NewsBlock(StructBlock):
    title = CharBlock(
        label="Titulek",
        help_text="Nejnovější články se načtou automaticky",
    )
    image = ImageChooserBlock(label="Obrázek pozadí", required=False)

    class Meta:
        template = "main/blocks/news_block.html"
        icon = "doc-full-inverse"
        label = "Novinky"


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 = CharBlock(label="Hlavní titulek")
    list = ListBlock(BoxBlock, label="Boxíky")

    class Meta:
        template = "main/blocks/people_overview_block.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",
    )
    image = ImageChooserBlock(label="Obrázek pozadí", required=False)

    class Meta:
        template = "main/blocks/regions_block.html"
        icon = "view"
        label = "Články pro regiony"


class PersonContactBlock(StructBlock):
    position = CharBlock(label="Název pozice", required=False)
    # email, phone?
    person = PageChooserBlock(
        label="Osoba",
        page_type=["main.MainPersonPage"],
    )

    class Meta:
        icon = "user"
        label = "Osoba s volitelnou pozicí"


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

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


# Footer
class LinkBlock(StructBlock):
    text = CharBlock(
        label="Titulek odkazu (text, který se zobrazí místo dlouhého odkazu)"
    )
    link = URLBlock(label="Odkaz")

    class Meta:
        icon = "link"
        label = "Odkaz"


class OtherLinksBlock(StructBlock):
    title = CharBlock(label="Titulek")
    list = ListBlock(LinkBlock, label="Seznam odkazů s titulkem")

    class Meta:
        icon = "link"
        label = "Ostatní odkazy"
        template = "main/blocks/article_quote_block.html"


class SocialLinkBlock(LinkBlock):
    icon = CharBlock(
        label="Ikona",
        help_text="Seznam ikon - https://styleguide.pirati.cz/latest/?p=viewall-atoms-icons <br/>"
        "Název ikony zadejte bez tečky na začátku",
    )  # TODO CSS class name or somthing better?

    class Meta:
        icon = "link"
        label = "Odkaz"


# 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/blocks/article_quote_block.html"


class ArticleImageBlock(StructBlock):
    image = ImageChooserBlock(label="Obrázek")
    href = URLBlock(label="Odkaz k textu")
    text = CharBlock(label="Text")

    class Meta:
        icon = "image"
        label = "Obrázek s textem a odkazem"
        template = "main/blocks/article_image_block.html"


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

    class Meta:
        icon = "user"
        label = "Blok stáhnutelného dokumentu"
        template = "main/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 = "text"
        label = "Text ve dvou sloupcích"


class CardLinkWithHeadlineBlock(CardLinkWithHeadlineBlockMixin):
    card_items = ListBlock(CardLinkBlock(), label="Karty odkazu")

    class Meta:
        template = "main/blocks/card_link_with_headline_block.html"
        icon = "link"
        label = "Karty odkazů s nadpisem"


class InstagramAccessBlock(StructBlock):
    name = CharBlock(label="Zobrazované jméno")
    username = CharBlock(label="Username", help_text="Např. pirati.cz, bez @ na začátku!")
    access_token = CharBlock(label="Přístupový token")

    class Meta:
        label = "Synchronizace s Instagramem"
        help_text = (
            "Informace lze získat přihlášením požadovaným Instagramovým "
            "účtem na tools.pirati.cz/instagram . Token je třeba kvůli "
            "podmínkám Instagramu každých 60 dní obnovit."
        )


class InstagramPostsBlock(StructBlock):
    title = CharBlock(
        label="Titulek",
        help_text="Instagramové posty budou načteny pro všechny profily uvedené v nastavení webu automaticky",
    )

    class Meta:
        template = "main/blocks/instagram_block.html"
        icon = "openquote"
        label = "Instagramové posty"