-
Alexa Valentová authoredAlexa Valentová authored
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