From 9e25e49755f2ba0383f79b03449e97738f8432be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0t=C4=9Bp=C3=A1n=20Farka?= <stepanfarka11@gmail.com> Date: Fri, 1 Apr 2022 12:32:35 +0200 Subject: [PATCH] [ADD] card link with headline block --- district/blocks.py | 31 +++++++ ...ter_districtcrossroadpage_cards_content.py | 89 +++++++++++++++++++ district/models.py | 2 +- .../district/blocks/card_link_block.html | 7 +- .../blocks/card_link_with_headline_block.html | 14 +++ .../district/district_crossroad_page.html | 6 +- region/blocks.py | 31 +++++++ ...alter_regioncrossroadpage_cards_content.py | 89 +++++++++++++++++++ region/models.py | 2 +- .../region/blocks/card_link_block.html | 7 +- .../blocks/card_link_with_headline_block.html | 14 +++ .../region/region_crossroad_page.html | 6 +- 12 files changed, 282 insertions(+), 16 deletions(-) create mode 100644 district/migrations/0049_alter_districtcrossroadpage_cards_content.py create mode 100644 district/templates/district/blocks/card_link_with_headline_block.html create mode 100644 region/migrations/0024_alter_regioncrossroadpage_cards_content.py create mode 100644 region/templates/region/blocks/card_link_with_headline_block.html diff --git a/district/blocks.py b/district/blocks.py index 6cba4aca..b3a58725 100644 --- a/district/blocks.py +++ b/district/blocks.py @@ -1,3 +1,4 @@ +from django.forms.utils import ErrorList from wagtail.core.blocks import ( CharBlock, IntegerBlock, @@ -7,6 +8,7 @@ from wagtail.core.blocks import ( TextBlock, URLBlock, ) +from wagtail.core.blocks.struct_block import StructBlockValidationError from wagtail.images.blocks import ImageChooserBlock @@ -81,13 +83,42 @@ class CardLinkBlock(StructBlock): "district.DistrictProgramPage", "district.DistrictTagsPage", ], + required=False, ) + link = URLBlock(label="Odkaz", required=False) class Meta: template = "district/blocks/card_link_block.html" icon = "link" label = "Karta odkazu" + def clean(self, value): + errors = {} + + if value["page"] and value["link"]: + errors["page"] = ErrorList( + ["Stránka nemůže být vybrána současně s odkazem."] + ) + errors["link"] = ErrorList( + ["Odkaz nemůže být vybrán současně se stránkou."] + ) + elif not value["page"] and not value["link"]: + errors["page"] = ErrorList(["Zvolte stránku nebo vyplňte odkaz."]) + errors["link"] = ErrorList(["Vyplňte odkaz nebo zvolte stránku."]) + if errors: + raise StructBlockValidationError(errors) + return super().clean(value) + + +class CardLinkWithHeadlineBlock(StructBlock): + headline = CharBlock(label="Titulek bloku", required=False) + card_items = ListBlock(CardLinkBlock(), label="Karty odkazu") + + class Meta: + template = "district/blocks/card_link_with_headline_block.html" + icon = "link" + label = "Karta odkazu s nadpisem" + class CenterContactBlock(StructBlock): title = CharBlock(label="Titulek", required=True) diff --git a/district/migrations/0049_alter_districtcrossroadpage_cards_content.py b/district/migrations/0049_alter_districtcrossroadpage_cards_content.py new file mode 100644 index 00000000..46f267ba --- /dev/null +++ b/district/migrations/0049_alter_districtcrossroadpage_cards_content.py @@ -0,0 +1,89 @@ +# Generated by Django 4.0.3 on 2022-04-01 10:21 + +import wagtail.core.blocks +import wagtail.core.fields +import wagtail.images.blocks +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("district", "0048_districthomepage_footperson_coord_title_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="districtcrossroadpage", + name="cards_content", + field=wagtail.core.fields.StreamField( + [ + ( + "cards", + wagtail.core.blocks.StructBlock( + [ + ( + "headline", + wagtail.core.blocks.CharBlock( + label="Titulek bloku", required=False + ), + ), + ( + "card_items", + wagtail.core.blocks.ListBlock( + wagtail.core.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + label="Obrázek" + ), + ), + ( + "title", + wagtail.core.blocks.CharBlock( + label="Titulek", required=True + ), + ), + ( + "page", + wagtail.core.blocks.PageChooserBlock( + label="Stránka", + page_type=[ + "district.DistrictAfterElectionPage", + "district.DistrictArticlePage", + "district.DistrictArticlesPage", + "district.DistrictCenterPage", + "district.DistrictContactPage", + "district.DistrictCrossroadPage", + "district.DistrictCustomPage", + "district.DistrictElectionPage", + "district.DistrictElectionPointPage", + "district.DistrictPeoplePage", + "district.DistrictPersonPage", + "district.DistrictProgramPage", + "district.DistrictTagsPage", + ], + required=False, + ), + ), + ( + "link", + wagtail.core.blocks.URLBlock( + label="Odkaz", required=False + ), + ), + ] + ), + label="Karty odkazu", + ), + ), + ] + ), + ) + ], + blank=True, + verbose_name="Karty rozcestníku", + ), + ), + ] diff --git a/district/models.py b/district/models.py index c3608b79..ae98eafd 100644 --- a/district/models.py +++ b/district/models.py @@ -881,7 +881,7 @@ class DistrictCrossroadPage(SubpageMixin, MetadataPageMixin, Page): ### FIELDS cards_content = StreamField( - [("cards", blocks.CardLinkBlock())], + [("cards", blocks.CardLinkWithHeadlineBlock())], verbose_name="Karty rozcestníku", blank=True, ) diff --git a/district/templates/district/blocks/card_link_block.html b/district/templates/district/blocks/card_link_block.html index 0ae2036a..1694cd92 100644 --- a/district/templates/district/blocks/card_link_block.html +++ b/district/templates/district/blocks/card_link_block.html @@ -1,14 +1,15 @@ {% load wagtailcore_tags wagtailimages_tags %} {% image self.image width-356 as img %} +{% firstof self.page.url self.link as target_url %} <article class="card card--hoveractive"> - <a href="{{ self.page.url }}"> + <a href="{{ target_url }}"> <img src="{{ img.url }}" alt="{{ self.page.title }}" class="w-full h-48 object-cover"> </a> <div class="card__body p-4"> <h1 class="card-headline mb-2"> - <a href="{{ self.page.url }}"> - {{ self.page.title }} + <a href="{{ target_url }}"> + {{ self.title }} </a> </h1> <p class="card-body-text"></p> diff --git a/district/templates/district/blocks/card_link_with_headline_block.html b/district/templates/district/blocks/card_link_with_headline_block.html new file mode 100644 index 00000000..7556319d --- /dev/null +++ b/district/templates/district/blocks/card_link_with_headline_block.html @@ -0,0 +1,14 @@ +{% load wagtailcore_tags %} + +<div class="mb-8"> + {% if self.headline %} + <h1 class="head-alt-md md:head-alt-lg max-w-5xl mb-8">{{ self.headline }}</h1> + {% endif %} + <main> + <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8"> + {% for card_block in self.card_items %} + {% include_block card_block %} + {% endfor %} + </div> + </main> +</div> diff --git a/district/templates/district/district_crossroad_page.html b/district/templates/district/district_crossroad_page.html index 12485466..8297c165 100644 --- a/district/templates/district/district_crossroad_page.html +++ b/district/templates/district/district_crossroad_page.html @@ -2,16 +2,14 @@ {% load wagtailcore_tags %} {% block content %} - <main> - <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 pt-8 lg:py-24"> + <section class="pt-8 lg:py-24"> {% for card_block in page.cards_content %} {% include_block card_block %} {% endfor %} - </div> {% for block in page.content %} <div class="content-block mb-8"> {% include_block block %} </div> {% endfor %} - </main> + </section> {% endblock %} diff --git a/region/blocks.py b/region/blocks.py index a1320b62..2aa72482 100644 --- a/region/blocks.py +++ b/region/blocks.py @@ -1,3 +1,4 @@ +from django.forms.utils import ErrorList from wagtail.core.blocks import ( CharBlock, IntegerBlock, @@ -7,6 +8,7 @@ from wagtail.core.blocks import ( TextBlock, URLBlock, ) +from wagtail.core.blocks.struct_block import StructBlockValidationError from wagtail.images.blocks import ImageChooserBlock @@ -81,13 +83,42 @@ class CardLinkBlock(StructBlock): "region.RegionProgramPage", "region.RegionTagsPage", ], + required=False, ) + link = URLBlock(label="Odkaz", required=False) class Meta: template = "region/blocks/card_link_block.html" icon = "link" label = "Karta odkazu" + def clean(self, value): + errors = {} + + if value["page"] and value["link"]: + errors["page"] = ErrorList( + ["Stránka nemůže být vybrána současně s odkazem."] + ) + errors["link"] = ErrorList( + ["Odkaz nemůže být vybrán současně se stránkou."] + ) + elif not value["page"] and not value["link"]: + errors["page"] = ErrorList(["Zvolte stránku nebo vyplňte odkaz."]) + errors["link"] = ErrorList(["Vyplňte odkaz nebo zvolte stránku."]) + if errors: + raise StructBlockValidationError(errors) + return super().clean(value) + + +class CardLinkWithHeadlineBlock(StructBlock): + headline = CharBlock(label="Titulek bloku", required=False) + card_items = ListBlock(CardLinkBlock(), label="Karty odkazu") + + class Meta: + template = "region/blocks/card_link_with_headline_block.html" + icon = "link" + label = "Karta odkazu s nadpisem" + class CenterContactBlock(StructBlock): title = CharBlock(label="Titulek", required=True) diff --git a/region/migrations/0024_alter_regioncrossroadpage_cards_content.py b/region/migrations/0024_alter_regioncrossroadpage_cards_content.py new file mode 100644 index 00000000..2b170f73 --- /dev/null +++ b/region/migrations/0024_alter_regioncrossroadpage_cards_content.py @@ -0,0 +1,89 @@ +# Generated by Django 4.0.3 on 2022-04-01 10:21 + +import wagtail.core.blocks +import wagtail.core.fields +import wagtail.images.blocks +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("region", "0023_regionhomepage_footperson_coord_title_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="regioncrossroadpage", + name="cards_content", + field=wagtail.core.fields.StreamField( + [ + ( + "cards", + wagtail.core.blocks.StructBlock( + [ + ( + "headline", + wagtail.core.blocks.CharBlock( + label="Titulek bloku", required=False + ), + ), + ( + "card_items", + wagtail.core.blocks.ListBlock( + wagtail.core.blocks.StructBlock( + [ + ( + "image", + wagtail.images.blocks.ImageChooserBlock( + label="Obrázek" + ), + ), + ( + "title", + wagtail.core.blocks.CharBlock( + label="Titulek", required=True + ), + ), + ( + "page", + wagtail.core.blocks.PageChooserBlock( + label="Stránka", + page_type=[ + "region.RegionAfterElectionPage", + "region.RegionArticlePage", + "region.RegionArticlesPage", + "region.RegionCenterPage", + "region.RegionContactPage", + "region.RegionCrossroadPage", + "region.RegionCustomPage", + "region.RegionElectionPage", + "region.RegionElectionPointPage", + "region.RegionPeoplePage", + "region.RegionPersonPage", + "region.RegionProgramPage", + "region.RegionTagsPage", + ], + required=False, + ), + ), + ( + "link", + wagtail.core.blocks.URLBlock( + label="Odkaz", required=False + ), + ), + ] + ), + label="Karty odkazu", + ), + ), + ] + ), + ) + ], + blank=True, + verbose_name="Karty rozcestníku", + ), + ), + ] diff --git a/region/models.py b/region/models.py index f34467c0..b23ccd0a 100644 --- a/region/models.py +++ b/region/models.py @@ -874,7 +874,7 @@ class RegionCrossroadPage(SubpageMixin, MetadataPageMixin, Page): ### FIELDS cards_content = StreamField( - [("cards", blocks.CardLinkBlock())], + [("cards", blocks.CardLinkWithHeadlineBlock())], verbose_name="Karty rozcestníku", blank=True, ) diff --git a/region/templates/region/blocks/card_link_block.html b/region/templates/region/blocks/card_link_block.html index 0ae2036a..1694cd92 100644 --- a/region/templates/region/blocks/card_link_block.html +++ b/region/templates/region/blocks/card_link_block.html @@ -1,14 +1,15 @@ {% load wagtailcore_tags wagtailimages_tags %} {% image self.image width-356 as img %} +{% firstof self.page.url self.link as target_url %} <article class="card card--hoveractive"> - <a href="{{ self.page.url }}"> + <a href="{{ target_url }}"> <img src="{{ img.url }}" alt="{{ self.page.title }}" class="w-full h-48 object-cover"> </a> <div class="card__body p-4"> <h1 class="card-headline mb-2"> - <a href="{{ self.page.url }}"> - {{ self.page.title }} + <a href="{{ target_url }}"> + {{ self.title }} </a> </h1> <p class="card-body-text"></p> diff --git a/region/templates/region/blocks/card_link_with_headline_block.html b/region/templates/region/blocks/card_link_with_headline_block.html new file mode 100644 index 00000000..7556319d --- /dev/null +++ b/region/templates/region/blocks/card_link_with_headline_block.html @@ -0,0 +1,14 @@ +{% load wagtailcore_tags %} + +<div class="mb-8"> + {% if self.headline %} + <h1 class="head-alt-md md:head-alt-lg max-w-5xl mb-8">{{ self.headline }}</h1> + {% endif %} + <main> + <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8"> + {% for card_block in self.card_items %} + {% include_block card_block %} + {% endfor %} + </div> + </main> +</div> diff --git a/region/templates/region/region_crossroad_page.html b/region/templates/region/region_crossroad_page.html index 23294fb8..04fb46e5 100644 --- a/region/templates/region/region_crossroad_page.html +++ b/region/templates/region/region_crossroad_page.html @@ -2,16 +2,14 @@ {% load wagtailcore_tags %} {% block content %} - <main> - <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8 pt-8 lg:py-24"> + <section class="pt-8 lg:py-24"> {% for card_block in page.cards_content %} {% include_block card_block %} {% endfor %} - </div> {% for block in page.content %} <div class="content-block mb-8"> {% include_block block %} </div> {% endfor %} - </main> + </section> {% endblock %} -- GitLab