from django.db import models from django.utils.translation import gettext_lazy from wagtail import blocks from wagtail.admin.panels import CommentPanel, FieldPanel, HelpPanel, MultiFieldPanel from wagtail.fields import StreamField from wagtail.images.blocks import ImageChooserBlock from wagtail.models import Page from wagtailmetadata.models import MetadataPageMixin from shared.models import ExtendedMetadataHomePageMixin, ExtendedMetadataPageMixin from tuning import admin_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 ThreeColumnsBlock(blocks.StructBlock): first_column = blocks.RichTextBlock(features=RICH_TEXT_FEATURES) second_column = blocks.RichTextBlock(features=RICH_TEXT_FEATURES) class RegkonHomePage(ExtendedMetadataHomePageMixin, MetadataPageMixin, Page): ### FIELDS content = StreamField( [ ("title", blocks.CharBlock(label="nadpis", icon="title")), ("text", blocks.RichTextBlock(label="text", features=RICH_TEXT_FEATURES)), ( "text_centered", blocks.RichTextBlock(label="text-center", features=RICH_TEXT_FEATURES), ), ( "text_justify", blocks.RichTextBlock(label="text-justify", features=RICH_TEXT_FEATURES), ), ( "carousel", blocks.ListBlock( ImageChooserBlock(label="obrázek"), label="carousel", icon="image" ), ), ( "carousel_text", blocks.ListBlock( blocks.RichTextBlock(features=RICH_TEXT_FEATURES), label="carousel-text", icon="paragraph", ), ), ], verbose_name="obsah stránky", blank=True, use_json_field=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, use_json_field=True, ) ### PANELS content_panels = Page.content_panels + [ FieldPanel("content"), ] promote_panels = [ MultiFieldPanel( [ FieldPanel("seo_title"), FieldPanel("search_description"), FieldPanel("search_image"), HelpPanel(admin_help.build(admin_help.IMPORTANT_TITLE)), ], gettext_lazy("Common page configuration"), ), ] settings_panels = [ FieldPanel("matomo_id"), FieldPanel("title_suffix"), FieldPanel("meta_title_suffix"), FieldPanel("top_menu"), CommentPanel(), ] ### RELATIONS subpage_types = [ "regulace_konopi.RegkonSubPage", ] ### OTHERS class Meta: verbose_name = "Regulace konpí" @property def root_page(self): return self class RegkonSubPage(Page, ExtendedMetadataPageMixin, MetadataPageMixin): ### FIELDS content = StreamField( [ ("title", blocks.CharBlock(label="nadpis", icon="title")), ("text", blocks.RichTextBlock(label="text", features=RICH_TEXT_FEATURES)), ( "text_centered", blocks.RichTextBlock(label="text-center", features=RICH_TEXT_FEATURES), ), ( "text_justify", blocks.RichTextBlock(label="text-justify", features=RICH_TEXT_FEATURES), ), ( "carousel", blocks.ListBlock( ImageChooserBlock(label="obrázek"), label="carousel", icon="image" ), ), ( "carousel_text", blocks.ListBlock( blocks.RichTextBlock(features=RICH_TEXT_FEATURES), label="carousel-text", icon="image", ), ), ( "FAQ", blocks.ListBlock( FaqBlock(template="regulace_konopi/blocks/faq.html"), label="faq" ), ), ("meps", PartyBlock(template="regulace_konopi/blocks/party.html")), ( "text_3_columns", blocks.StreamBlock( [ ( "column", blocks.RichTextBlock( label="column", features=RICH_TEXT_FEATURES ), ) ], max_num=3, icon="doc-full", ), ), ], verbose_name="obsah stránky", blank=True, use_json_field=True, ) ### PANELS promote_panels = [ MultiFieldPanel( [ FieldPanel("slug"), FieldPanel("seo_title"), FieldPanel("search_description"), FieldPanel("search_image"), HelpPanel( admin_help.build( admin_help.NO_SEO_TITLE, admin_help.NO_SEARCH_IMAGE ) ), ], gettext_lazy("Common page configuration"), ), ] content_panels = Page.content_panels + [ FieldPanel("content"), ] settings_panels = [CommentPanel()] ### RELATIONS parent_page_types = [ "regulace_konopi.RegkonHomePage", "regulace_konopi.RegkonSubPage", ] subpage_types = ["regulace_konopi.RegkonSubPage"] ### 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()