from django.forms.utils import ErrorList from wagtail import blocks from wagtail.blocks import ( BooleanBlock, CharBlock, IntegerBlock, ListBlock, PageChooserBlock, RichTextBlock, StructBlock, TextBlock, URLBlock, ) from wagtail.blocks.struct_block import StructBlockValidationError from wagtail.images.blocks import ImageChooserBlock from shared.blocks import ( CardLinkBlockMixin, CardLinkWithHeadlineBlockMixin, ProgramItemBlock, ) class AddressBlock(StructBlock): title = CharBlock(label="Titulek", required=True) map_image = ImageChooserBlock(label="Obrázek mapy", required=False) map_link = URLBlock(label="Odkaz na detail mapy", required=False) address = TextBlock(label="Adresa", required=True) address_info = TextBlock(label="Info k adrese", required=False) class Meta: template = "district/blocks/address_block.html" icon = "home" label = "Adresa" class SimplePersonBlock(StructBlock): title = blocks.CharBlock(label="Jméno a příjmení", max_length=128, required=True) job = blocks.CharBlock( label="Povolání", max_length=128, required=False, help_text="Např. 'Informatik'" ) profile_photo = ImageChooserBlock(label="Profilová fotka", required=False) email = blocks.EmailBlock(label="Email", required=False) city = blocks.CharBlock(label="Město/obec", max_length=64, required=False) age = blocks.IntegerBlock(label="Věk", required=False) is_pirate = blocks.BooleanBlock( label="Je členem Pirátské strany?", default=True, required=False ) other_party = blocks.CharBlock(label="Strana", max_length=64, required=False) other_party_logo = ImageChooserBlock( label="Logo strany", required=False, help_text="Vyplňte pokud osoba není Pirát" ) # socials facebook_url = blocks.URLBlock(label="Odkaz na Facebook", required=False) instagram_url = blocks.URLBlock(label="Odkaz na Instagram", required=False) twitter_url = blocks.URLBlock(label="Odkaz na Twitter", required=False) youtube_url = blocks.URLBlock(label="Odkaz na Youtube kanál", required=False) flickr_url = blocks.URLBlock(label="Odkaz na Flickr", required=False) class Meta: icon = "user" label = "Osoba blok" class CandidateListBlock(StructBlock): candidate_list = blocks.StreamBlock( label="Kandidáti", local_blocks=[ ( "person_page", PageChooserBlock( label="Osoba", page_type=["district.DistrictPersonPage"] ), ), ("person_block", SimplePersonBlock()), ], ) candidate_list_big_count = IntegerBlock( label="Počet kanditátů s velkým náhledem", default=7 ) candidate_list_shown_count = IntegerBlock( label="Počet zobrazených kandidátů při načtení stránky (včetně velkých náhledů)", default=16, ) cta_text = CharBlock(label="Text 'call-to-action' baneru", required=False) cta_link = URLBlock(label="Odkaz 'call-to-action' baneru", required=False) cta_button_text = CharBlock( label="Text tlačítka 'call-to-action' baneru", max_length=24, required=False ) class Meta: template = "district/blocks/candidate_list_block.html" icon = "list-ol" label = "List kanditátů" class CardLinkBlock(CardLinkBlockMixin): page = PageChooserBlock( label="Stránka", page_type=[ "district.DistrictArticlePage", "district.DistrictArticlesPage", "district.DistrictCenterPage", "district.DistrictContactPage", "district.DistrictCrossroadPage", "district.DistrictCustomPage", "district.DistrictElectionCampaignPage", "district.DistrictElectionProgramPage", "district.DistrictElectionRootPage", "district.DistrictPeoplePage", "district.DistrictPersonPage", "district.DistrictPostElectionStrategyPage", "district.DistrictProgramPage", ], required=False, ) class Meta: template = "district/blocks/card_link_block.html" icon = "link" label = "Karta s odkazem" class CardLinkWithHeadlineBlock(CardLinkWithHeadlineBlockMixin): card_items = ListBlock(CardLinkBlock(), label="Karty s odkazy") class Meta: template = "district/blocks/card_link_with_headline_block.html" icon = "link" label = "Karty odkazů s nadpisem" class PersonCustomPositionBlock(StructBlock): position = CharBlock(label="Název pozice", required=False) person = PageChooserBlock( label="Osoba", page_type=["district.DistrictPersonPage"], ) class Meta: icon = "user" label = "Osoba s volitelnou pozicí" class CenterContactBlock(StructBlock): title = CharBlock(label="Titulek", required=True) contact_list = ListBlock(PersonCustomPositionBlock()) class Meta: template = "district/blocks/contact_block.html" icon = "mail" label = "Kontakt" class HomepageHeaderBlock(StructBlock): title = CharBlock(label="Titulek", required=False, help_text="Nap") image = ImageChooserBlock() button_text = CharBlock(label="Text tlačítka", required=False) button_link = URLBlock(label="Odkaz tlačítka", required=False) class Meta: template = "district/blocks/homepage_header_block.html" icon = "placeholder" label = "Nadpis s obrázkem a tlačítky" class HomepageSimpleHeaderBlock(StructBlock): title = CharBlock(label="Titulek", required=False) subtitle = CharBlock(label="Podtitulek", required=False) image = ImageChooserBlock() class Meta: template = "district/blocks/homepage_simple_header_block.html" icon = "image" label = "Nadpis s obrázkem v pozadí" class PersonBadgeBlock(StructBlock): person = PageChooserBlock( label="Osoba", page_type=("district.DistrictPersonPage",), required=True ) wrap_in_card = BooleanBlock(label="Zabalit do karty", default=False, required=False) caption = CharBlock( label="Popisek", required=False, help_text="Vlastní popisek na vizitce. Pokud není uvedeno, použije se výchozí profese osoby.", ) class Meta: template = "district/blocks/person_badge_block.html" icon = "user" label = "Vizitka" class PeopleGroupListBlock(StructBlock): group_title = CharBlock(label="Titulek", required=True) person_list = ListBlock( PersonCustomPositionBlock(), label="List osob", ) class Meta: template = "district/blocks/people_group_block.html" icon = "list-ul" label = "Skupina členů" class PersonUrlBlock(StructBlock): title = CharBlock(label="Název", required=True) url = URLBlock(label="URL", required=True) custom_icon = CharBlock( label="Vlastní ikonka ze styleguide", required=False, help_text="Pro vlastní ikonku zadejde název ikonky z https://styleguide.pirati.cz/latest/?p=viewall-atoms-icons (bez tečky), např. 'ico--beer'", ) class InteractiveProgramItemBlock(StructBlock): content = RichTextBlock(label="Obsah", required=True) class InteractiveProgramBlock(StructBlock): name = CharBlock(label="Název části programu", required=True) heading = CharBlock(label="Nadpis", required=True) description = RichTextBlock( label="Krátký popis, BEZ BODŮ", required=False, blank=True ) icon = blocks.ChoiceBlock( label="Ikona", required=True, choices=[ ("verejne-sluzby", "Veřejné služby"), ("zdravotni-pece", "Zdravotní péče"), ("sport", "Sport"), ("sport-plavec", "Sport - plavec"), ("socialni-politika", "Sociální politika"), ("aktivni-verejnost", "Aktivní veřejnost"), ("priroda", "Příroda"), ("vzdelavani", "Vzdělávání"), ("kultura", "Kultura"), ("otevrena-radnice", "Otevřená radnice"), ("cestovni-ruch", "Cestovní ruch"), ("doprava", "Doprava"), ("bydleni", "Bydlení"), ], ) program_items = ListBlock( InteractiveProgramItemBlock(), label="Seznam bodů", required=True ) class Meta: template = "district/blocks/interactive_program_block.html" icon = "list-ul" label = "Část programu" class StaticProgramBlock(StructBlock): headline = CharBlock(label="Titulek bloku", required=True) perex = TextBlock(label="Krátký text pod nadpisem", required=True) person = PersonCustomPositionBlock() completion_percentage = IntegerBlock(label="Procento dokončení", required=True) program_items = ListBlock(ProgramItemBlock(), label="Seznam bodů") class Meta: template = "district/blocks/program_block.html" icon = "list-ul" label = "Blok programu" class RedmineProgramBlock(StructBlock): headline = CharBlock(label="Titulek bloku", required=True) perex = TextBlock(label="Krátký text pod nadpisem", required=True) person = PersonCustomPositionBlock() redmine_issue = IntegerBlock(label="Číslo Redmine issue", required=True) completion_percentage = IntegerBlock( label="Procento dokončení - bude doplněno automaticky", required=False, help_text="Hodnota se automaticky načte s Redmine", ) program_items = ListBlock( ProgramItemBlock(), label="Seznam bodů - bude doplněno automaticky", help_text="Hodnota se automaticky načte s Redmine", required=False, ) class Meta: template = "district/blocks/program_block.html" icon = "site" label = "Blok programu stahovaný z Redmine" class HeroBannerBlock(StructBlock): sm_banner = ImageChooserBlock( label="Obrázek pro zobrazení menší než 640px", required=True ) md_banner = ImageChooserBlock( label="Obrázek pro zobrazení větší než 768px", required=True ) lg_banner = ImageChooserBlock( label="Obrázek pro zobrazení větší než 1024px", required=True ) xl_banner = ImageChooserBlock( label="Obrázek pro zobrazení větší než 1280px", required=True ) xxl_banner = ImageChooserBlock( label="Obrázek pro zobrazení větší než 1536px", required=True ) title = CharBlock(label="Titulek bloku", required=False) subtitle = CharBlock(label="Podtitulek", required=False) button_text = CharBlock(label="Text tlačítka", required=False) button_link = URLBlock(label="Odkaz tlačítka", required=False) def clean(self, value): errors = {} if value["button_link"] and not value["button_text"]: errors["button_text"] = ErrorList( ["Zadejte prosím text tlačítka, nebo smažte odkaz v tlačítku"] ) if not value["button_link"] and value["button_text"]: errors["button_link"] = ErrorList( ["Zadejte prosím odkaz tlačítka, nebo smažte text v tlačítku"] ) if errors: raise StructBlockValidationError(errors) return super().clean(value) class Meta: template = "district/blocks/hero_banner_block.html" icon = "image" label = "Hero banner" class ArticlesBlock(StructBlock): articles = ListBlock( PageChooserBlock( "district.DistrictArticlePage", required=True, label="Aktualita" ), label="Seznam aktualit", required=True, ) class Meta: template = "district/blocks/articles_block.html" icon = "list-ul" label = "Blok aktualit" class ArticleLinksBlock(StructBlock): articles = ListBlock( PageChooserBlock( "district.DistrictArticlePage", required=True, label="Aktualita" ), label="Seznam aktualit", required=True, ) class Meta: template = "district/blocks/article_links_block.html" icon = "list-ul" label = "Seznam nadpisů článků"