diff --git a/shared/blocks/children.py b/shared/blocks/children.py new file mode 100644 index 0000000000000000000000000000000000000000..b950742fc6c5a934306c0789bd9e63bfd82f6ab5 --- /dev/null +++ b/shared/blocks/children.py @@ -0,0 +1,115 @@ +from django.utils.text import slugify +from wagtail.blocks import ( + CharBlock, + IntegerBlock, + ListBlock, + PageChooserBlock, + RichTextBlock, + StructBlock, + TextBlock, + URLBlock, +) +from wagtail.documents.blocks import DocumentChooserBlock +from wagtail.images.blocks import ImageChooserBlock + + +class CTAMixin(StructBlock): + button_link = URLBlock(label="Odkaz tlačítka") + button_text = CharBlock(label="Text tlačítka") + + class Meta: + icon = "doc-empty" + label = "Tlačítko s odkazem" + + +class LinkBlock(StructBlock): + text = CharBlock(label="Název") + link = URLBlock(label="Odkaz") + + class Meta: + icon = "link" + label = "Odkaz" + + +class NavbarMenuItemBlock(CTAMixin): + class Meta: + label = "Tlačítko" + template = "styleguide2/includes/molecules/navbar/additional_button.html" + + +class PersonContactBlockMixin(StructBlock): + position = CharBlock(label="Název pozice", required=False) + + @property + def person(self): + # NOTE: Needs to be implemented + + raise NotImplementedError + + # email, phone? + + class Meta: + abstract = True + icon = "user" + label = "Osoba s volitelnou pozicí" + + +class ProgramBlockPopout(StructBlock): + title = CharBlock(label="Titulek vyskakovacího bloku") + content = RichTextBlock( + label="Obsah", + features=PROGRAM_RICH_TEXT_FEATURES, + ) + + # TODO: Change in mixed-in blocks + guarantor = PageChooserBlock( + label="Garant", page_type=["district.DistrictPersonPage"], required=False + ) + + class Meta: + icon = "date" + label = "Blok programu" + + +class ProgramPopoutCategory(StructBlock): + name = CharBlock(label="Název") + icon = ImageChooserBlock(label="Ikona", required=False) + + description = RichTextBlock(label="Popis", required=False) + + point_list = ListBlock(ProgramBlockPopout(), label="Jednotlivé bloky programu") + + class Meta: + icon = "date" + label = "Kategorie programu" + + +class FlipCardBlock(StructBlock): + bg_color = CharBlock(label="Barva pozadí", default="FEC900") + + image = ImageChooserBlock(label="Obrázek", required=False) + + title = TextBlock(label="Nadpis", help_text="Řádkování je manuální.") + + content = RichTextBlock(label="Obsah") + + button_text = CharBlock( + label="Nadpis tlačítka", + help_text="Pokud není vyplněn, tlačítko se neukáže.", + required=False, + ) + button_url = CharBlock(label="Odkaz tlačítka", required=False) + + class Meta: + icon = "view" + label = "Obracecí karta" + template = "styleguide2/includes/molecules/boxes/flip_card_box.html" + + +class PersonBoxBlock(CTAMixin, StructBlock): + title = CharBlock(label="Nadpis") + image = ImageChooserBlock(label="Logo/obrázek") + + class Meta: + icon = "form" + label = "Box" \ No newline at end of file diff --git a/shared/blocks/parents.py b/shared/blocks/parents.py new file mode 100644 index 0000000000000000000000000000000000000000..51e86b00b52d041649057aa80ab1b591b6af40d1 --- /dev/null +++ b/shared/blocks/parents.py @@ -0,0 +1,323 @@ +from django.utils.text import slugify +from wagtail.blocks import ( + CharBlock, + IntegerBlock, + ListBlock, + PageChooserBlock, + RichTextBlock, + StructBlock, + TextBlock, + URLBlock, +) +from wagtail.documents.blocks import DocumentChooserBlock +from wagtail.images.blocks import ImageChooserBlock +from .children import CTAMixin, LinkBlock, NavbarMenuItemBlock, PersonContactBlockMixin, ProgramBlockPopout, ProgramPopoutCategory, FlipCardBlock, PersonBoxBlock + +# Mixins (or used as such) + + +PROGRAM_RICH_TEXT_FEATURES = [ + "h3", + "h4", + "h5", + "bold", + "italic", + "ol", + "ul", + "hr", + "link", + "document-link", + "image", + "superscript", + "subscript", + "strikethrough", + "blockquote", + "embed", +] + + +# Navbar + + +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" + + +# Articles + + +class NewsBlock(StructBlock): + title = CharBlock( + label="Titulek", + help_text="Nejnovější články se načtou automaticky", + ) + description = TextBlock(label="Popis", required=False) + + class Meta: + icon = "doc-full-inverse" + label = "Novinky" + + +class ArticleQuoteBlock(StructBlock): + quote = CharBlock(label="Citace") + autor_name = CharBlock(label="Jméno autora") + + class Meta: + icon = "user" + label = "Blok citace" + template = "styleguide2/includes/legacy/article_quote_block.html" + + +class ArticleDownloadBlock(StructBlock): + file = DocumentChooserBlock(label="Stáhnutelný soubor") + + class Meta: + icon = "user" + label = "Blok stáhnutelného dokumentu" + template = "styleguide2/includes/molecules/blocks/download_block.html" + + +# People + + +# TODO: Merge +class TwoTextColumnBlock(StructBlock): + text_column_1 = RichTextBlock(label="První sloupec textu") + text_column_2 = RichTextBlock(label="Druhý sloupec textu") + + class Meta: + icon = "doc-full" + label = "Text ve dvou sloupcích" + + +class PersonContactBoxBlock(StructBlock): + title = CharBlock(label="Titulek") + image = ImageChooserBlock(label="Ikona") + subtitle = CharBlock(label="Podtitulek") + + class Meta: + icon = "mail" + label = "Kontakty" + + +# Footer + + +class OtherLinksBlock(StructBlock): + title = CharBlock(label="Titulek") + list = ListBlock(LinkBlock, label="Seznam odkazů") + + class Meta: + icon = "link" + label = "Odkazy" + + +# Program + + +class FlipCardsBlock(StructBlock): + cards = ListBlock( + FlipCardBlock(label="Karta"), + label="Karty", + ) + + class Meta: + icon = "group" + label = "Seznam obracecích karet" + template = "styleguide2/includes/organisms/cards/flip_card_list.html" + + +class PeopleOverviewBlock(StructBlock): + title_line_1 = CharBlock(label="První řádek titulku") + title_line_2 = CharBlock(label="Druhý řádek titulku") + + description = TextBlock(label="Popis") + + list = ListBlock(PersonBoxBlock, label="Boxíky") + + class Meta: + template = ( + "styleguide2/includes/organisms/main_section/representatives_section.html" + ) + icon = "group" + label = "Skupina osob" + + +# Program + + +class ProgramGroupBlockPopout(StructBlock): + categories = ListBlock(ProgramPopoutCategory(), label="Kategorie programu") + + class Meta: + icon = "date" + label = "Vyskakovací program" + + +class ProgramGroupBlockMixin(StructBlock): + title = CharBlock( + label="Název programu", + help_text="Např. 'Krajské volby 2024', 'Evropské volby 2024', ...", + ) + # point_list = ListBlock(ProgramBlock(), label="Jednotlivé články programu") + + class Meta: + icon = "date" + template = "styleguide2/includes/molecules/program/program_block.html" + # label = "Skupina programů" + + def get_prep_value(self, value): + value = super().get_prep_value(value) + value["slug"] = slugify(value["title"]) + return value + + +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 ProgramGroupBlock(ProgramGroupBlockMixin): + point_list = ListBlock(ProgramBlock(), label="Jednotlivé články programu") + + class Meta: + icon = "date" + label = "Běžný program" + + +# Candidates + + +class CandidateBlock(StructBlock): + # NOTE: Page type should be restricted in mixed-in classes + page = PageChooserBlock(label="Stránka") + + image = ImageChooserBlock( + label="Obrázek", + help_text="Pokud není vybrán, použije se obrázek ze stránky kandidáta", + required=False, + ) + + description = TextBlock(label="Popis", required=False) + + class Meta: + template = ( + "styleguide2/includes/molecules/candidates/candidate_primary_box.html" + ) + icon = "form" + label = "Kandidát" + + +class SecondaryCandidateBlock(StructBlock): + number = CharBlock(label="Číslo") + + # NOTE: Page type should be restricted in mixed-in classes + page = PageChooserBlock(label="Stránka") + + image = ImageChooserBlock( + label="Obrázek", + help_text="Pokud není vybrán, použije se obrázek ze stránky kandidáta", + required=False, + ) + + class Meta: + template = ( + "styleguide2/includes/molecules/candidates/candidate_secondary_box.html" + ) + icon = "form" + label = "Kandidát" + + +class CandidateListBlock(StructBlock): + # NOTE: should be changed in mixed-in blocks. + candidates = ListBlock( + CandidateBlock(), + label="Kandidáti", + ) + + class Meta: + template = ( + "styleguide2/includes/organisms/candidates/candidate_primary_list.html" + ) + icon = "form" + label = "Seznam kandidátů" + + +class CandidateSecondaryListBlock(StructBlock): + heading = CharBlock(label="Nadpis zbytku kandidátky", default="Ostatní kandidátky") + + # NOTE: should be changed in mixed-in blocks. + candidates = ListBlock( + SecondaryCandidateBlock(), + label="Zbylí kandidáti na listině", + ) + + class Meta: + template = ( + "styleguide2/includes/organisms/candidates/candidate_secondary_list.html" + ) + icon = "form" + label = "Sekundární seznam kandidátů" + + +class CarouselProgramCategoryItemBlock(StructBlock): + content = TextBlock(label="Obsah") + + class Meta: + icon = "form" + label = "Bod" + + +class CarouselProgramCategoryBlock(StructBlock): + number = IntegerBlock(label="Číslo") + + name = CharBlock(label="Název") + + points = ListBlock(CarouselProgramCategoryItemBlock(), label="Body") + + class Meta: + icon = "form" + label = "Kategorie" + + +class CarouselProgramBlock(StructBlock): + label = CharBlock(label="Nadpis", help_text="Např. 'Program'", default="Program") + + categories = ListBlock(CarouselProgramCategoryBlock(), label="Kategorie") + + long_version_url = URLBlock( + label="Odkaz na celou verzi programu", + help_text="Pro zobrazení odkazu na celou verzi programu musí být obě následující pole vyplněná.", + required=False, + ) + long_version_text = CharBlock( + label="Nadpis odkazu na celou verzi programu", required=False + ) + + class Meta: + icon = "form" + label = "Priority programu, carousel" + template = "styleguide2/includes/molecules/program/card_program.html" diff --git a/shared/templates/styleguide2/includes/organisms/cards/flip_card_list.html b/shared/templates/styleguide2/includes/organisms/cards/flip_card_list.html index 66d8766ce6cefd3ecfa40e27533674d55e3d2928..eb93869ac2458b00b6c161ebc70d34ff9cf7b832 100644 --- a/shared/templates/styleguide2/includes/organisms/cards/flip_card_list.html +++ b/shared/templates/styleguide2/includes/organisms/cards/flip_card_list.html @@ -3,7 +3,7 @@ <div class=" {% block classes %} - grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 content-stretch gap-4 + grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 content-stretch gap-4 py-8 {% endblock %} " > diff --git a/shared_legacy/blocks/main.py b/shared_legacy/blocks/main.py index a2668a3ce404519250308266d30b0857598c47ce..174325dd87db7f04606bea487fdba600568233e5 100644 --- a/shared_legacy/blocks/main.py +++ b/shared_legacy/blocks/main.py @@ -221,15 +221,3 @@ class FlipCardBlock(StructBlock): icon = "view" label = "Obracecí karta" template = "styleguide2/includes/molecules/boxes/flip_card_box.html" - - -class FlipCardsBlock(StructBlock): - cards = ListBlock( - FlipCardBlock(label="Karta"), - label="Karty", - ) - - class Meta: - icon = "group" - label = "Seznam obracecích karet" - template = "styleguide2/includes/organisms/cards/flip_card_list.html" diff --git a/uniweb/models.py b/uniweb/models.py index e54380a7e89da64f59987d637faa2824b594bc12..a3d2cb0ba9da1b2d652dc90adabdf807d1beaa62 100644 --- a/uniweb/models.py +++ b/uniweb/models.py @@ -35,6 +35,8 @@ from shared.blocks import ( NewsletterSubscriptionBlock, PictureHeadlineBlock, PictureListBlock, + FlipCardsBlock, + DEFAULT_CONTENT_BLOCKS ) from shared.const import RICH_TEXT_DEFAULT_FEATURES from shared.models import ( @@ -50,7 +52,6 @@ from shared.models import ( SocialMixin, SubpageMixin, ) -from shared_legacy.blocks import FlipCardsBlock from shared_legacy.models import FooterMixin as LegacyFooterMixin from shared_legacy.utils import make_promote_panels, strip_all_html_tags, trim_to_length from tuning import admin_help @@ -70,46 +71,6 @@ from .constants import ( ) -class ColorBlock(blocks.StructBlock): - """ - Intended as parent class for blocks with color option. - """ - - color = blocks.ChoiceBlock(COLOR_CHOICES, label="barva", default=BLACK_ON_WHITE) - - def get_context(self, value, parent_context=None): - context = super().get_context(value, parent_context=parent_context) - if "css_class" not in context: - context["css_class"] = [] - context["css_class"] += COLOR_CSS[value["color"]] - return context - - -class AlignBlock(blocks.StructBlock): - """ - Intended as parent class for blocks with align option. - """ - - align = blocks.ChoiceBlock(ALIGN_CHOICES, label="zarovnání", default=LEFT) - - def get_context(self, value, parent_context=None): - context = super().get_context(value, parent_context=parent_context) - if "css_class" not in context: - context["css_class"] = [] - context["css_class"] += ALIGN_CSS[value["align"]] - return context - - -class AdvancedTitleBlock(ColorBlock, AlignBlock): - title = blocks.CharBlock(label="nadpis") - - class Meta: - label = "nadpis (pokročilý)" - icon = "title" - group = "nadpisy" - template = "uniweb/blocks/advanced_title.html" - - class ArticlesBlock(blocks.StructBlock): page = blocks.PageChooserBlock( label="Sekce článků", page_type=["uniweb.UniwebArticlesIndexPage"] @@ -196,79 +157,8 @@ class CalendarAgendaBlock(blocks.StructBlock): return context -class ButtonBlock(blocks.StructBlock): - text = blocks.CharBlock(label="Nadpis") - - url = blocks.URLBlock( - label="Odkaz", - help_text="Pokud je odkaz vyplněný, není nutno vyplňovat stránku.", - required=False, - ) - - page = blocks.PageChooserBlock( - label="Stránka", - help_text="Pokud je stránka vyplněná, není nutno vyplňovat odkaz.", - required=False, - ) - - class Meta: - label = "Tlačítko" - icon = "link-external" - group = "ostatní" - template = "uniweb/blocks/button.html" - - -CONTENT_STREAM_BLOCKS = [ - # title, advanced_title - ("headline", HeadlineBlock()), - # picture_title - ("picture_title", PictureHeadlineBlock()), - # text - ( - "text", - blocks.RichTextBlock( - label="Textový editor", - features=RICH_TEXT_DEFAULT_FEATURES, - template="styleguide2/includes/atoms/text/prose_richtext.html", - ), - ), - # advanced_text - ("advanced_text", AdvancedTextBlock()), - # text_columns - ("text_columns", ColumnsTextBlock()), - # advanced_text_columns - ("advanced_text_columns", AdvancedColumnsTextBlock()), - # gallery - ("new_gallery", GalleryBlock()), - # picture_list - ("picture_list", PictureListBlock()), - # aligned_table - ( - "aligned_table", - AlignedTableBlock( - group="ostatní", - template="styleguide2/includes/atoms/table/aligned_table.html", - ), - ), - # table - ( - "table", - TableBlock( - label="Tabulka", - group="ostatní", - template="styleguide2/includes/atoms/table/table.html", - ), - ), - # articles - ("articles", ArticlesBlock()), - # calendar_agenda - ("calendar_agenda", CalendarAgendaBlock()), # Unfinished - # button - ("new_button", SharedButtonBlock()), - # chart - ("chart", ChartBlock()), - # cards - ("cards", FlipCardsBlock(template="uniweb/blocks/flip_cards.html")), # Unfinished +CONTENT_STREAM_BLOCKS = DEFAULT_CONTENT_BLOCKS + [ + ("calendar_agenda", CalendarAgendaBlock()) ]