From bc7651ef4d29fc2dbe62e7841fecf123eeb315ab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Valenta?= <tomas@imaniti.org>
Date: Thu, 30 May 2024 17:35:24 +0200
Subject: [PATCH] update program page

---
 ...14_alter_districtnewprogrampage_program.py | 505 +++++++++++++-
 ...lectioncampaignpage_candidates_and_more.py | 632 +++++++++++++++++-
 ...16_alter_districtnewprogrampage_program.py |  21 +
 district/models.py                            | 494 +++++++-------
 .../district/district_article_page.html       |   2 +-
 ..._alter_electionsfullprogrampage_content.py | 100 ++-
 .../0091_alter_mainprogrampage_program.py     | 259 ++++++-
 .../0092_alter_mainprogrampage_program.py     |  21 +
 main/models.py                                |   2 +-
 shared/models/main.py                         |   2 +-
 .../molecules/program/program_block.html      |   8 +-
 11 files changed, 1776 insertions(+), 270 deletions(-)
 create mode 100644 district/migrations/0216_alter_districtnewprogrampage_program.py
 create mode 100644 main/migrations/0092_alter_mainprogrampage_program.py

diff --git a/district/migrations/0214_alter_districtnewprogrampage_program.py b/district/migrations/0214_alter_districtnewprogrampage_program.py
index 9999d91c..4e4478d1 100644
--- a/district/migrations/0214_alter_districtnewprogrampage_program.py
+++ b/district/migrations/0214_alter_districtnewprogrampage_program.py
@@ -7,15 +7,510 @@ from django.db import migrations
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
-        ('district', '0213_alter_districtnewprogrampage_program'),
+        ("district", "0213_alter_districtnewprogrampage_program"),
     ]
 
     operations = [
         migrations.AlterField(
-            model_name='districtnewprogrampage',
-            name='program',
-            field=wagtail.fields.StreamField([('program_group', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('url', wagtail.blocks.URLBlock(label='Odkaz pokrývající celou tuto část', required=False)), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('title', wagtail.blocks.CharBlock(label='Titulek článku programu')), ('text', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah'))]), label='Jednotlivé články programu'))])), ('program_group_crossroad', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek')), ('title', wagtail.blocks.CharBlock(label='Titulek', required=True)), ('text', wagtail.blocks.RichTextBlock(label='Krátký text pod nadpisem', required=False)), ('page', wagtail.blocks.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)), ('link', wagtail.blocks.URLBlock(label='Odkaz', required=False))]), label='Karty programu'))])), ('program_group_popout', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('categories', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('name', wagtail.blocks.CharBlock(label='Název')), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('description', wagtail.blocks.RichTextBlock(label='Popis', required=False)), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek vyskakovacího bloku')), ('content', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah')), ('guarantor', wagtail.blocks.PageChooserBlock(label='Garant', page_type=['district.DistrictPersonPage'], required=False))]), label='Jednotlivé bloky programu'))]), label='Kategorie programu'))])), ('program_group_with_candidates', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('candidates', wagtail.blocks.ListBlock(wagtail.blocks.PageChooserBlock('district.DistrictPersonPage', label='Osoba', required=True), label='Kandidáti', required=True)), ('program', wagtail.blocks.StreamBlock([('program_group', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('url', wagtail.blocks.URLBlock(label='Odkaz pokrývající celou tuto část', required=False)), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('title', wagtail.blocks.CharBlock(label='Titulek článku programu')), ('text', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah'))]), label='Jednotlivé články programu'))])), ('program_group_crossroad', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek')), ('title', wagtail.blocks.CharBlock(label='Titulek', required=True)), ('text', wagtail.blocks.RichTextBlock(label='Krátký text pod nadpisem', required=False)), ('page', wagtail.blocks.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)), ('link', wagtail.blocks.URLBlock(label='Odkaz', required=False))]), label='Karty programu'))])), ('program_group_popout', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('categories', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('name', wagtail.blocks.CharBlock(label='Název')), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('description', wagtail.blocks.RichTextBlock(label='Popis', required=False)), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek vyskakovacího bloku')), ('content', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah')), ('guarantor', wagtail.blocks.PageChooserBlock(label='Garant', page_type=['district.DistrictPersonPage'], required=False))]), label='Jednotlivé bloky programu'))]), label='Kategorie programu'))]))]))]))], blank=True, verbose_name='Program'),
+            model_name="districtnewprogrampage",
+            name="program",
+            field=wagtail.fields.StreamField(
+                [
+                    (
+                        "program_group",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "point_list",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "url",
+                                                    wagtail.blocks.URLBlock(
+                                                        label="Odkaz pokrývající celou tuto část",
+                                                        required=False,
+                                                    ),
+                                                ),
+                                                (
+                                                    "icon",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        label="Ikona", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "title",
+                                                    wagtail.blocks.CharBlock(
+                                                        label="Titulek článku programu"
+                                                    ),
+                                                ),
+                                                (
+                                                    "text",
+                                                    wagtail.blocks.RichTextBlock(
+                                                        features=[
+                                                            "h3",
+                                                            "h4",
+                                                            "h5",
+                                                            "bold",
+                                                            "italic",
+                                                            "ol",
+                                                            "ul",
+                                                            "hr",
+                                                            "link",
+                                                            "document-link",
+                                                            "image",
+                                                            "superscript",
+                                                            "subscript",
+                                                            "strikethrough",
+                                                            "blockquote",
+                                                            "embed",
+                                                        ],
+                                                        label="Obsah",
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Jednotlivé články programu",
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                    (
+                        "program_group_crossroad",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "point_list",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "image",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        label="Obrázek"
+                                                    ),
+                                                ),
+                                                (
+                                                    "title",
+                                                    wagtail.blocks.CharBlock(
+                                                        label="Titulek", required=True
+                                                    ),
+                                                ),
+                                                (
+                                                    "text",
+                                                    wagtail.blocks.RichTextBlock(
+                                                        label="Krátký text pod nadpisem",
+                                                        required=False,
+                                                    ),
+                                                ),
+                                                (
+                                                    "page",
+                                                    wagtail.blocks.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,
+                                                    ),
+                                                ),
+                                                (
+                                                    "link",
+                                                    wagtail.blocks.URLBlock(
+                                                        label="Odkaz", required=False
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Karty programu",
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                    (
+                        "program_group_popout",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "categories",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "name",
+                                                    wagtail.blocks.CharBlock(
+                                                        label="Název"
+                                                    ),
+                                                ),
+                                                (
+                                                    "icon",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        label="Ikona", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "description",
+                                                    wagtail.blocks.RichTextBlock(
+                                                        label="Popis", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "point_list",
+                                                    wagtail.blocks.ListBlock(
+                                                        wagtail.blocks.StructBlock(
+                                                            [
+                                                                (
+                                                                    "title",
+                                                                    wagtail.blocks.CharBlock(
+                                                                        label="Titulek vyskakovacího bloku"
+                                                                    ),
+                                                                ),
+                                                                (
+                                                                    "content",
+                                                                    wagtail.blocks.RichTextBlock(
+                                                                        features=[
+                                                                            "h3",
+                                                                            "h4",
+                                                                            "h5",
+                                                                            "bold",
+                                                                            "italic",
+                                                                            "ol",
+                                                                            "ul",
+                                                                            "hr",
+                                                                            "link",
+                                                                            "document-link",
+                                                                            "image",
+                                                                            "superscript",
+                                                                            "subscript",
+                                                                            "strikethrough",
+                                                                            "blockquote",
+                                                                            "embed",
+                                                                        ],
+                                                                        label="Obsah",
+                                                                    ),
+                                                                ),
+                                                                (
+                                                                    "guarantor",
+                                                                    wagtail.blocks.PageChooserBlock(
+                                                                        label="Garant",
+                                                                        page_type=[
+                                                                            "district.DistrictPersonPage"
+                                                                        ],
+                                                                        required=False,
+                                                                    ),
+                                                                ),
+                                                            ]
+                                                        ),
+                                                        label="Jednotlivé bloky programu",
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Kategorie programu",
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                    (
+                        "program_group_with_candidates",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "candidates",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.PageChooserBlock(
+                                            "district.DistrictPersonPage",
+                                            label="Osoba",
+                                            required=True,
+                                        ),
+                                        label="Kandidáti",
+                                        required=True,
+                                    ),
+                                ),
+                                (
+                                    "program",
+                                    wagtail.blocks.StreamBlock(
+                                        [
+                                            (
+                                                "program_group",
+                                                wagtail.blocks.StructBlock(
+                                                    [
+                                                        (
+                                                            "title",
+                                                            wagtail.blocks.CharBlock(
+                                                                label="Titulek části programu"
+                                                            ),
+                                                        ),
+                                                        (
+                                                            "point_list",
+                                                            wagtail.blocks.ListBlock(
+                                                                wagtail.blocks.StructBlock(
+                                                                    [
+                                                                        (
+                                                                            "url",
+                                                                            wagtail.blocks.URLBlock(
+                                                                                label="Odkaz pokrývající celou tuto část",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "icon",
+                                                                            wagtail.images.blocks.ImageChooserBlock(
+                                                                                label="Ikona",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "title",
+                                                                            wagtail.blocks.CharBlock(
+                                                                                label="Titulek článku programu"
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "text",
+                                                                            wagtail.blocks.RichTextBlock(
+                                                                                features=[
+                                                                                    "h3",
+                                                                                    "h4",
+                                                                                    "h5",
+                                                                                    "bold",
+                                                                                    "italic",
+                                                                                    "ol",
+                                                                                    "ul",
+                                                                                    "hr",
+                                                                                    "link",
+                                                                                    "document-link",
+                                                                                    "image",
+                                                                                    "superscript",
+                                                                                    "subscript",
+                                                                                    "strikethrough",
+                                                                                    "blockquote",
+                                                                                    "embed",
+                                                                                ],
+                                                                                label="Obsah",
+                                                                            ),
+                                                                        ),
+                                                                    ]
+                                                                ),
+                                                                label="Jednotlivé články programu",
+                                                            ),
+                                                        ),
+                                                    ]
+                                                ),
+                                            ),
+                                            (
+                                                "program_group_crossroad",
+                                                wagtail.blocks.StructBlock(
+                                                    [
+                                                        (
+                                                            "title",
+                                                            wagtail.blocks.CharBlock(
+                                                                label="Titulek části programu"
+                                                            ),
+                                                        ),
+                                                        (
+                                                            "point_list",
+                                                            wagtail.blocks.ListBlock(
+                                                                wagtail.blocks.StructBlock(
+                                                                    [
+                                                                        (
+                                                                            "image",
+                                                                            wagtail.images.blocks.ImageChooserBlock(
+                                                                                label="Obrázek"
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "title",
+                                                                            wagtail.blocks.CharBlock(
+                                                                                label="Titulek",
+                                                                                required=True,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "text",
+                                                                            wagtail.blocks.RichTextBlock(
+                                                                                label="Krátký text pod nadpisem",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "page",
+                                                                            wagtail.blocks.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,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "link",
+                                                                            wagtail.blocks.URLBlock(
+                                                                                label="Odkaz",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                    ]
+                                                                ),
+                                                                label="Karty programu",
+                                                            ),
+                                                        ),
+                                                    ]
+                                                ),
+                                            ),
+                                            (
+                                                "program_group_popout",
+                                                wagtail.blocks.StructBlock(
+                                                    [
+                                                        (
+                                                            "title",
+                                                            wagtail.blocks.CharBlock(
+                                                                label="Titulek části programu"
+                                                            ),
+                                                        ),
+                                                        (
+                                                            "categories",
+                                                            wagtail.blocks.ListBlock(
+                                                                wagtail.blocks.StructBlock(
+                                                                    [
+                                                                        (
+                                                                            "name",
+                                                                            wagtail.blocks.CharBlock(
+                                                                                label="Název"
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "icon",
+                                                                            wagtail.images.blocks.ImageChooserBlock(
+                                                                                label="Ikona",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "description",
+                                                                            wagtail.blocks.RichTextBlock(
+                                                                                label="Popis",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "point_list",
+                                                                            wagtail.blocks.ListBlock(
+                                                                                wagtail.blocks.StructBlock(
+                                                                                    [
+                                                                                        (
+                                                                                            "title",
+                                                                                            wagtail.blocks.CharBlock(
+                                                                                                label="Titulek vyskakovacího bloku"
+                                                                                            ),
+                                                                                        ),
+                                                                                        (
+                                                                                            "content",
+                                                                                            wagtail.blocks.RichTextBlock(
+                                                                                                features=[
+                                                                                                    "h3",
+                                                                                                    "h4",
+                                                                                                    "h5",
+                                                                                                    "bold",
+                                                                                                    "italic",
+                                                                                                    "ol",
+                                                                                                    "ul",
+                                                                                                    "hr",
+                                                                                                    "link",
+                                                                                                    "document-link",
+                                                                                                    "image",
+                                                                                                    "superscript",
+                                                                                                    "subscript",
+                                                                                                    "strikethrough",
+                                                                                                    "blockquote",
+                                                                                                    "embed",
+                                                                                                ],
+                                                                                                label="Obsah",
+                                                                                            ),
+                                                                                        ),
+                                                                                        (
+                                                                                            "guarantor",
+                                                                                            wagtail.blocks.PageChooserBlock(
+                                                                                                label="Garant",
+                                                                                                page_type=[
+                                                                                                    "district.DistrictPersonPage"
+                                                                                                ],
+                                                                                                required=False,
+                                                                                            ),
+                                                                                        ),
+                                                                                    ]
+                                                                                ),
+                                                                                label="Jednotlivé bloky programu",
+                                                                            ),
+                                                                        ),
+                                                                    ]
+                                                                ),
+                                                                label="Kategorie programu",
+                                                            ),
+                                                        ),
+                                                    ]
+                                                ),
+                                            ),
+                                        ]
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                ],
+                blank=True,
+                verbose_name="Program",
+            ),
         ),
     ]
diff --git a/district/migrations/0215_alter_districtelectioncampaignpage_candidates_and_more.py b/district/migrations/0215_alter_districtelectioncampaignpage_candidates_and_more.py
index 716b6686..02469f7d 100644
--- a/district/migrations/0215_alter_districtelectioncampaignpage_candidates_and_more.py
+++ b/district/migrations/0215_alter_districtelectioncampaignpage_candidates_and_more.py
@@ -7,20 +7,636 @@ from django.db import migrations
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
-        ('district', '0214_alter_districtnewprogrampage_program'),
+        ("district", "0214_alter_districtnewprogrampage_program"),
     ]
 
     operations = [
         migrations.AlterField(
-            model_name='districtelectioncampaignpage',
-            name='candidates',
-            field=wagtail.fields.StreamField([('candidates', wagtail.blocks.StructBlock([('candidates', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['district.DistrictPersonPage'])), ('image', wagtail.images.blocks.ImageChooserBlock(help_text='Pokud není vybrán, použije se obrázek ze stránky kandidáta', label='Obrázek', required=False)), ('description', wagtail.blocks.TextBlock(label='Popis'))]), label='Kandidáti'))]))], blank=True, verbose_name='Kandidátní listina'),
+            model_name="districtelectioncampaignpage",
+            name="candidates",
+            field=wagtail.fields.StreamField(
+                [
+                    (
+                        "candidates",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "candidates",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "page",
+                                                    wagtail.blocks.PageChooserBlock(
+                                                        label="Stránka",
+                                                        page_type=[
+                                                            "district.DistrictPersonPage"
+                                                        ],
+                                                    ),
+                                                ),
+                                                (
+                                                    "image",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        help_text="Pokud není vybrán, použije se obrázek ze stránky kandidáta",
+                                                        label="Obrázek",
+                                                        required=False,
+                                                    ),
+                                                ),
+                                                (
+                                                    "description",
+                                                    wagtail.blocks.TextBlock(
+                                                        label="Popis"
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Kandidáti",
+                                    ),
+                                )
+                            ]
+                        ),
+                    )
+                ],
+                blank=True,
+                verbose_name="Kandidátní listina",
+            ),
         ),
         migrations.AlterField(
-            model_name='districtnewprogrampage',
-            name='program',
-            field=wagtail.fields.StreamField([('program_group', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('url', wagtail.blocks.URLBlock(label='Odkaz pokrývající celou tuto část', required=False)), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('title', wagtail.blocks.CharBlock(label='Titulek článku programu')), ('text', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah'))]), label='Jednotlivé články programu'))])), ('program_group_crossroad', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek')), ('title', wagtail.blocks.CharBlock(label='Titulek', required=True)), ('text', wagtail.blocks.RichTextBlock(label='Krátký text pod nadpisem', required=False)), ('page', wagtail.blocks.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)), ('link', wagtail.blocks.URLBlock(label='Odkaz', required=False))]), label='Karty programu'))])), ('program_group_popout', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('categories', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('name', wagtail.blocks.CharBlock(label='Název')), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('description', wagtail.blocks.RichTextBlock(label='Popis', required=False)), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek vyskakovacího bloku')), ('content', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah')), ('guarantor', wagtail.blocks.PageChooserBlock(label='Garant', page_type=['district.DistrictPersonPage'], required=False))]), label='Jednotlivé bloky programu'))]), label='Kategorie programu'))])), ('program_group_with_candidates', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('primary_candidates', wagtail.blocks.StructBlock([('candidates', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['district.DistrictPersonPage'])), ('image', wagtail.images.blocks.ImageChooserBlock(help_text='Pokud není vybrán, použije se obrázek ze stránky kandidáta', label='Obrázek', required=False)), ('description', wagtail.blocks.TextBlock(label='Popis'))]), label='Kandidáti'))], label='Čelo kandidátky')), ('secondary_candidates', wagtail.blocks.StructBlock([('heading', wagtail.blocks.CharBlock(label='Nadpis')), ('candidates', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('number', wagtail.blocks.CharBlock(label='Číslo')), ('page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['district.DistrictPersonPage'])), ('image', wagtail.images.blocks.ImageChooserBlock(help_text='Pokud není vybrán, použije se obrázek ze stránky kandidáta', label='Obrázek', required=False))]), label='Kandidáti'))], label='Ostatní kandidáti')), ('program', wagtail.blocks.StreamBlock([('program_group', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('url', wagtail.blocks.URLBlock(label='Odkaz pokrývající celou tuto část', required=False)), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('title', wagtail.blocks.CharBlock(label='Titulek článku programu')), ('text', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah'))]), label='Jednotlivé články programu'))])), ('program_group_crossroad', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek')), ('title', wagtail.blocks.CharBlock(label='Titulek', required=True)), ('text', wagtail.blocks.RichTextBlock(label='Krátký text pod nadpisem', required=False)), ('page', wagtail.blocks.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)), ('link', wagtail.blocks.URLBlock(label='Odkaz', required=False))]), label='Karty programu'))])), ('program_group_popout', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('categories', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('name', wagtail.blocks.CharBlock(label='Název')), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('description', wagtail.blocks.RichTextBlock(label='Popis', required=False)), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek vyskakovacího bloku')), ('content', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah')), ('guarantor', wagtail.blocks.PageChooserBlock(label='Garant', page_type=['district.DistrictPersonPage'], required=False))]), label='Jednotlivé bloky programu'))]), label='Kategorie programu'))]))]))]))], blank=True, verbose_name='Program'),
+            model_name="districtnewprogrampage",
+            name="program",
+            field=wagtail.fields.StreamField(
+                [
+                    (
+                        "program_group",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "point_list",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "url",
+                                                    wagtail.blocks.URLBlock(
+                                                        label="Odkaz pokrývající celou tuto část",
+                                                        required=False,
+                                                    ),
+                                                ),
+                                                (
+                                                    "icon",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        label="Ikona", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "title",
+                                                    wagtail.blocks.CharBlock(
+                                                        label="Titulek článku programu"
+                                                    ),
+                                                ),
+                                                (
+                                                    "text",
+                                                    wagtail.blocks.RichTextBlock(
+                                                        features=[
+                                                            "h3",
+                                                            "h4",
+                                                            "h5",
+                                                            "bold",
+                                                            "italic",
+                                                            "ol",
+                                                            "ul",
+                                                            "hr",
+                                                            "link",
+                                                            "document-link",
+                                                            "image",
+                                                            "superscript",
+                                                            "subscript",
+                                                            "strikethrough",
+                                                            "blockquote",
+                                                            "embed",
+                                                        ],
+                                                        label="Obsah",
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Jednotlivé články programu",
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                    (
+                        "program_group_crossroad",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "point_list",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "image",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        label="Obrázek"
+                                                    ),
+                                                ),
+                                                (
+                                                    "title",
+                                                    wagtail.blocks.CharBlock(
+                                                        label="Titulek", required=True
+                                                    ),
+                                                ),
+                                                (
+                                                    "text",
+                                                    wagtail.blocks.RichTextBlock(
+                                                        label="Krátký text pod nadpisem",
+                                                        required=False,
+                                                    ),
+                                                ),
+                                                (
+                                                    "page",
+                                                    wagtail.blocks.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,
+                                                    ),
+                                                ),
+                                                (
+                                                    "link",
+                                                    wagtail.blocks.URLBlock(
+                                                        label="Odkaz", required=False
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Karty programu",
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                    (
+                        "program_group_popout",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "categories",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "name",
+                                                    wagtail.blocks.CharBlock(
+                                                        label="Název"
+                                                    ),
+                                                ),
+                                                (
+                                                    "icon",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        label="Ikona", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "description",
+                                                    wagtail.blocks.RichTextBlock(
+                                                        label="Popis", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "point_list",
+                                                    wagtail.blocks.ListBlock(
+                                                        wagtail.blocks.StructBlock(
+                                                            [
+                                                                (
+                                                                    "title",
+                                                                    wagtail.blocks.CharBlock(
+                                                                        label="Titulek vyskakovacího bloku"
+                                                                    ),
+                                                                ),
+                                                                (
+                                                                    "content",
+                                                                    wagtail.blocks.RichTextBlock(
+                                                                        features=[
+                                                                            "h3",
+                                                                            "h4",
+                                                                            "h5",
+                                                                            "bold",
+                                                                            "italic",
+                                                                            "ol",
+                                                                            "ul",
+                                                                            "hr",
+                                                                            "link",
+                                                                            "document-link",
+                                                                            "image",
+                                                                            "superscript",
+                                                                            "subscript",
+                                                                            "strikethrough",
+                                                                            "blockquote",
+                                                                            "embed",
+                                                                        ],
+                                                                        label="Obsah",
+                                                                    ),
+                                                                ),
+                                                                (
+                                                                    "guarantor",
+                                                                    wagtail.blocks.PageChooserBlock(
+                                                                        label="Garant",
+                                                                        page_type=[
+                                                                            "district.DistrictPersonPage"
+                                                                        ],
+                                                                        required=False,
+                                                                    ),
+                                                                ),
+                                                            ]
+                                                        ),
+                                                        label="Jednotlivé bloky programu",
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Kategorie programu",
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                    (
+                        "program_group_with_candidates",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "primary_candidates",
+                                    wagtail.blocks.StructBlock(
+                                        [
+                                            (
+                                                "candidates",
+                                                wagtail.blocks.ListBlock(
+                                                    wagtail.blocks.StructBlock(
+                                                        [
+                                                            (
+                                                                "page",
+                                                                wagtail.blocks.PageChooserBlock(
+                                                                    label="Stránka",
+                                                                    page_type=[
+                                                                        "district.DistrictPersonPage"
+                                                                    ],
+                                                                ),
+                                                            ),
+                                                            (
+                                                                "image",
+                                                                wagtail.images.blocks.ImageChooserBlock(
+                                                                    help_text="Pokud není vybrán, použije se obrázek ze stránky kandidáta",
+                                                                    label="Obrázek",
+                                                                    required=False,
+                                                                ),
+                                                            ),
+                                                            (
+                                                                "description",
+                                                                wagtail.blocks.TextBlock(
+                                                                    label="Popis"
+                                                                ),
+                                                            ),
+                                                        ]
+                                                    ),
+                                                    label="Kandidáti",
+                                                ),
+                                            )
+                                        ],
+                                        label="Čelo kandidátky",
+                                    ),
+                                ),
+                                (
+                                    "secondary_candidates",
+                                    wagtail.blocks.StructBlock(
+                                        [
+                                            (
+                                                "heading",
+                                                wagtail.blocks.CharBlock(
+                                                    label="Nadpis"
+                                                ),
+                                            ),
+                                            (
+                                                "candidates",
+                                                wagtail.blocks.ListBlock(
+                                                    wagtail.blocks.StructBlock(
+                                                        [
+                                                            (
+                                                                "number",
+                                                                wagtail.blocks.CharBlock(
+                                                                    label="Číslo"
+                                                                ),
+                                                            ),
+                                                            (
+                                                                "page",
+                                                                wagtail.blocks.PageChooserBlock(
+                                                                    label="Stránka",
+                                                                    page_type=[
+                                                                        "district.DistrictPersonPage"
+                                                                    ],
+                                                                ),
+                                                            ),
+                                                            (
+                                                                "image",
+                                                                wagtail.images.blocks.ImageChooserBlock(
+                                                                    help_text="Pokud není vybrán, použije se obrázek ze stránky kandidáta",
+                                                                    label="Obrázek",
+                                                                    required=False,
+                                                                ),
+                                                            ),
+                                                        ]
+                                                    ),
+                                                    label="Kandidáti",
+                                                ),
+                                            ),
+                                        ],
+                                        label="Ostatní kandidáti",
+                                    ),
+                                ),
+                                (
+                                    "program",
+                                    wagtail.blocks.StreamBlock(
+                                        [
+                                            (
+                                                "program_group",
+                                                wagtail.blocks.StructBlock(
+                                                    [
+                                                        (
+                                                            "title",
+                                                            wagtail.blocks.CharBlock(
+                                                                label="Titulek části programu"
+                                                            ),
+                                                        ),
+                                                        (
+                                                            "point_list",
+                                                            wagtail.blocks.ListBlock(
+                                                                wagtail.blocks.StructBlock(
+                                                                    [
+                                                                        (
+                                                                            "url",
+                                                                            wagtail.blocks.URLBlock(
+                                                                                label="Odkaz pokrývající celou tuto část",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "icon",
+                                                                            wagtail.images.blocks.ImageChooserBlock(
+                                                                                label="Ikona",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "title",
+                                                                            wagtail.blocks.CharBlock(
+                                                                                label="Titulek článku programu"
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "text",
+                                                                            wagtail.blocks.RichTextBlock(
+                                                                                features=[
+                                                                                    "h3",
+                                                                                    "h4",
+                                                                                    "h5",
+                                                                                    "bold",
+                                                                                    "italic",
+                                                                                    "ol",
+                                                                                    "ul",
+                                                                                    "hr",
+                                                                                    "link",
+                                                                                    "document-link",
+                                                                                    "image",
+                                                                                    "superscript",
+                                                                                    "subscript",
+                                                                                    "strikethrough",
+                                                                                    "blockquote",
+                                                                                    "embed",
+                                                                                ],
+                                                                                label="Obsah",
+                                                                            ),
+                                                                        ),
+                                                                    ]
+                                                                ),
+                                                                label="Jednotlivé články programu",
+                                                            ),
+                                                        ),
+                                                    ]
+                                                ),
+                                            ),
+                                            (
+                                                "program_group_crossroad",
+                                                wagtail.blocks.StructBlock(
+                                                    [
+                                                        (
+                                                            "title",
+                                                            wagtail.blocks.CharBlock(
+                                                                label="Titulek části programu"
+                                                            ),
+                                                        ),
+                                                        (
+                                                            "point_list",
+                                                            wagtail.blocks.ListBlock(
+                                                                wagtail.blocks.StructBlock(
+                                                                    [
+                                                                        (
+                                                                            "image",
+                                                                            wagtail.images.blocks.ImageChooserBlock(
+                                                                                label="Obrázek"
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "title",
+                                                                            wagtail.blocks.CharBlock(
+                                                                                label="Titulek",
+                                                                                required=True,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "text",
+                                                                            wagtail.blocks.RichTextBlock(
+                                                                                label="Krátký text pod nadpisem",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "page",
+                                                                            wagtail.blocks.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,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "link",
+                                                                            wagtail.blocks.URLBlock(
+                                                                                label="Odkaz",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                    ]
+                                                                ),
+                                                                label="Karty programu",
+                                                            ),
+                                                        ),
+                                                    ]
+                                                ),
+                                            ),
+                                            (
+                                                "program_group_popout",
+                                                wagtail.blocks.StructBlock(
+                                                    [
+                                                        (
+                                                            "title",
+                                                            wagtail.blocks.CharBlock(
+                                                                label="Titulek části programu"
+                                                            ),
+                                                        ),
+                                                        (
+                                                            "categories",
+                                                            wagtail.blocks.ListBlock(
+                                                                wagtail.blocks.StructBlock(
+                                                                    [
+                                                                        (
+                                                                            "name",
+                                                                            wagtail.blocks.CharBlock(
+                                                                                label="Název"
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "icon",
+                                                                            wagtail.images.blocks.ImageChooserBlock(
+                                                                                label="Ikona",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "description",
+                                                                            wagtail.blocks.RichTextBlock(
+                                                                                label="Popis",
+                                                                                required=False,
+                                                                            ),
+                                                                        ),
+                                                                        (
+                                                                            "point_list",
+                                                                            wagtail.blocks.ListBlock(
+                                                                                wagtail.blocks.StructBlock(
+                                                                                    [
+                                                                                        (
+                                                                                            "title",
+                                                                                            wagtail.blocks.CharBlock(
+                                                                                                label="Titulek vyskakovacího bloku"
+                                                                                            ),
+                                                                                        ),
+                                                                                        (
+                                                                                            "content",
+                                                                                            wagtail.blocks.RichTextBlock(
+                                                                                                features=[
+                                                                                                    "h3",
+                                                                                                    "h4",
+                                                                                                    "h5",
+                                                                                                    "bold",
+                                                                                                    "italic",
+                                                                                                    "ol",
+                                                                                                    "ul",
+                                                                                                    "hr",
+                                                                                                    "link",
+                                                                                                    "document-link",
+                                                                                                    "image",
+                                                                                                    "superscript",
+                                                                                                    "subscript",
+                                                                                                    "strikethrough",
+                                                                                                    "blockquote",
+                                                                                                    "embed",
+                                                                                                ],
+                                                                                                label="Obsah",
+                                                                                            ),
+                                                                                        ),
+                                                                                        (
+                                                                                            "guarantor",
+                                                                                            wagtail.blocks.PageChooserBlock(
+                                                                                                label="Garant",
+                                                                                                page_type=[
+                                                                                                    "district.DistrictPersonPage"
+                                                                                                ],
+                                                                                                required=False,
+                                                                                            ),
+                                                                                        ),
+                                                                                    ]
+                                                                                ),
+                                                                                label="Jednotlivé bloky programu",
+                                                                            ),
+                                                                        ),
+                                                                    ]
+                                                                ),
+                                                                label="Kategorie programu",
+                                                            ),
+                                                        ),
+                                                    ]
+                                                ),
+                                            ),
+                                        ]
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                ],
+                blank=True,
+                verbose_name="Program",
+            ),
         ),
     ]
diff --git a/district/migrations/0216_alter_districtnewprogrampage_program.py b/district/migrations/0216_alter_districtnewprogrampage_program.py
new file mode 100644
index 00000000..f56c9e7d
--- /dev/null
+++ b/district/migrations/0216_alter_districtnewprogrampage_program.py
@@ -0,0 +1,21 @@
+# Generated by Django 5.0.4 on 2024-05-29 12:28
+
+import wagtail.blocks
+import wagtail.fields
+import wagtail.images.blocks
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('district', '0215_alter_districtelectioncampaignpage_candidates_and_more'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='districtnewprogrampage',
+            name='program',
+            field=wagtail.fields.StreamField([('program_group', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('url', wagtail.blocks.URLBlock(label='Odkaz pokrývající celou tuto část', required=False)), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('title', wagtail.blocks.CharBlock(label='Titulek článku programu')), ('text', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah'))]), label='Jednotlivé články programu'))])), ('program_group_crossroad', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek')), ('title', wagtail.blocks.CharBlock(label='Titulek', required=True)), ('text', wagtail.blocks.RichTextBlock(label='Krátký text pod nadpisem', required=False)), ('page', wagtail.blocks.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)), ('link', wagtail.blocks.URLBlock(label='Odkaz', required=False))]), label='Karty programu'))])), ('program_group_popout', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('categories', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('name', wagtail.blocks.CharBlock(label='Název')), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('description', wagtail.blocks.RichTextBlock(label='Popis', required=False)), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek vyskakovacího bloku')), ('content', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah')), ('guarantor', wagtail.blocks.PageChooserBlock(label='Garant', page_type=['district.DistrictPersonPage'], required=False))]), label='Jednotlivé bloky programu'))]), label='Kategorie programu'))])), ('program_group_with_candidates', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('primary_candidates', wagtail.blocks.StructBlock([('candidates', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['district.DistrictPersonPage'])), ('image', wagtail.images.blocks.ImageChooserBlock(help_text='Pokud není vybrán, použije se obrázek ze stránky kandidáta', label='Obrázek', required=False)), ('description', wagtail.blocks.TextBlock(label='Popis'))]), label='Kandidáti'))], label='Čelo kandidátky')), ('secondary_candidates', wagtail.blocks.StructBlock([('heading', wagtail.blocks.CharBlock(label='Nadpis')), ('candidates', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('number', wagtail.blocks.CharBlock(label='Číslo')), ('page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['district.DistrictPersonPage'])), ('image', wagtail.images.blocks.ImageChooserBlock(help_text='Pokud není vybrán, použije se obrázek ze stránky kandidáta', label='Obrázek', required=False))]), label='Kandidáti'))], label='Ostatní kandidáti')), ('program', wagtail.blocks.StreamBlock([('program_group', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('url', wagtail.blocks.URLBlock(label='Odkaz pokrývající celou tuto část', required=False)), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('title', wagtail.blocks.CharBlock(label='Titulek článku programu')), ('text', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah'))]), label='Jednotlivé články programu'))])), ('program_group_crossroad', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek')), ('title', wagtail.blocks.CharBlock(label='Titulek', required=True)), ('text', wagtail.blocks.RichTextBlock(label='Krátký text pod nadpisem', required=False)), ('page', wagtail.blocks.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)), ('link', wagtail.blocks.URLBlock(label='Odkaz', required=False))]), label='Karty programu'))])), ('program_group_popout', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('categories', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('name', wagtail.blocks.CharBlock(label='Název')), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('description', wagtail.blocks.RichTextBlock(label='Popis', required=False)), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek vyskakovacího bloku')), ('content', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah')), ('guarantor', wagtail.blocks.PageChooserBlock(label='Garant', page_type=['district.DistrictPersonPage'], required=False))]), label='Jednotlivé bloky programu'))]), label='Kategorie programu'))]))]))]))], blank=True, verbose_name='Programy'),
+        ),
+    ]
diff --git a/district/models.py b/district/models.py
index c1b90853..0a008f01 100644
--- a/district/models.py
+++ b/district/models.py
@@ -52,6 +52,7 @@ from shared.models import (
     MainProgramPageMixin,
     MainSimplePageMixin,
     PdfPageMixin,
+    PageInMenuMixin,
     SharedTaggedDistrictArticle,
     SubpageMixin,
 )
@@ -425,9 +426,260 @@ class DistrictPdfPage(PdfPageMixin, MetadataPageMixin, SubpageMixin, Page):
         verbose_name = "PDF stránka"
 
 
+class DistrictCenterPage(
+    CalendarMixin,
+    ExtendedMetadataPageMixin,
+    SubpageMixin,
+    MetadataPageMixin,
+    PageInMenuMixin,
+    Page
+):
+    ### FIELDS
+
+    calendar_page = models.ForeignKey(
+        "DistrictCalendarPage",
+        verbose_name="Stránka s kalendářem",
+        on_delete=models.PROTECT,
+        null=True,
+        blank=True,
+    )
+
+    perex = models.TextField("Perex", blank=True, null=True)
+    background_photo = models.ForeignKey(
+        "wagtailimages.Image",
+        on_delete=models.PROTECT,
+        blank=True,
+        null=True,
+        related_name="+",
+    )
+    content = StreamField(
+        CONTENT_BLOCKS
+        + [
+            ("badge", blocks.PersonBadgeBlock()),
+            ("contact", blocks.CenterContactBlock()),
+            ("badge", blocks.PersonBadgeBlock()),
+        ],
+        verbose_name="Obsah",
+        blank=True,
+        use_json_field=True,
+    )
+
+    map_address_content = StreamField(
+        [
+            ("address", blocks.AddressBlock()),
+        ],
+        verbose_name="Adresa u mapy",
+        blank=True,
+        use_json_field=True,
+    )
+
+    map_area_content = StreamField(
+        [
+            ("map", MapPointBlock()),
+        ],
+        verbose_name="Mapa",
+        blank=True,
+        use_json_field=True,
+    )
+
+    ### PANELS
+
+    content_panels = Page.content_panels + [
+        MultiFieldPanel(
+            [
+                FieldPanel("perex"),
+                PageChooserPanel("background_photo"),
+            ],
+            "Hlavička",
+        ),
+        MultiFieldPanel(
+            [
+                FieldPanel("map_address_content"),
+                PageChooserPanel("map_area_content"),
+            ],
+            "Obsah vyskakovacího bloku s mapou",
+        ),
+        FieldPanel("content"),
+        MultiFieldPanel(
+            [
+                FieldPanel("calendar_url"),
+                PageChooserPanel("calendar_page"),
+            ],
+            "Kalendář",
+        ),
+    ]
+
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
+    ### RELATIONS
+
+    parent_page_types = ["district.DistrictHomePage"]
+    subpage_types = ["district.DistrictCalendarPage"]
+
+    ### OTHERS
+
+    class Meta:
+        verbose_name = "Stránka pirátského centra"
+
+    def get_background_photo(self):
+        """
+        Vrací background_photo pro pozadí na stránce, pokud není nastaveno,
+        vezme falbback z homepage
+        """
+        return (
+            self.background_photo
+            if self.background_photo
+            else self.root_page.fallback_image
+        )
+
+    @property
+    def has_calendar(self):
+        return self.calendar_id is not None
+
+    def get_meta_image(self):
+        return (
+            self.search_image
+            or self.background_photo
+            or self.root_page.get_meta_image()
+        )
+
+    def get_meta_description(self):
+        if self.search_description:
+            return self.search_description
+
+        desc = None
+
+        if self.perex:
+            desc = self.perex
+        elif self.text:
+            desc = trim_to_length(strip_all_html_tags(self.text))
+
+        return desc
+
+
+class DistrictNewProgramPage(MainProgramPageMixin):
+    ### FIELDS
+
+    program = StreamField(
+        [
+            ("program_group", ProgramGroupBlock()),
+            ("program_group_crossroad", blocks.ProgramGroupBlockCrossroad()),
+            ("program_group_popout", blocks.ProgramGroupBlockPopout()),
+            ("program_group_with_candidates", blocks.ProgramGroupWithCandidatesBlock()),
+        ],
+        verbose_name="Programy",
+        blank=True,
+        use_json_field=True,
+    )
+
+    ### RELATIONS
+
+    parent_page_types = ["district.DistrictHomePage"]
+    subpage_types = ["district.DistrictCustomPage"]
+
+
+class DistrictCrossroadPage(
+    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, PageInMenuMixin, Page
+):
+    ### FIELDS
+
+    cards_content = StreamField(
+        [("cards", blocks.CardLinkWithHeadlineBlock())],
+        verbose_name="Karty rozcestníku",
+        blank=True,
+        use_json_field=True,
+    )
+
+    content = StreamField(
+        CONTENT_BLOCKS
+        + [
+            ("badge", blocks.PersonBadgeBlock()),
+            ("people_group", blocks.PeopleGroupListBlock()),
+        ],
+        verbose_name="Obsah stránky",
+        blank=True,
+        use_json_field=True,
+    )
+
+    ### PANELS
+
+    content_panels = Page.content_panels + [
+        FieldPanel("cards_content"),
+        FieldPanel("content"),
+    ]
+
+    promote_panels = make_promote_panels()
+
+    settings_panels = []
+
+    ### RELATIONS
+
+    parent_page_types = ["district.DistrictHomePage"]
+    subpage_types = [
+        "district.DistrictArticlePage",
+        "district.DistrictArticlesPage",
+        "district.DistrictCenterPage",
+        "district.DistrictContactPage",
+        "district.DistrictCrossroadPage",
+        "district.DistrictCustomPage",
+        "district.DistrictElectionRootPage",
+        "district.DistrictGeoFeatureCollectionPage",
+        "district.DistrictPeoplePage",
+        "district.DistrictPersonPage",
+        "district.DistrictProgramPage",
+        "district.DistrictInteractiveProgramPage",
+    ]
+    ### OTHERS
+
+    class Meta:
+        verbose_name = "Rozcestník s kartami"
+
+
+class DistrictCustomPage(MainSimplePageMixin):
+    ### FIELDS
+
+    main_image = models.ForeignKey(
+        "wagtailimages.Image",
+        on_delete=models.PROTECT,
+        blank=True,
+        null=True,
+        verbose_name="Obrázek na pozadí hlavičky",
+        related_name="+",
+    )
+
+    content = StreamField(
+        CONTENT_BLOCKS
+        + [
+            ("badge", blocks.PersonBadgeBlock()),
+            ("people_group", blocks.PeopleGroupListBlock()),
+            ("newsletter", NewsletterSubscriptionBlock()),
+        ],
+        verbose_name="Obsah",
+        blank=True,
+        use_json_field=True,
+    )
+
+    ### PANELS
+
+    content_panels = Page.content_panels + [
+        FieldPanel("main_image"),
+        FieldPanel("content"),
+    ]
+
+    ### RELATIONS
+
+    parent_page_types = ["district.DistrictHomePage", "district.DistrictCrossroadPage"]
+    subpage_types = ["district.DistrictElectionRootPage"]
+
+
 # --- END Migrated models ---
 
 
+# --- BEGIN Old election models ---
+
+
 class DistrictElectionBasePage(
     ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
 ):
@@ -853,226 +1105,7 @@ class DistrictProgramPage(
         return self.perex
 
 
-class DistrictCenterPage(
-    CalendarMixin, ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
-):
-    ### FIELDS
-
-    calendar_page = models.ForeignKey(
-        "DistrictCalendarPage",
-        verbose_name="Stránka s kalendářem",
-        on_delete=models.PROTECT,
-        null=True,
-        blank=True,
-    )
-
-    perex = models.TextField("Perex", blank=True, null=True)
-    background_photo = models.ForeignKey(
-        "wagtailimages.Image",
-        on_delete=models.PROTECT,
-        blank=True,
-        null=True,
-        related_name="+",
-    )
-    content = StreamField(
-        CONTENT_BLOCKS
-        + [
-            ("badge", blocks.PersonBadgeBlock()),
-            ("contact", blocks.CenterContactBlock()),
-            ("badge", blocks.PersonBadgeBlock()),
-        ],
-        verbose_name="Obsah",
-        blank=True,
-        use_json_field=True,
-    )
-
-    map_address_content = StreamField(
-        [
-            ("address", blocks.AddressBlock()),
-        ],
-        verbose_name="Adresa u mapy",
-        blank=True,
-        use_json_field=True,
-    )
-
-    map_area_content = StreamField(
-        [
-            ("map", MapPointBlock()),
-        ],
-        verbose_name="Mapa",
-        blank=True,
-        use_json_field=True,
-    )
-
-    ### PANELS
-
-    content_panels = Page.content_panels + [
-        MultiFieldPanel(
-            [
-                FieldPanel("perex"),
-                PageChooserPanel("background_photo"),
-            ],
-            "Hlavička",
-        ),
-        MultiFieldPanel(
-            [
-                FieldPanel("map_address_content"),
-                PageChooserPanel("map_area_content"),
-            ],
-            "Obsah vyskakovacího bloku s mapou",
-        ),
-        FieldPanel("content"),
-        MultiFieldPanel(
-            [
-                FieldPanel("calendar_url"),
-                PageChooserPanel("calendar_page"),
-            ],
-            "Kalendář",
-        ),
-    ]
-
-    promote_panels = make_promote_panels()
-
-    settings_panels = []
-
-    ### RELATIONS
-
-    parent_page_types = ["district.DistrictHomePage"]
-    subpage_types = ["district.DistrictCalendarPage"]
-
-    ### OTHERS
-
-    class Meta:
-        verbose_name = "Stránka pirátského centra"
-
-    def get_background_photo(self):
-        """
-        Vrací background_photo pro pozadí na stránce, pokud není nastaveno,
-        vezme falbback z homepage
-        """
-        return (
-            self.background_photo
-            if self.background_photo
-            else self.root_page.fallback_image
-        )
-
-    @property
-    def has_calendar(self):
-        return self.calendar_id is not None
-
-    def get_meta_image(self):
-        return (
-            self.search_image
-            or self.background_photo
-            or self.root_page.get_meta_image()
-        )
-
-    def get_meta_description(self):
-        if self.search_description:
-            return self.search_description
-
-        desc = None
-
-        if self.perex:
-            desc = self.perex
-        elif self.text:
-            desc = trim_to_length(strip_all_html_tags(self.text))
-
-        return desc
-
-
-class DistrictCrossroadPage(
-    ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, Page
-):
-    ### FIELDS
-
-    cards_content = StreamField(
-        [("cards", blocks.CardLinkWithHeadlineBlock())],
-        verbose_name="Karty rozcestníku",
-        blank=True,
-        use_json_field=True,
-    )
-
-    content = StreamField(
-        CONTENT_BLOCKS
-        + [
-            ("badge", blocks.PersonBadgeBlock()),
-            ("people_group", blocks.PeopleGroupListBlock()),
-        ],
-        verbose_name="Obsah stránky",
-        blank=True,
-        use_json_field=True,
-    )
-
-    ### PANELS
-
-    content_panels = Page.content_panels + [
-        FieldPanel("cards_content"),
-        FieldPanel("content"),
-    ]
-
-    promote_panels = make_promote_panels()
-
-    settings_panels = []
-
-    ### RELATIONS
-
-    parent_page_types = ["district.DistrictHomePage"]
-    subpage_types = [
-        "district.DistrictArticlePage",
-        "district.DistrictArticlesPage",
-        "district.DistrictCenterPage",
-        "district.DistrictContactPage",
-        "district.DistrictCrossroadPage",
-        "district.DistrictCustomPage",
-        "district.DistrictElectionRootPage",
-        "district.DistrictGeoFeatureCollectionPage",
-        "district.DistrictPeoplePage",
-        "district.DistrictPersonPage",
-        "district.DistrictProgramPage",
-        "district.DistrictInteractiveProgramPage",
-    ]
-    ### OTHERS
-
-    class Meta:
-        verbose_name = "Rozcestník s kartami"
-
-
-class DistrictCustomPage(MainSimplePageMixin):
-    ### FIELDS
-
-    main_image = models.ForeignKey(
-        "wagtailimages.Image",
-        on_delete=models.PROTECT,
-        blank=True,
-        null=True,
-        verbose_name="Obrázek na pozadí hlavičky",
-        related_name="+",
-    )
-
-    content = StreamField(
-        CONTENT_BLOCKS
-        + [
-            ("badge", blocks.PersonBadgeBlock()),
-            ("people_group", blocks.PeopleGroupListBlock()),
-            ("newsletter", NewsletterSubscriptionBlock()),
-        ],
-        verbose_name="Obsah",
-        blank=True,
-        use_json_field=True,
-    )
-
-    ### PANELS
-
-    content_panels = Page.content_panels + [
-        FieldPanel("main_image"),
-        FieldPanel("content"),
-    ]
-
-    ### RELATIONS
-
-    parent_page_types = ["district.DistrictHomePage", "district.DistrictCrossroadPage"]
-    subpage_types = ["district.DistrictElectionRootPage"]
+# --- END Old election models ---
 
 
 class DistrictGeoFeatureCollectionPage(
@@ -1499,24 +1532,3 @@ class DistrictGeoFeatureDetailPage(
             print(exc)
 
             raise ValidationError({"geojson": str(exc)}) from exc
-
-
-class DistrictNewProgramPage(MainProgramPageMixin):
-    ### FIELDS
-
-    program = StreamField(
-        [
-            ("program_group", ProgramGroupBlock()),
-            ("program_group_crossroad", blocks.ProgramGroupBlockCrossroad()),
-            ("program_group_popout", blocks.ProgramGroupBlockPopout()),
-            ("program_group_with_candidates", blocks.ProgramGroupWithCandidatesBlock()),
-        ],
-        verbose_name="Program",
-        blank=True,
-        use_json_field=True,
-    )
-
-    ### RELATIONS
-
-    parent_page_types = ["district.DistrictHomePage"]
-    subpage_types = ["district.DistrictCustomPage"]
diff --git a/district/templates/district/district_article_page.html b/district/templates/district/district_article_page.html
index c43dc373..dc912198 100644
--- a/district/templates/district/district_article_page.html
+++ b/district/templates/district/district_article_page.html
@@ -1 +1 @@
-{% extends "styleguide2/article_page.html" %}
+{% extends "styleguide2/article_page.html" %}
\ No newline at end of file
diff --git a/elections/migrations/0035_alter_electionsfullprogrampage_content.py b/elections/migrations/0035_alter_electionsfullprogrampage_content.py
index 1e6ed2b3..ff2afc1d 100644
--- a/elections/migrations/0035_alter_electionsfullprogrampage_content.py
+++ b/elections/migrations/0035_alter_electionsfullprogrampage_content.py
@@ -7,15 +7,105 @@ from django.db import migrations
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
-        ('elections', '0034_alter_electionsarticlepage_content'),
+        ("elections", "0034_alter_electionsarticlepage_content"),
     ]
 
     operations = [
         migrations.AlterField(
-            model_name='electionsfullprogrampage',
-            name='content',
-            field=wagtail.fields.StreamField([('richtext', wagtail.blocks.RichTextBlock(label='Text')), ('popout_block', wagtail.blocks.StructBlock([('categories', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('name', wagtail.blocks.CharBlock(label='Název')), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('description', wagtail.blocks.RichTextBlock(label='Popis', required=False)), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek vyskakovacího bloku')), ('content', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah')), ('guarantor', wagtail.blocks.PageChooserBlock(label='Garant', page_type=['district.DistrictPersonPage'], required=False))]), label='Jednotlivé bloky programu'))]), label='Kategorie programu'))]))], blank=True, verbose_name='Obsah'),
+            model_name="electionsfullprogrampage",
+            name="content",
+            field=wagtail.fields.StreamField(
+                [
+                    ("richtext", wagtail.blocks.RichTextBlock(label="Text")),
+                    (
+                        "popout_block",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "categories",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "name",
+                                                    wagtail.blocks.CharBlock(
+                                                        label="Název"
+                                                    ),
+                                                ),
+                                                (
+                                                    "icon",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        label="Ikona", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "description",
+                                                    wagtail.blocks.RichTextBlock(
+                                                        label="Popis", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "point_list",
+                                                    wagtail.blocks.ListBlock(
+                                                        wagtail.blocks.StructBlock(
+                                                            [
+                                                                (
+                                                                    "title",
+                                                                    wagtail.blocks.CharBlock(
+                                                                        label="Titulek vyskakovacího bloku"
+                                                                    ),
+                                                                ),
+                                                                (
+                                                                    "content",
+                                                                    wagtail.blocks.RichTextBlock(
+                                                                        features=[
+                                                                            "h3",
+                                                                            "h4",
+                                                                            "h5",
+                                                                            "bold",
+                                                                            "italic",
+                                                                            "ol",
+                                                                            "ul",
+                                                                            "hr",
+                                                                            "link",
+                                                                            "document-link",
+                                                                            "image",
+                                                                            "superscript",
+                                                                            "subscript",
+                                                                            "strikethrough",
+                                                                            "blockquote",
+                                                                            "embed",
+                                                                        ],
+                                                                        label="Obsah",
+                                                                    ),
+                                                                ),
+                                                                (
+                                                                    "guarantor",
+                                                                    wagtail.blocks.PageChooserBlock(
+                                                                        label="Garant",
+                                                                        page_type=[
+                                                                            "district.DistrictPersonPage"
+                                                                        ],
+                                                                        required=False,
+                                                                    ),
+                                                                ),
+                                                            ]
+                                                        ),
+                                                        label="Jednotlivé bloky programu",
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Kategorie programu",
+                                    ),
+                                )
+                            ]
+                        ),
+                    ),
+                ],
+                blank=True,
+                verbose_name="Obsah",
+            ),
         ),
     ]
diff --git a/main/migrations/0091_alter_mainprogrampage_program.py b/main/migrations/0091_alter_mainprogrampage_program.py
index 94f376b4..6da9eaf9 100644
--- a/main/migrations/0091_alter_mainprogrampage_program.py
+++ b/main/migrations/0091_alter_mainprogrampage_program.py
@@ -7,15 +7,264 @@ from django.db import migrations
 
 
 class Migration(migrations.Migration):
-
     dependencies = [
-        ('main', '0090_alter_mainarticlepage_content'),
+        ("main", "0090_alter_mainarticlepage_content"),
     ]
 
     operations = [
         migrations.AlterField(
-            model_name='mainprogrampage',
-            name='program',
-            field=wagtail.fields.StreamField([('program_group', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('url', wagtail.blocks.URLBlock(label='Odkaz pokrývající celou tuto část', required=False)), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('title', wagtail.blocks.CharBlock(label='Titulek článku programu')), ('text', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah'))]), label='Jednotlivé články programu'))])), ('program_group_crossroad', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek')), ('title', wagtail.blocks.CharBlock(label='Titulek', required=True)), ('text', wagtail.blocks.RichTextBlock(label='Krátký text pod nadpisem', required=False)), ('page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['main.MainArticlesPage', 'main.MainArticlePage', 'main.MainProgramPage', 'main.MainPeoplePage', 'main.MainPersonPage', 'main.MainSimplePage', 'main.MainContactPage', 'main.MainCrossroadPage'], required=False)), ('link', wagtail.blocks.URLBlock(label='Odkaz', required=False))]), label='Karty programu'))])), ('program_group_popout', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('categories', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('name', wagtail.blocks.CharBlock(label='Název')), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('description', wagtail.blocks.RichTextBlock(label='Popis', required=False)), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek vyskakovacího bloku')), ('content', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah')), ('guarantor', wagtail.blocks.PageChooserBlock(label='Garant', page_type=['district.DistrictPersonPage'], required=False))]), label='Jednotlivé bloky programu'))]), label='Kategorie programu'))])), ('elections_program', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('program_page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['elections.ElectionsFullProgramPage'], required=False))]))], blank=True, verbose_name='Program'),
+            model_name="mainprogrampage",
+            name="program",
+            field=wagtail.fields.StreamField(
+                [
+                    (
+                        "program_group",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "point_list",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "url",
+                                                    wagtail.blocks.URLBlock(
+                                                        label="Odkaz pokrývající celou tuto část",
+                                                        required=False,
+                                                    ),
+                                                ),
+                                                (
+                                                    "icon",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        label="Ikona", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "title",
+                                                    wagtail.blocks.CharBlock(
+                                                        label="Titulek článku programu"
+                                                    ),
+                                                ),
+                                                (
+                                                    "text",
+                                                    wagtail.blocks.RichTextBlock(
+                                                        features=[
+                                                            "h3",
+                                                            "h4",
+                                                            "h5",
+                                                            "bold",
+                                                            "italic",
+                                                            "ol",
+                                                            "ul",
+                                                            "hr",
+                                                            "link",
+                                                            "document-link",
+                                                            "image",
+                                                            "superscript",
+                                                            "subscript",
+                                                            "strikethrough",
+                                                            "blockquote",
+                                                            "embed",
+                                                        ],
+                                                        label="Obsah",
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Jednotlivé články programu",
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                    (
+                        "program_group_crossroad",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "point_list",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "image",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        label="Obrázek"
+                                                    ),
+                                                ),
+                                                (
+                                                    "title",
+                                                    wagtail.blocks.CharBlock(
+                                                        label="Titulek", required=True
+                                                    ),
+                                                ),
+                                                (
+                                                    "text",
+                                                    wagtail.blocks.RichTextBlock(
+                                                        label="Krátký text pod nadpisem",
+                                                        required=False,
+                                                    ),
+                                                ),
+                                                (
+                                                    "page",
+                                                    wagtail.blocks.PageChooserBlock(
+                                                        label="Stránka",
+                                                        page_type=[
+                                                            "main.MainArticlesPage",
+                                                            "main.MainArticlePage",
+                                                            "main.MainProgramPage",
+                                                            "main.MainPeoplePage",
+                                                            "main.MainPersonPage",
+                                                            "main.MainSimplePage",
+                                                            "main.MainContactPage",
+                                                            "main.MainCrossroadPage",
+                                                        ],
+                                                        required=False,
+                                                    ),
+                                                ),
+                                                (
+                                                    "link",
+                                                    wagtail.blocks.URLBlock(
+                                                        label="Odkaz", required=False
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Karty programu",
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                    (
+                        "program_group_popout",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "categories",
+                                    wagtail.blocks.ListBlock(
+                                        wagtail.blocks.StructBlock(
+                                            [
+                                                (
+                                                    "name",
+                                                    wagtail.blocks.CharBlock(
+                                                        label="Název"
+                                                    ),
+                                                ),
+                                                (
+                                                    "icon",
+                                                    wagtail.images.blocks.ImageChooserBlock(
+                                                        label="Ikona", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "description",
+                                                    wagtail.blocks.RichTextBlock(
+                                                        label="Popis", required=False
+                                                    ),
+                                                ),
+                                                (
+                                                    "point_list",
+                                                    wagtail.blocks.ListBlock(
+                                                        wagtail.blocks.StructBlock(
+                                                            [
+                                                                (
+                                                                    "title",
+                                                                    wagtail.blocks.CharBlock(
+                                                                        label="Titulek vyskakovacího bloku"
+                                                                    ),
+                                                                ),
+                                                                (
+                                                                    "content",
+                                                                    wagtail.blocks.RichTextBlock(
+                                                                        features=[
+                                                                            "h3",
+                                                                            "h4",
+                                                                            "h5",
+                                                                            "bold",
+                                                                            "italic",
+                                                                            "ol",
+                                                                            "ul",
+                                                                            "hr",
+                                                                            "link",
+                                                                            "document-link",
+                                                                            "image",
+                                                                            "superscript",
+                                                                            "subscript",
+                                                                            "strikethrough",
+                                                                            "blockquote",
+                                                                            "embed",
+                                                                        ],
+                                                                        label="Obsah",
+                                                                    ),
+                                                                ),
+                                                                (
+                                                                    "guarantor",
+                                                                    wagtail.blocks.PageChooserBlock(
+                                                                        label="Garant",
+                                                                        page_type=[
+                                                                            "district.DistrictPersonPage"
+                                                                        ],
+                                                                        required=False,
+                                                                    ),
+                                                                ),
+                                                            ]
+                                                        ),
+                                                        label="Jednotlivé bloky programu",
+                                                    ),
+                                                ),
+                                            ]
+                                        ),
+                                        label="Kategorie programu",
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                    (
+                        "elections_program",
+                        wagtail.blocks.StructBlock(
+                            [
+                                (
+                                    "title",
+                                    wagtail.blocks.CharBlock(
+                                        label="Titulek části programu"
+                                    ),
+                                ),
+                                (
+                                    "program_page",
+                                    wagtail.blocks.PageChooserBlock(
+                                        label="Stránka",
+                                        page_type=[
+                                            "elections.ElectionsFullProgramPage"
+                                        ],
+                                        required=False,
+                                    ),
+                                ),
+                            ]
+                        ),
+                    ),
+                ],
+                blank=True,
+                verbose_name="Program",
+            ),
         ),
     ]
diff --git a/main/migrations/0092_alter_mainprogrampage_program.py b/main/migrations/0092_alter_mainprogrampage_program.py
new file mode 100644
index 00000000..e6840396
--- /dev/null
+++ b/main/migrations/0092_alter_mainprogrampage_program.py
@@ -0,0 +1,21 @@
+# Generated by Django 5.0.4 on 2024-05-29 12:28
+
+import wagtail.blocks
+import wagtail.fields
+import wagtail.images.blocks
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('main', '0091_alter_mainprogrampage_program'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='mainprogrampage',
+            name='program',
+            field=wagtail.fields.StreamField([('program_group', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('url', wagtail.blocks.URLBlock(label='Odkaz pokrývající celou tuto část', required=False)), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('title', wagtail.blocks.CharBlock(label='Titulek článku programu')), ('text', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah'))]), label='Jednotlivé články programu'))])), ('program_group_crossroad', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('image', wagtail.images.blocks.ImageChooserBlock(label='Obrázek')), ('title', wagtail.blocks.CharBlock(label='Titulek', required=True)), ('text', wagtail.blocks.RichTextBlock(label='Krátký text pod nadpisem', required=False)), ('page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['main.MainArticlesPage', 'main.MainArticlePage', 'main.MainProgramPage', 'main.MainPeoplePage', 'main.MainPersonPage', 'main.MainSimplePage', 'main.MainContactPage', 'main.MainCrossroadPage'], required=False)), ('link', wagtail.blocks.URLBlock(label='Odkaz', required=False))]), label='Karty programu'))])), ('program_group_popout', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('categories', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('name', wagtail.blocks.CharBlock(label='Název')), ('icon', wagtail.images.blocks.ImageChooserBlock(label='Ikona', required=False)), ('description', wagtail.blocks.RichTextBlock(label='Popis', required=False)), ('point_list', wagtail.blocks.ListBlock(wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek vyskakovacího bloku')), ('content', wagtail.blocks.RichTextBlock(features=['h3', 'h4', 'h5', 'bold', 'italic', 'ol', 'ul', 'hr', 'link', 'document-link', 'image', 'superscript', 'subscript', 'strikethrough', 'blockquote', 'embed'], label='Obsah')), ('guarantor', wagtail.blocks.PageChooserBlock(label='Garant', page_type=['district.DistrictPersonPage'], required=False))]), label='Jednotlivé bloky programu'))]), label='Kategorie programu'))])), ('elections_program', wagtail.blocks.StructBlock([('title', wagtail.blocks.CharBlock(label='Titulek části programu')), ('program_page', wagtail.blocks.PageChooserBlock(label='Stránka', page_type=['elections.ElectionsFullProgramPage'], required=False))]))], blank=True, verbose_name='Programy'),
+        ),
+    ]
diff --git a/main/models.py b/main/models.py
index e7197eb5..42522977 100644
--- a/main/models.py
+++ b/main/models.py
@@ -171,7 +171,7 @@ class MainProgramPage(MainProgramPageMixin):
             ("program_group_popout", blocks.ProgramGroupBlockPopout()),
             ("elections_program", blocks.ElectionsProgramBlock()),
         ],
-        verbose_name="Program",
+        verbose_name="Programy",
         blank=True,
         use_json_field=True,
     )
diff --git a/shared/models/main.py b/shared/models/main.py
index 273d8e7f..0f353a44 100644
--- a/shared/models/main.py
+++ b/shared/models/main.py
@@ -1915,7 +1915,7 @@ class MainProgramPageMixin(
             ("program_group", ProgramGroupBlock()),
             ("program_group_popout", ProgramGroupBlockPopout()),
         ],
-        verbose_name="Program",
+        verbose_name="Programy",
         blank=True,
         use_json_field=True,
     )
diff --git a/shared/templates/styleguide2/includes/molecules/program/program_block.html b/shared/templates/styleguide2/includes/molecules/program/program_block.html
index 5bef1e05..c07a4941 100644
--- a/shared/templates/styleguide2/includes/molecules/program/program_block.html
+++ b/shared/templates/styleguide2/includes/molecules/program/program_block.html
@@ -89,9 +89,11 @@
 
     <template v-if="isCurrentSecondaryView('program')">
       {% with is_descendant=True %}
-        {% with self.value.program.block_type as block_type %}
-          {% include_block self.program %}
-        {% endwith %}
+        {% for program in self.program %}
+          {% with program.block_type as block_type %}
+            {% include_block program %}
+          {% endwith %}
+        {% endfor %}
       {% endwith %}
     </template>
   </ui-secondary-view-provider>
-- 
GitLab