Skip to content
Snippets Groups Projects
Verified Commit bc7651ef authored by Alexa Valentová's avatar Alexa Valentová
Browse files

update program page

parent 2851a59d
No related branches found
No related tags found
2 merge requests!994Release,!988Redesign
Pipeline #18466 passed
This commit is part of merge request !994. Comments created here will be created in the context of that merge request.
Showing with 1776 additions and 270 deletions
......@@ -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",
),
),
]
# 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'),
),
]
......@@ -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"]
......@@ -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",
),
),
]
......@@ -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",
),
),
]
# 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'),
),
]
......@@ -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,
)
......
......@@ -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,
)
......
......@@ -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 %}
{% for program in self.program %}
{% with program.block_type as block_type %}
{% include_block program %}
{% endwith %}
{% endfor %}
{% endwith %}
</template>
</ui-secondary-view-provider>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment