from django.db import models from modelcluster.contrib.taggit import ClusterTaggableManager from modelcluster.fields import ParentalKey from taggit.models import TaggedItemBase from wagtail.admin.panels import FieldPanel from wagtail.blocks import RichTextBlock from wagtail.contrib.routable_page.models import route from wagtail.fields import RichTextField, StreamField from wagtail.models import Page from wagtailmetadata.models import MetadataPageMixin from shared import blocks as shared_blocks from shared.models import ( # MenuMixin, ArticleMixin, ExtendedMetadataHomePageMixin, ExtendedMetadataPageMixin, MainArticlePageMixin, MainArticlesPageMixin, MainContactPageMixin, MainHomePageMixin, MainPeoplePageMixin, MainPersonPageMixin, MainProgramPageMixin, MainSearchPageMixin, MainSimplePageMixin, PageInMenuMixin, SharedTaggedMainArticle, SubpageMixin, ) from shared.utils import make_promote_panels from . import blocks from .forms import JekyllImportForm class MainHomePage(MainHomePageMixin): # content content = StreamField( [ ("carousel", blocks.HomePageCarouseSlideBlock()), ( "news", shared_blocks.NewsBlock( template="styleguide2/includes/organisms/articles/articles_section.html" ), ), # ("europarl_news", blocks.EuroparlNewsBlock()), ("people", shared_blocks.PeopleOverviewBlock()), ("regions", blocks.RegionsBlock()), ("boxes", blocks.BoxesBlock()), ], verbose_name="Hlavní obsah", blank=True, use_json_field=True, ) # footer footer_person_list = StreamField( [("person", blocks.PersonContactBlock())], verbose_name="Osoby v zápatí webu", blank=True, max_num=6, use_json_field=True, ) # settings gdpr_and_cookies_page = models.ForeignKey( "main.MainSimplePage", verbose_name="Stránka pro GDPR", on_delete=models.PROTECT, blank=True, null=True, ) subpage_types = [ "main.MainArticlesPage", "main.MainProgramPage", "main.MainPeoplePage", "main.MainPersonPage", "main.MainSimplePage", "main.MainContactPage", "main.MainCrossroadPage", "main.MainHoaxPage", "main.MainSearchPage", "main.MainResultsPage", ] ### OTHERS class Meta: verbose_name = "HomePage pirati.cz" @property def article_page_model(self): return MainArticlePage @property def articles_page_model(self): return MainArticlesPage @property def contact_page_model(self): return MainContactPage @property def search_page_model(self): return MainSearchPage @property def people_page_model(self): return MainPeoplePage @property def root_page(self): return self def _first_subpage_of_type(self, page_type) -> Page or None: try: return self.get_descendants().type(page_type).live().specific()[0] except IndexError: return None @route(r"^sdilene/$", name="shared") def shared(self, request): return self.setup_article_page_context(request) class MainArticlesPage(MainArticlesPageMixin): base_form_class = JekyllImportForm parent_page_types = ["main.MainHomePage"] subpage_types = ["main.MainArticlePage"] class MainArticleTag(TaggedItemBase): content_object = ParentalKey( "main.MainArticlePage", on_delete=models.CASCADE, related_name="main_tagged_items", ) class MainArticlePage(MainArticlePageMixin): author_page = models.ForeignKey( "main.MainPersonPage", on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Stránka autora (osoby)", ) tags = ClusterTaggableManager( through=MainArticleTag, related_name="main_tagged_articles", blank=True ) shared_tags = ClusterTaggableManager( verbose_name="Tagy pro sdílení mezi weby", through=SharedTaggedMainArticle, blank=True, ) parent_page_types = ["main.MainArticlesPage"] subpage_types = [] class MainProgramPage(MainProgramPageMixin): ### FIELDS program = StreamField( [ ("program_group", shared_blocks.ProgramGroupBlock()), ("program_group_crossroad", blocks.ProgramGroupBlockCrossroad()), ("program_group_popout", blocks.ProgramGroupBlockPopout()), ("elections_program", blocks.ElectionsProgramBlock()), ], verbose_name="Programy", blank=True, use_json_field=True, ) ### RELATIONS parent_page_types = ["main.MainHomePage"] subpage_types = [] class MainPeoplePage(MainPeoplePageMixin): content = StreamField( [ ("people_group", blocks.PeopleGroupBlock(label="Seznam osob")), ("team_group", blocks.TeamBlock()), ], verbose_name="Lidé a týmy", blank=True, use_json_field=True, ) parent_page_types = ["main.MainHomePage"] subpage_types = [ "main.MainPersonPage", "main.MainSimplePage", ] class MainPersonPage(MainPersonPageMixin): ### RELATIONS parent_page_types = ["main.MainPeoplePage"] class MainSimplePage(MainSimplePageMixin): parent_page_types = [ "main.MainHomePage", "main.MainSimplePage", "main.MainCrossroadPage", "main.MainPeoplePage", ] subpage_types = ["main.MainSimplePage"] class MainContactPage(MainContactPageMixin): ### FIELDS contact_people = StreamField( [("item", blocks.PersonContactBlock())], verbose_name="Kontaktní osoby", blank=True, use_json_field=True, ) ### RELATIONS parent_page_types = ["main.MainHomePage"] subpage_types = [] class MainCrossroadPage( ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, PageInMenuMixin, Page ): ### FIELDS headlined_cards_content = StreamField( [(("headlined_cards"), blocks.CardLinkWithHeadlineBlock())], verbose_name="Karty rozcestníku s nadpisem", blank=True, use_json_field=True, ) cards_content = StreamField( [("cards", blocks.CardLinkBlock())], verbose_name="Karty rozcestníku", blank=True, use_json_field=True, ) ### PANELS content_panels = Page.content_panels + [ FieldPanel("headlined_cards_content"), FieldPanel("cards_content"), ] promote_panels = make_promote_panels() settings_panels = [] ### RELATIONS parent_page_types = [ "main.MainHomePage", "main.MainCrossroadPage", ] subpage_types = [ "main.MainSimplePage", "main.MainCrossroadPage", ] ### OTHERS class Meta: verbose_name = "Rozcestník s kartami" class MainHoaxPage( ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, PageInMenuMixin, Page ): ### FIELDS description = RichTextField( "Popis", blank=True, null=True, ) content = StreamField( [(("hoax"), blocks.HoaxBlock())], verbose_name="Hoaxy a jejich vysvětlení", blank=True, use_json_field=True, ) ### PANELS content_panels = Page.content_panels + [ FieldPanel("description"), FieldPanel("content"), ] promote_panels = make_promote_panels() settings_panels = [] ### RELATIONS parent_page_types = ["main.MainHomePage"] subpage_types = [] ### OTHERS class Meta: verbose_name = "Hoaxy" class MainResultsPage( ExtendedMetadataPageMixin, SubpageMixin, MetadataPageMixin, PageInMenuMixin, Page ): ### FIELDS content = StreamField( [ (("flip_cards"), shared_blocks.FlipCardsBlock()), ( "text", RichTextBlock( template="styleguide2/includes/atoms/text/prose_richtext.html" ), ), ], verbose_name="Obsah", blank=True, use_json_field=True, ) ### PANELS content_panels = Page.content_panels + [ FieldPanel("content"), ] parent_page_types = ["main.MainHomePage"] subpage_types = [] class Meta: verbose_name = "Výsledky" class MainSearchPage(MainSearchPageMixin): parent_page_types = ["main.MainHomePage"] subpage_types = [] @property def searchable_models(self) -> list: return [ MainArticlePage, MainPersonPage, MainSimplePage, ]