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

from shared.blocks import CandidateBlock as SharedCandidateBlockMixin
from shared.blocks import CandidateListBlock
from shared.blocks import CandidateListBlock as SharedCandidateListBlockMixin
from shared.blocks import \
    CandidateSecondaryListBlock as SharedCandidateSecondaryListBlockMixin
from shared.blocks import (
    CardLinkBlockMixin,
    CardLinkWithHeadlineBlockMixin,
    CarouselProgramBlock,
    CustomPrimaryCandidateBlock,
    LinkBlock,
    PersonBoxBlock,
    PersonContactBlockMixin,
    ProgramGroupBlock,
    ProgramGroupBlockMixin,
)
from shared.blocks import ProgramGroupBlockPopout as SharedProgramGroupBlockPopout
from shared.blocks import \
    ProgramGroupWithCandidatesBlock as SharedProgramGroupWithCandidatesBlockMixin
from shared.blocks import SecondaryCandidateBlock as SharedSecondaryCandidateBlockMixin
from shared.blocks import StreamBlock, TeamBlockMixin


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 = "styleguide2/includes/molecules/boxes/card_box_block.html"
        icon = "link"
        label = "Karta s odkazem"


class BoxesBlock(StructBlock):
    title = CharBlock(label="Nadpis")
    list = ListBlock(PersonBoxBlock(), 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", required=False)
    desktop_line_2 = TextBlock(label="Desktop druhý řádek", required=False)

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

    desktop_image = ImageChooserBlock(
        label="Obrázek nahrazující animaci (desktop)", required=False
    )
    mobile_image = ImageChooserBlock(
        label="Obrázek nahrazující animaci (mobil / tablet)", required=False
    )

    desktop_video_url = URLBlock(
        label="Odkaz na desktop video",
        required=False
    )

    mobile_video_url = URLBlock(
        label="Odkaz na mobilní video",
        required=False
    )

    button_url = URLBlock(
        label="Odkaz tlačítka",
        help_text="Bez odkazu tlačítko nebude viditelné.",
        required=False,
    )
    button_text = CharBlock(
        label="Text tlačítka",
        help_text="Odkaz funguje i bez tlačítka. Pokud chceš tlačítko skrýt, nevyplňuj text.",
        required=False,
    )

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


class EuroparlNewsBlock(StructBlock):
    class Meta:
        template = (
            "styleguide2/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 ProgramGroupBlockCrossroad(ProgramGroupBlockMixin):
    point_list = ListBlock(CardLinkBlock(), label="Karty programu")

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


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

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


# ARTICLE BLOCKS
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 = "styleguide2/includes/molecules/articles/article_richtext_content_with_left_image.html"


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


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

    class Meta:
        template = (
            "styleguide2/includes/molecules/boxes/card_box_with_headline_block.html"
        )
        icon = "link"
        label = "Karty"


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 = "styleguide2/includes/molecules/popouts/hoax_popout_point.html"


class TeamBlock(TeamBlockMixin):
    team_list = ListBlock(
        CardLinkWithHeadlineBlock(label="Karta týmu"),
        label="Týmy",
    )


class ElectionsProgramBlock(StructBlock):
    title = CharBlock(
        label="Název programu",
        help_text="Např. 'Krajské volby 2024', 'Evropské volby 2024', ...",
    )

    program_page = PageChooserBlock(
        label="Stránka",
        page_type=[
            "elections.ElectionsFullProgramPage",
        ],
        required=False,
    )

    class Meta:
        icon = "view"
        label = "Program z volebního webu"
        template = "styleguide2/includes/molecules/program/program_block.html"


class ProgramGroupBlockPopout(SharedProgramGroupBlockPopout, ProgramGroupBlockMixin):
    pass


class PersonContactBlock(PersonContactBlockMixin):
    person = PageChooserBlock(
        label="Osoba",
        page_type=["main.MainPersonPage"],
    )


class CandidateBlock(SharedCandidateBlockMixin):
    page = PageChooserBlock(
        label="Stránka",
        page_type=["district.DistrictPersonPage", "district.DistrictOctopusPersonPage"],
    )


class SecondaryCandidateBlock(SharedSecondaryCandidateBlockMixin):
    page = PageChooserBlock(
        label="Stránka",
        page_type=["district.DistrictPersonPage", "district.DistrictOctopusPersonPage"],
    )


class CandidateListBlock(SharedCandidateListBlockMixin):
    stream_candidates = StreamBlock(
        [
            ("candidate", CandidateBlock()),
            ("custom_candidate", CustomPrimaryCandidateBlock()),
        ],
        required=False,
        label=" ",  # Hacky way to show no label
    )


class CandidateSecondaryListBlock(SharedCandidateSecondaryListBlockMixin):
    candidates = ListBlock(
        SecondaryCandidateBlock(),
        min_num=0,
        default=[],
        label=" ",  # Hacky way to show no label
    )


class ProgramGroupWithCandidatesBlock(SharedProgramGroupWithCandidatesBlockMixin):
    primary_candidates = CandidateListBlock(
        label="Osoby na čele kandidátky",
        help_text="Zobrazí se ve velkých blocích na začátku stránky.",
    )

    secondary_candidates = CandidateSecondaryListBlock(
        label="Ostatní osoby na kandidátce",
        help_text="Zobrazí se v kompaktním seznamu pod čelem kandidátky. Níže můžeš změnit nadpis.",
    )

    program = StreamBlock(
        [
            ("program_group", ProgramGroupBlock()),
            ("program_group_crossroad", ProgramGroupBlockCrossroad()),
            ("program_group_popout", ProgramGroupBlockPopout()),
            (
                "carousel_program",
                CarouselProgramBlock(
                    template="styleguide2/includes/molecules/program/program_block.html"
                ),
            ),
        ],
        required=False,
    )


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


class LinkBlock(StructBlock):
    pass