Skip to content
Snippets Groups Projects
Forked from TO / Maják
1796 commits behind the upstream repository.
models.py 4.86 KiB
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()