Untitled
unknown
plain_text
a year ago
7.7 kB
9
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