diff --git a/district/blocks.py b/district/blocks.py index 6cba4aca96e9492d28279f8abcc89da1e7d7033c..b3a58725d95b907bb782786cd30c86abd73f0764 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 0000000000000000000000000000000000000000..46f267bae8cf4a463867b80efaedced0f04dd62a --- /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 c3608b79947e3a3f85b73758f2ccf8737cf947e8..ae98eafd04f7aa84193ad1d8d67b3851e7c0aa9e 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 0ae2036a29040263757fa52b39c7db3be73c6d98..1694cd92e1a19dcedbefea002679da5e8615ee31 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 0000000000000000000000000000000000000000..7556319d0194807bb37b87fb4ee29cb05247bd9c --- /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 124854669e0de97076f48c73ee06f9740486ef64..8297c165f16e6eeac383ee4e86cd7b5b7930994f 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 a1320b62e58d679686009915349bba9d906bfd5c..2aa7248289b893ea19857bf35b3fed448469f5e2 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 0000000000000000000000000000000000000000..2b170f734c9622265a0c5a8e002a49bbd3685623 --- /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 f34467c0360667d4f8621703fcf0c4acde7d4e38..b23ccd0ada5604f5bda07de84874c74900fb2bf8 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 0ae2036a29040263757fa52b39c7db3be73c6d98..1694cd92e1a19dcedbefea002679da5e8615ee31 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 0000000000000000000000000000000000000000..7556319d0194807bb37b87fb4ee29cb05247bd9c --- /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 23294fb89d428a1f8585c5cbb3d9c3087876690a..04fb46e5a2e63a8e05a5bbd3b56aa5049b5f8cf2 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 %}