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