-
Tomáš Valenta authoredTomáš Valenta authored
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"