Untitled

 avatar
unknown
plain_text
a year ago
7.7 kB
6
Indexable
"""Home models."""

from django.db.models import SET_NULL, CharField, ForeignKey
from django.utils.translation import gettext_lazy as _
from wagtail.admin.panels import (
    FieldPanel,
    FieldRowPanel,
    MultiFieldPanel,
    PageChooserPanel,
)
from wagtail.blocks import (
    BooleanBlock,
    CharBlock,
    IntegerBlock,
    PageChooserBlock,
    StructBlock,
)
from wagtail.fields import StreamField
from wagtail.models import Page
from wagtail_color_panel.edit_handlers import NativeColorPanel

from common import AUTHORED_PIECE_INDEX_SUBPAGE_TYPES, AUTHORED_PIECE_TYPES
from common.managers import CommonManager
from common.models import (
    AbstractSEOPage,
    BannerFieldsModel,
    FeaturedOpinionFieldModel,
)
from figures.models import FigureIndexPage, FigurePage
from opinions.models import OpinionIndexPage, OpinionPage


class HomePage(BannerFieldsModel, FeaturedOpinionFieldModel, AbstractSEOPage):
    """The homepage."""

    newsletter_description = CharField(
        verbose_name=_("descrizione newsletter"), blank=True
    )
    opinions_description = CharField(verbose_name=_("descrizione opinioni"), blank=True)
    banner_image = ForeignKey(
        "common.CustomImage",
        null=True,
        blank=True,
        on_delete=SET_NULL,
        related_name="+",
        verbose_name=_("immagine"),
    )
    figure_section_title = CharField(verbose_name=_("titolo widget"), blank=True)
    figure_section_description = CharField(
        verbose_name=_("descrizione widget"), blank=True
    )
    featured_authored_piece = ForeignKey(
        "wagtailcore.Page",
        verbose_name=_("articolo laterale"),
        null=True,
        blank=True,
        on_delete=SET_NULL,
        related_name="+",
    )
    figure_taxonomy = ForeignKey(
        "taxonomies.FiguresTaxonomyPage",
        verbose_name=_("tassonomia Numeri"),
        null=True,
        blank=True,
        on_delete=SET_NULL,
        related_name="+",
    )
    figure_widget_chart = StreamField(
        [
            (
                "figure_bar",
                StructBlock(
                    [
                        ("bar_label", CharBlock(label=_("Titolo"), blank=True)),
                        (
                            "is_bar_highlighted",
                            BooleanBlock(
                                label=_("In evidenza"), default=False, required=False
                            ),
                        ),
                        (
                            "bar_length",
                            IntegerBlock(
                                label=_("Lunghezza"),
                                max_value=5,
                                min_value=1,
                                default=1,
                            ),
                        ),
                    ],
                    label=_("Segmento numero"),
                ),
            ),
        ],
        verbose_name=_("chart numeri"),
        blank=True,
        null=True,
    )
    authored_pieces_board = StreamField(
        [
            (
                "main_article",
                PageChooserBlock(
                    page_type=AUTHORED_PIECE_INDEX_SUBPAGE_TYPES,
                    label=_("Articolo principale"),
                ),
            ),
            (
                "secondary_article",
                PageChooserBlock(
                    page_type=AUTHORED_PIECE_INDEX_SUBPAGE_TYPES,
                    label=_("Articolo secondario"),
                ),
            ),
            (
                "bottom_article",
                PageChooserBlock(
                    page_type=AUTHORED_PIECE_INDEX_SUBPAGE_TYPES,
                    label=_("Articolo di chiusura"),
                ),
            ),
            (
                "side_article",
                PageChooserBlock(
                    page_type=AUTHORED_PIECE_INDEX_SUBPAGE_TYPES,
                    label=_("Articolo laterale"),
                ),
            ),
        ],
        block_counts={
            "main_article": {"max_num": 1},
            "secondary_article": {"max_num": 1},
            "bottom_article": {"max_num": 2},
            "side_article": {"max_num": 4},
        },
        verbose_name=_("bacheca articoli"),
        blank=True,
        null=True,
    )

    objects = CommonManager()

    content_panels = Page.content_panels + [
        FieldPanel("newsletter_description"),
        FieldPanel("authored_pieces_board"),
        FieldPanel("opinions_description"),
        FieldPanel("featured_opinion"),
        MultiFieldPanel(
            [
                FieldPanel("figure_section_title"),
                FieldPanel("figure_section_description"),
                FieldPanel("figure_taxonomy"),
                FieldPanel("figure_widget_chart"),
                PageChooserPanel(
                    "featured_authored_piece",
                    page_type=[
                        "articles.ArticlePage",
                        "opinions.OpinionPage",
                        "dossiers.DossierPage",
                    ],
                ),
            ],
            heading=_("Sezione Numeri"),
        ),
        MultiFieldPanel(
            [
                FieldPanel("banner_image"),
                FieldPanel("banner_title"),
                FieldRowPanel(
                    [
                        FieldPanel("banner_publication_issue"),
                        FieldPanel("banner_publication_year"),
                    ]
                ),
                FieldPanel("banner_description"),
                FieldRowPanel(
                    [
                        FieldPanel("banner_primary_button_label"),
                        FieldPanel("banner_primary_button_page"),
                    ]
                ),
                FieldRowPanel(
                    [
                        FieldPanel("banner_secondary_button_label"),
                        FieldPanel("banner_secondary_button_page"),
                    ]
                ),
                FieldRowPanel(
                    [
                        NativeColorPanel("banner_background_color"),
                        NativeColorPanel("banner_text_color"),
                        NativeColorPanel("banner_button_background_color"),
                    ]
                ),
            ],
            heading=_("Banner"),
        ),
    ]

    class Meta:
        """The model options."""

        verbose_name = "homepage"
        verbose_name_plural = "homepage"

    def get_context(self, request, *args, **kwargs):
        """Return context."""
        figures = (
            FigurePage.objects.live()
            .specific()
            .select_related("taxonomies")
            .filter(taxonomies__in=[self.figure_taxonomy])
            .order_by("-first_published_at")
        )
        return {
            **super().get_context(request, *args, **kwargs),
            "opinions": OpinionPage.objects.live().order_by("-first_published_at"),
            "featured_opinion": self.featured_opinion
            or OpinionPage.objects.live().order_by("-first_published_at").first(),
            "opinion_index_page": OpinionIndexPage.objects.in_menu().first(),
            "authored_pieces": sorted(
                self._meta.model.objects.get_live_pages_for_types(
                    *AUTHORED_PIECE_TYPES
                )[:11],
                key=lambda x: not x.is_featured_news_in_homepage,
            ),
            "figures_chart": zip(
                figures, self.figure_widget_chart.raw_data, strict=False
            ),
            "figure_index_page": FigureIndexPage.objects.in_menu().first(),
        }
Editor is loading...
Leave a Comment