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"