class DataSnapshot(blocks.StructBlock): """ A basic Data Snapshot object. """ # Market key corresponds to market short name for lookup market_key = blocks.CharBlock(max_length=20, required=True, help_text='Market identifier, e.g. AUT') num_originations = blocks.CharBlock( max_length=20, help_text='Number of originations, e.g. 1.2 million') value_originations = blocks.CharBlock( max_length=20, help_text='Total dollar value of originations, e.g. $3.4 billion') year_over_year_change = blocks.CharBlock( max_length=20, help_text='Percentage change, e.g. 5.6% increase') last_updated_projected_data = blocks.DateBlock( help_text='Month of latest entry in dataset') # Market-specific descriptor text num_originations_text = blocks.CharBlock( max_length=100, help_text='Descriptive sentence, e.g. Auto loans originated') value_originations_text = blocks.CharBlock( max_length=100, help_text='Descriptive sentence, e.g. Dollar volume of new loans') year_over_year_change_text = blocks.CharBlock( max_length=100, help_text='Descriptive sentence, e.g. In year-over-year originations') # Select an image image = images_blocks.ImageChooserBlock(required=False, icon='image') class Meta: icon = 'image' label = 'CCT Data Snapshot' template = '_includes/organisms/data_snapshot.html'
class InfoBlock(core_blocks.StructBlock): title = core_blocks.CharBlock(classname="full title", required=False) image = image_blocks.ImageChooserBlock(required=False) text = core_blocks.RichTextBlock(required=False) button = CallToActionBlock(required=False) highlight = core_blocks.ChoiceBlock( choices=[('', 'None'), ('highlight', 'Highlight (blue)'), ('boxed', 'Boxed'), ('boxed2', 'Boxed Variation'), ('highlight-purple', 'Highlight (purple)')], icon='cup', required=False, help_text='How should this block be displayed?') alignment = core_blocks.ChoiceBlock( choices=[ ('vertical', 'vertical'), ('horizontal', 'horizontal'), ], icon='cup', default='vertical', help_text='How should the text and image be aligned?') class Meta: template = 'home/blocks/info_block.html' icon = 'placeholder' label = 'Info Block'
class BasicContentBlock(blocks.StructBlock): class Meta: template = "cms_pages/home_page_blocks/basic_content.html" PANEL_BLUE_LEFT = "blue_left" PANEL_WHITE_RIGHT = "white_right" PANEL_TYPES = ( (PANEL_BLUE_LEFT, "Left-aligned image, blue-filtered image BG"), (PANEL_WHITE_RIGHT, "Right-aligned image, white background"), ) panel_type = blocks.ChoiceBlock( choices=PANEL_TYPES, required=True, ) heading = blocks.CharBlock(required=True) inset_illustration = blocks.ChoiceBlock( choices=ILLUSTRATION_TYPES, required=True, ) background_image = imageblocks.ImageChooserBlock( required=False, help_text="This is used as the background image of a " "blue-left block. It's not used for white-right.") body = blocks.RichTextBlock(required=True) link = BasicContentLink() external_links = blocks.ListBlock(ExternalLinksBlock) compact = blocks.BooleanBlock( required=False, help_text="True if this block is to be displayed in 'compact' mode", )
class WideImageBlock(core_blocks.StructBlock): image = image_blocks.ImageChooserBlock() class Meta: template = 'home/blocks/wide_image_block.html' icon = 'placeholder' label = 'Wide Image Block'
class ColumnBlock(core_blocks.StructBlock): title_col1 = core_blocks.CharBlock(classname="full title", required=False) image_col1 = image_blocks.ImageChooserBlock(required=False) text_col1 = core_blocks.RichTextBlock(required=False) title_col2 = core_blocks.CharBlock(classname="full title", required=False) image_col2 = image_blocks.ImageChooserBlock(required=False) text_col2 = core_blocks.RichTextBlock(required=False) title_col3 = core_blocks.CharBlock(classname="full title", required=False) image_col3 = image_blocks.ImageChooserBlock(required=False) text_col3 = core_blocks.RichTextBlock(required=False) class Meta: template = 'home/blocks/column_block.html' icon = 'placeholder' label = 'Column Block'
class FullWidthText(blocks.StreamBlock): content = blocks.RichTextBlock(icon='edit') media = images_blocks.ImageChooserBlock(icon='image') quote = molecules.Quote() cta = molecules.CallToAction() related_links = molecules.RelatedLinks() table = Table() class Meta: icon = 'edit' template = '_includes/organisms/full-width-text.html'
class WidthBlock(blocks.StructBlock): width = blocks.IntegerBlock( min_value=1, max_value=5, help_text="How many grid columns to occupy in rendered template") content = blocks.StreamBlock([ ('rich_text', blocks.RichTextBlock()), ('raw_html', blocks.RawHTMLBlock()), ('image', image_blocks.ImageChooserBlock()), ], min_num=1, max_num=1)
class KeynoteSpeakerBlock(blocks.StructBlock): class Meta: template = "cms_pages/home_page_blocks/keynote_speaker.html" name = blocks.CharBlock(required=True) body = blocks.RichTextBlock(required=True) links = blocks.ListBlock(ExternalLinksBlock) profile_image = imageblocks.ImageChooserBlock( required=False, help_text="Profile image for the speaker", ) presentation = PresentationChooserBlock( help_text="This speaker's presentation", )
class FullWidthText(blocks.StreamBlock): content_with_anchor = molecules.ContentWithAnchor() content = blocks.RichTextBlock(icon='edit') media = images_blocks.ImageChooserBlock(icon='image') quote = molecules.Quote() cta = molecules.CallToAction() related_links = molecules.RelatedLinks() table = Table(editable=False) table_block = AtomicTableBlock(table_options={'renderer': 'html'}) class Meta: icon = 'edit' template = '_includes/organisms/full-width-text.html'
class FullWidthText(blocks.StreamBlock): content = blocks.RichTextBlock(icon='edit') content_with_anchor = molecules.ContentWithAnchor() heading = v1_blocks.HeadingBlock(required=False) image_inset = molecules.ContentImage() table_block = AtomicTableBlock(table_options={'renderer': 'html'}) quote = molecules.Quote() cta = molecules.CallToAction() related_links = molecules.RelatedLinks() reusable_text = v1_blocks.ReusableTextChooserBlock('v1.ReusableText') email_signup = EmailSignUp() media = images_blocks.ImageChooserBlock(icon=None, label=' ') class Meta: icon = 'edit' template = '_includes/organisms/full-width-text.html'
class BlogPost(MetadataPageMixin, Page): date = models.DateField(default=now) body = StreamField([ ('heading', blocks.CharBlock(template="blog/block/heading.html")), ('paragraph', blocks.RichTextBlock(template="blog/block/paragraph.html")), ('image', imageblocks.ImageChooserBlock(template="blog/block/image.html")), ('embed', EmbedBlock(template="blog/block/embed.html")), ('code', CodeBlock()), ]) content_panels = Page.content_panels + [ FieldPanel('date'), StreamFieldPanel('body'), ] def get_context(self, request, *args, **kwargs): context = super(BlogPost, self).get_context(request, *args, **kwargs) parent = self.get_parent() context['parent'] = parent return context
class HomePage(Page): # Title title_en = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_de = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_it = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_fr = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_sv = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_sl = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_da = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_uk = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_el = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_ru = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_ka = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_mk = models.CharField(max_length=255, blank=True, verbose_name="Header Title") title_mt = models.CharField(max_length=255, blank=True, verbose_name="Header Title") default_subtitle = ( "Ever wondered how to get young people involved in politics online?" "OPIN, a European toolbox for youth eParticipation projects, shows " "you how.") intro_en = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_de = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_it = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_fr = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_sv = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_sl = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_da = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_uk = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_el = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_ru = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_ka = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_mk = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) intro_mt = models.CharField(max_length=255, blank=True, verbose_name="Subtitle", default=default_subtitle) image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', verbose_name="Header Image", help_text="The Image that is shown on top of the page") videoplayer_url = models.URLField() # Body block_types = [ ('image', image_blocks.ImageChooserBlock(icon="image")), ('info_block', InfoBlock()), ('video_block', VideoBlock()), ('news_block', NewsBlock()), ('rss_feed', RSSImportBlock()), ('column_block', ColumnBlock()), ] body_en = StreamField(block_types, null=True) body_de = StreamField(block_types, null=True, blank=True) body_it = StreamField(block_types, null=True, blank=True) body_fr = StreamField(block_types, null=True, blank=True) body_sv = StreamField(block_types, null=True, blank=True) body_sl = StreamField(block_types, null=True, blank=True) body_da = StreamField(block_types, null=True, blank=True) body_uk = StreamField(block_types, null=True, blank=True) body_el = StreamField(block_types, null=True, blank=True) body_ru = StreamField(block_types, null=True, blank=True) body_ka = StreamField(block_types, null=True, blank=True) body_mk = StreamField(block_types, null=True, blank=True) body_mt = StreamField(block_types, null=True, blank=True) body = TranslatedField('body') translated_title = TranslatedField('title') translated_intro = TranslatedField('intro') class Meta: verbose_name = "Homepage" general_panels = [ edit_handlers.FieldPanel('title', classname='title'), edit_handlers.FieldPanel('slug'), ImageChooserPanel('image'), edit_handlers.FieldPanel('videoplayer_url'), ] content_panels = [ edit_handlers.MultiFieldPanel([ edit_handlers.FieldPanel('title_' + lang_code), edit_handlers.FieldPanel('intro_' + lang_code), edit_handlers.StreamFieldPanel('body_' + lang_code) ], heading=lang, classname="collapsible collapsed") for lang_code, lang in LANGUAGES ] edit_handler = edit_handlers.TabbedInterface([ edit_handlers.ObjectList(content_panels, heading='Content'), edit_handlers.ObjectList(general_panels, heading='General') ]) parent_page_types = [] subpage_types = ['home.SimplePage', 'home.ManualsIndex'] @property def featured_projects(self): return prj_models.Project.objects.featured()
class ImageTextItemBlock(core_blocks.StructBlock): image = image_blocks.ImageChooserBlock() text = core_blocks.TextBlock()
class InlineImageBlock(core_blocks.StructBlock): image = image_blocks.ImageChooserBlock() internal_link = core_blocks.PageChooserBlock(required=False) external_link = core_blocks.URLBlock(required=False) link_text = core_blocks.TextBlock(required=False)
class SimplePage(Page): # Title title_en = models.CharField(max_length=255, blank=True, verbose_name="Title") title_de = models.CharField(max_length=255, blank=True, verbose_name="Title") title_it = models.CharField(max_length=255, blank=True, verbose_name="Title") title_fr = models.CharField(max_length=255, blank=True, verbose_name="Title") title_sv = models.CharField(max_length=255, blank=True, verbose_name="Title") title_sl = models.CharField(max_length=255, blank=True, verbose_name="Title") title_da = models.CharField(max_length=255, blank=True, verbose_name="Title") title_uk = models.CharField(max_length=255, blank=True, verbose_name="Title") title_el = models.CharField(max_length=255, blank=True, verbose_name="Title") title_ru = models.CharField(max_length=255, blank=True, verbose_name="Title") title_ka = models.CharField(max_length=255, blank=True, verbose_name="Title") title_mk = models.CharField(max_length=255, blank=True, verbose_name="Title") title_mt = models.CharField(max_length=255, blank=True, verbose_name="Title") intro_en = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_de = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_it = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_fr = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_sv = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_sl = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_da = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_uk = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_el = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_ru = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_ka = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_mk = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_mt = models.CharField(max_length=255, blank=True, verbose_name="Subtitle") intro_image = models.ForeignKey('wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+') # Body block_types = [ ('heading', core_blocks.CharBlock(classname="full title", icon="title")), ('paragraph', core_blocks.TextBlock(icon="pilcrow")), ('rich_text', core_blocks.RichTextBlock(icon="pilcrow")), ('info_block', InfoBlock()), ('image', image_blocks.ImageChooserBlock(icon="image")), ('wide_image', WideImageBlock(icon="image")), ('images', InlineImagesBlock(icon="image")), ('contact_block', ContactBlock(icon="form")), ('accordion_block', AccordionBlock(icon="collapse-down")), ('image_text_block_list', ImageTextBlockList()), ('rss_feed', RSSImportBlock()), ] body_en = StreamField(block_types, null=True, blank=True, verbose_name="body") body_de = StreamField(block_types, null=True, blank=True, verbose_name="body") body_it = StreamField(block_types, null=True, blank=True, verbose_name="body") body_fr = StreamField(block_types, null=True, blank=True, verbose_name="body") body_sv = StreamField(block_types, null=True, blank=True, verbose_name="body") body_sl = StreamField(block_types, null=True, blank=True, verbose_name="body") body_da = StreamField(block_types, null=True, blank=True, verbose_name="body") body_uk = StreamField(block_types, null=True, blank=True, verbose_name="body") body_el = StreamField(block_types, null=True, blank=True, verbose_name="body") body_ru = StreamField(block_types, null=True, blank=True, verbose_name="body") body_ka = StreamField(block_types, null=True, blank=True, verbose_name="body") body_mk = StreamField(block_types, null=True, blank=True, verbose_name="body") body_mt = StreamField(block_types, null=True, blank=True, verbose_name="body") translated_title = TranslatedField('title') translated_intro = TranslatedField('intro') body = TranslatedField('body') general_panels = [ edit_handlers.FieldPanel('title', classname='title'), edit_handlers.FieldPanel('slug'), ImageChooserPanel('intro_image') ] content_panels = [ edit_handlers.MultiFieldPanel([ edit_handlers.FieldPanel('title_' + lang_code), edit_handlers.FieldPanel('intro_' + lang_code), edit_handlers.StreamFieldPanel('body_' + lang_code) ], heading=lang, classname="collapsible collapsed") for lang_code, lang in LANGUAGES ] edit_handler = edit_handlers.TabbedInterface([ edit_handlers.ObjectList(content_panels, heading='Content'), edit_handlers.ObjectList(general_panels, heading='General') ])
class ManualsIndex(Page): translated_title = TranslatedField('title') title_en = models.CharField(max_length=150, blank=True, verbose_name="Title") title_de = models.CharField(max_length=150, blank=True, verbose_name="Title") title_it = models.CharField(max_length=150, blank=True, verbose_name="Title") title_fr = models.CharField(max_length=150, blank=True, verbose_name="Title") title_sv = models.CharField(max_length=150, blank=True, verbose_name="Title") title_sl = models.CharField(max_length=150, blank=True, verbose_name="Title") title_da = models.CharField(max_length=150, blank=True, verbose_name="Title") title_uk = models.CharField(max_length=150, blank=True, verbose_name="Title") title_el = models.CharField(max_length=150, blank=True, verbose_name="Title") title_ru = models.CharField(max_length=150, blank=True, verbose_name="Title") title_ka = models.CharField(max_length=150, blank=True, verbose_name="Title") title_mk = models.CharField(max_length=150, blank=True, verbose_name="Title") title_mt = models.CharField(max_length=150, blank=True, verbose_name="Title") block_types = [ ('heading', core_blocks.CharBlock(classname="full title", icon="title")), ('paragraph', core_blocks.TextBlock(icon="pilcrow")), ('rich_text', core_blocks.RichTextBlock(icon="pilcrow")), ('info_block', InfoBlock()), ('image', image_blocks.ImageChooserBlock(icon="image")), ('wide_image', WideImageBlock(icon="image")), ('images', InlineImagesBlock(icon="image")), ('image_text_block_list', ImageTextBlockList()), ] body = TranslatedField('body') body_en = StreamField(block_types, null=True, blank=True, verbose_name="body") body_de = StreamField(block_types, null=True, blank=True, verbose_name="body") body_it = StreamField(block_types, null=True, blank=True, verbose_name="body") body_fr = StreamField(block_types, null=True, blank=True, verbose_name="body") body_sv = StreamField(block_types, null=True, blank=True, verbose_name="body") body_sl = StreamField(block_types, null=True, blank=True, verbose_name="body") body_da = StreamField(block_types, null=True, blank=True, verbose_name="body") body_uk = StreamField(block_types, null=True, blank=True, verbose_name="body") body_el = StreamField(block_types, null=True, blank=True, verbose_name="body") body_ru = StreamField(block_types, null=True, blank=True, verbose_name="body") body_ka = StreamField(block_types, null=True, blank=True, verbose_name="body") body_mk = StreamField(block_types, null=True, blank=True, verbose_name="body") body_mt = StreamField(block_types, null=True, blank=True, verbose_name="body") subpage_types = ['home.ManualsSectionPage', 'home.ManualsDetailPage'] content_panels = [ edit_handlers.MultiFieldPanel([ edit_handlers.FieldPanel('title_' + lang_code), ], heading=lang, classname="collapsible collapsed") for lang_code, lang in LANGUAGES ] general_panels = [ edit_handlers.FieldPanel('title', classname='title'), edit_handlers.FieldPanel('slug'), ] edit_handler = edit_handlers.TabbedInterface([ edit_handlers.ObjectList(content_panels, heading='Content'), edit_handlers.ObjectList(general_panels, heading='General') ]) @property def subpages(self): return self.get_children().live().specific()
class ManualsDetailPage(Page): subpage_types = [] parent_page_types = ['home.ManualsSectionPage', 'home.ManualsIndex'] # Title translated_title = TranslatedField('title') title_en = models.CharField(max_length=150, blank=True, verbose_name="Title") title_de = models.CharField(max_length=150, blank=True, verbose_name="Title") title_it = models.CharField(max_length=150, blank=True, verbose_name="Title") title_fr = models.CharField(max_length=150, blank=True, verbose_name="Title") title_sv = models.CharField(max_length=150, blank=True, verbose_name="Title") title_sl = models.CharField(max_length=150, blank=True, verbose_name="Title") title_da = models.CharField(max_length=150, blank=True, verbose_name="Title") title_uk = models.CharField(max_length=150, blank=True, verbose_name="Title") title_el = models.CharField(max_length=150, blank=True, verbose_name="Title") title_ru = models.CharField(max_length=150, blank=True, verbose_name="Title") title_ka = models.CharField(max_length=150, blank=True, verbose_name="Title") title_mk = models.CharField(max_length=150, blank=True, verbose_name="Title") title_mt = models.CharField(max_length=150, blank=True, verbose_name="Title") # Subtitle (Field named description as in ManualsSectionPage) description = TranslatedField('description') description_en = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_de = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_it = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_fr = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_sv = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_sl = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_da = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_uk = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_el = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_ru = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_ka = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_mk = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") description_mt = models.CharField(max_length=260, blank=True, verbose_name="Subtitle") # Body body = TranslatedField('body') block_types = [ ('heading', core_blocks.CharBlock(classname="full title", icon="title")), ('paragraph', core_blocks.TextBlock(icon="pilcrow")), ('rich_text', core_blocks.RichTextBlock(icon="pilcrow")), ('video_block', VideoBlock()), ('image', image_blocks.ImageChooserBlock(icon="image")), ('accordion_block', AccordionBlock(icon="collapse-down")), ] body_en = StreamField(block_types, null=True, blank=True, verbose_name="body") body_de = StreamField(block_types, null=True, blank=True, verbose_name="body") body_it = StreamField(block_types, null=True, blank=True, verbose_name="body") body_fr = StreamField(block_types, null=True, blank=True, verbose_name="body") body_sv = StreamField(block_types, null=True, blank=True, verbose_name="body") body_sl = StreamField(block_types, null=True, blank=True, verbose_name="body") body_da = StreamField(block_types, null=True, blank=True, verbose_name="body") body_uk = StreamField(block_types, null=True, blank=True, verbose_name="body") body_el = StreamField(block_types, null=True, blank=True, verbose_name="body") body_ru = StreamField(block_types, null=True, blank=True, verbose_name="body") body_ka = StreamField(block_types, null=True, blank=True, verbose_name="body") body_mk = StreamField(block_types, null=True, blank=True, verbose_name="body") body_mt = StreamField(block_types, null=True, blank=True, verbose_name="body") content_panels = [ edit_handlers.MultiFieldPanel([ edit_handlers.FieldPanel('title_' + lang_code), edit_handlers.FieldPanel('description_' + lang_code), edit_handlers.StreamFieldPanel('body_' + lang_code), ], heading=lang, classname="collapsible collapsed") for lang_code, lang in LANGUAGES ] image = models.ForeignKey('wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+') colors = ( ('blue', 'Blue'), ('orange', 'Orange'), ('turquoise', 'Turquoise'), ('pink', 'Pink'), ('purple', 'Purple'), ) color = models.CharField(choices=colors, max_length=9, blank=True, default='blue') general_panels = [ edit_handlers.FieldPanel('title', classname='title'), edit_handlers.FieldPanel('slug'), edit_handlers.FieldPanel('color'), ImageChooserPanel('image'), ] edit_handler = edit_handlers.TabbedInterface([ edit_handlers.ObjectList(content_panels, heading='Content'), edit_handlers.ObjectList(general_panels, heading='General') ]) def get_template(self, request, **kwargs): # only render detail page with sidebar if there's a section if self.parent_page.__class__.__name__ == 'ManualsSectionPage': return 'home/manuals_detail_page_sections.html' else: return 'home/manuals_detail_page.html' @property def parent_page(self): return self.get_ancestors().live().specific().last()