from django.db import models from django.utils.translation import gettext_lazy from wagtail.admin.edit_handlers import ( FieldPanel, HelpPanel, MultiFieldPanel, StreamFieldPanel, ) from wagtail.core import blocks from wagtail.core.fields import StreamField from wagtail.core.models import Page from wagtail.images.blocks import ImageChooserBlock from wagtail.images.edit_handlers import ImageChooserPanel from wagtailmetadata.models import MetadataPageMixin from tuning import help SUPPORT_CHOICES = ((1, "Pro"), (0, "Proti"), (-1, "Nevíme")) RICH_TEXT_FEATURES = [ "h2", "h3", "h4", "h5", "bold", "italic", "ol", "ul", "hr", "link", "document-link", "image", "superscript", "subscript", "strikethrough", "blockquote", ] class MenuItemBlock(blocks.StructBlock): name = blocks.CharBlock(label="název") page = blocks.PageChooserBlock( label="stránka", page_type=["regulace_konopi.RegkonHomePage", "regulace_konopi.RegkonSubPage"], ) class Meta: label = "stránka" class MepBlock(blocks.StructBlock): name = blocks.CharBlock(label="jméno") approved = blocks.ChoiceBlock(choices=SUPPORT_CHOICES, label="hlasoval") class Meta: label = "Poslanec" class PartyBlock(blocks.StructBlock): name = blocks.CharBlock(label="název") mep = blocks.ListBlock(MepBlock()) class Meta: label = "Politická strana" class FaqBlock(blocks.StructBlock): question = blocks.TextBlock() answer = blocks.RichTextBlock() class RegkonHomePage(MetadataPageMixin, Page): ### FIELDS content = StreamField( [ ("title", blocks.CharBlock(label="nadpis", icon="title")), ("text", blocks.RichTextBlock(label="text", features=RICH_TEXT_FEATURES)), ( "carousel", blocks.ListBlock( ImageChooserBlock(label="obrázek"), label="carousel", icon="image" ), ), ], verbose_name="obsah stránky", blank=True, ) # settings matomo_id = models.IntegerField( "Matomo ID pro sledování návštěvnosti", blank=True, null=True ) top_menu = StreamField( [("item", MenuItemBlock())], verbose_name="horní menu", blank=True, ) ### PANELS content_panels = Page.content_panels + [ StreamFieldPanel("content"), ] promote_panels = [ MultiFieldPanel( [ FieldPanel("seo_title"), FieldPanel("search_description"), ImageChooserPanel("search_image"), HelpPanel(help.build(help.IMPORTANT_TITLE)), ], gettext_lazy("Common page configuration"), ), ] settings_panels = [ FieldPanel("matomo_id"), StreamFieldPanel("top_menu"), ] ### RELATIONS subpage_types = [ "regulace_konopi.RegkonSubPage", ] ### OTHERS class Meta: verbose_name = "Regulace konpí" @property def root_page(self): return self class RegkonSubPage(Page, MetadataPageMixin): ### FIELDS content = StreamField( [ ("title", blocks.CharBlock(label="nadpis", icon="title")), ("text", blocks.RichTextBlock(label="text", features=RICH_TEXT_FEATURES)), ( "carousel", blocks.ListBlock( ImageChooserBlock(label="obrázek"), label="carousel", icon="image" ), ), ( "FAQ", blocks.ListBlock( FaqBlock(template="regulace_konopi/blocks/faq.html"), label="faq" ), ), ("meps", PartyBlock(template="regulace_konopi/blocks/party.html")), ], verbose_name="obsah stránky", blank=True, ) ### PANELS promote_panels = [ MultiFieldPanel( [ FieldPanel("slug"), FieldPanel("seo_title"), FieldPanel("search_description"), ImageChooserPanel("search_image"), HelpPanel(help.build(help.NO_SEO_TITLE, help.NO_SEARCH_IMAGE)), ], gettext_lazy("Common page configuration"), ), ] content_panels = Page.content_panels + [ StreamFieldPanel("content"), ] settings_panels = [] ### RELATIONS parent_page_types = ["regulace_konopi.RegkonHomePage"] subpage_types = [] ### OTHERS class Meta: verbose_name = "Podstránka" @property def root_page(self): if not hasattr(self, "_root_page"): self._root_page = self.get_ancestors().type(RegkonHomePage).specific().get() return self._root_page def get_meta_image(self): return self.search_image or self.root_page.get_meta_image()