# -*- coding: utf-8 -*- from __future__ import unicode_literals import datetime from django.db import models from django.utils import translation from django.conf import settings from modelcluster.fields import ParentalKey from wagtail.core.blocks import StructBlock, CharBlock, URLBlock, RichTextBlock, ListBlock, TextBlock, ChoiceBlock from wagtail.core.models import Page, Orderable from wagtail.core.fields import StreamField, RichTextField from wagtail.admin.edit_handlers import FieldPanel, StreamFieldPanel, InlinePanel, MultiFieldPanel from wagtail.images.blocks import ImageChooserBlock from wagtail.images.edit_handlers import ImageChooserPanel from wagtail.search import index from puput.models import EntryPage, BlogPage from feedler.models import Entry, Stream from itertools import chain from ..util import TranslatedField class InfoBlock(StructBlock): title = CharBlock(required=True) photo = ImageChooserBlock(required=True) summary = RichTextBlock(required=True) action = CharBlock(required=False) url = URLBlock(required=False) class ArticleIndexPage(Page): title_fr = models.CharField(max_length=255, default="") title_en = models.CharField(max_length=255, default="", blank=True) trans_title = TranslatedField( 'title', 'title_fr', 'title_en', ) intro_de = RichTextField(default='', blank=True) intro_fr = RichTextField(default='', blank=True) intro_en = RichTextField(default='', blank=True) trans_intro = TranslatedField( 'intro_de', 'intro_fr', 'intro_en', ) subscribe_label_de = models.CharField("Button Label (de)", default='', blank=True, max_length=250) subscribe_label_fr = models.CharField("Button Label (fr)", default='', blank=True, max_length=250) subscribe_label_en = models.CharField("Button Label (en)", default='', blank=True, max_length=250) subscribe_action = models.URLField("Action", default='', blank=True) trans_subscribe_label = TranslatedField( 'subscribe_label_de', 'subscribe_label_fr', 'subscribe_label_en', ) feed_image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+' ) content_panels = Page.content_panels + [ FieldPanel('intro_de'), FieldPanel('title_fr'), FieldPanel('intro_fr'), FieldPanel('title_en'), FieldPanel('intro_en'), ImageChooserPanel('feed_image'), MultiFieldPanel( [ FieldPanel('subscribe_label_de'), FieldPanel('subscribe_label_fr'), FieldPanel('subscribe_label_en'), FieldPanel('subscribe_action') ], heading="Newsletters", classname="collapsible collapsed" ) ] def get_context(self, request): context = super(ArticleIndexPage, self).get_context(request) articles = ArticlePage.objects.child_of(self).live() context['articles'] = articles subcategories = ArticleIndexPage.objects.child_of(self).live() context['subcategories'] = subcategories return context parent_page_types = [ 'home.ArticleIndexPage', 'home.HomePage' ] subpage_types = [ 'home.ArticlePage', 'home.ArticleIndexPage', 'home.ContactForm', 'wagtailcore.Page' ] class Meta: verbose_name = "Rubrik" class ImageCarouselBlock(StructBlock): image = ImageChooserBlock() caption = TextBlock(required=False) class Meta: icon = 'image' class ArticlePage(Page): title_fr = models.CharField(max_length=255, default="") title_en = models.CharField(max_length=255, default="", blank=True) trans_title = TranslatedField( 'title', 'title_fr', 'title_en', ) intro_de = RichTextField(default='', blank=True) intro_fr = RichTextField(default='', blank=True) intro_en = RichTextField(default='', blank=True) trans_intro = TranslatedField( 'intro_de', 'intro_fr', 'intro_en', ) gallery = StreamField([ ('image', ListBlock(ImageCarouselBlock(), icon="image")), ], blank=True) # documents = StreamField([ # ('documents', ListBlock(DocumentChooserBlock(), icon="document")), # ]) body_de = StreamField([ ('paragraph', RichTextBlock()), ('section', CharBlock(form_classname="full title")), ('info', InfoBlock(icon='help')), ('media', ChoiceBlock(choices=[ ('gallery', 'Image gallery'), ], icon='media')) ], null=True, blank=True) body_fr = StreamField([ ('paragraph', RichTextBlock()), ('section', CharBlock(form_classname="full title")), ('info', InfoBlock(icon='help')), ('media', ChoiceBlock(choices=[ ('gallery', 'Image gallery'), ], icon='media')) ], null=True, blank=True) body_en = StreamField([ ('paragraph', RichTextBlock()), ('section', CharBlock(form_classname="full title")), ('info', InfoBlock(icon='help')), ('media', ChoiceBlock(choices=[ ('gallery', 'Image gallery'), ], icon='media')) ], null=True, blank=True) trans_body = TranslatedField( 'body_de', 'body_fr', 'body_en', ) date = models.DateField("Date", null=True, blank=True) on_homepage = models.BooleanField(default=False, verbose_name="Featured", help_text="Auf der Frontpage anzeigen") feed_image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+' ) search_fields = Page.search_fields + [ index.SearchField('title', partial_match=True, boost=10), index.SearchField('title_fr', partial_match=True, boost=10), index.SearchField('title_en', partial_match=True, boost=10), index.SearchField('body_de', partial_match=True), index.SearchField('body_fr', partial_match=True), index.SearchField('body_en', partial_match=True), index.SearchField('intro_de', partial_match=True), index.SearchField('intro_fr', partial_match=True), index.SearchField('intro_en', partial_match=True), ] content_panels = [ MultiFieldPanel([ FieldPanel('title'), FieldPanel('intro_de'), ], heading="Deutsch", classname="collapsible collapsed"), StreamFieldPanel('body_de'), MultiFieldPanel([ FieldPanel('title_fr'), FieldPanel('intro_fr'), ], heading="Français", classname="collapsible collapsed"), StreamFieldPanel('body_fr'), MultiFieldPanel([ FieldPanel('title_en'), FieldPanel('intro_en'), ], heading="English", classname="collapsible collapsed"), StreamFieldPanel('body_en'), MultiFieldPanel([ ImageChooserPanel('feed_image'), ], heading="Images"), StreamFieldPanel('gallery'), ] promote_panels = [ InlinePanel('related_links', label="Links"), MultiFieldPanel([ FieldPanel('date'), FieldPanel('on_homepage'), ], heading="Veröffentlichung"), MultiFieldPanel(Page.promote_panels, "Einstellungen"), ] parent_page_types = [ 'home.ArticleIndexPage', 'home.HomePage' ] subpage_types = [] class Meta: verbose_name = "Artikel" class ArticleRelatedLink(Orderable): page = ParentalKey(ArticlePage, related_name='related_links') name = models.CharField(max_length=255) url = models.URLField() panels = [ FieldPanel('name'), FieldPanel('url'), ] class HomePage(Page): intro_de = RichTextField(default='') intro_fr = RichTextField(default='') intro_en = RichTextField(default='', blank=True) trans_intro = TranslatedField( 'intro_de', 'intro_fr', 'intro_en', ) body_de = RichTextField(default='', blank=True) body_fr = RichTextField(default='', blank=True) body_en = RichTextField(default='', blank=True) trans_body = TranslatedField( 'body_de', 'body_fr', 'body_en', ) infos_de = StreamField([ ('info', InfoBlock()) ], null=True, blank=True) infos_fr = StreamField([ ('info', InfoBlock()) ], null=True, blank=True) infos_en = StreamField([ ('info', InfoBlock()) ], null=True, blank=True) trans_infos = TranslatedField( 'infos_de', 'infos_fr', 'infos_en', ) content_panels = Page.content_panels + [ MultiFieldPanel([ FieldPanel('intro_de', classname="full"), FieldPanel('body_de', classname="full"), StreamFieldPanel('infos_de'), ], heading="Deutsch", classname="collapsible collapsed"), MultiFieldPanel([ FieldPanel('intro_fr', classname="full"), FieldPanel('body_fr', classname="full"), StreamFieldPanel('infos_fr'), ], heading="Français", classname="collapsible collapsed"), MultiFieldPanel([ FieldPanel('intro_en', classname="full"), FieldPanel('body_en', classname="full"), StreamFieldPanel('infos_en'), ], heading="English", classname="collapsible collapsed"), ] @property def featured(self): # Get list of live pages that are descendants of this page articles = ArticlePage.objects.live().descendant_of(self) articles = articles.filter(on_homepage=True) articles = articles.filter(feed_image__isnull=False) # Order by most recent date first #articles = articles.order_by('-date') return articles[:4] @property def blogentries(self): # Get list of latest news curlang = translation.get_language() if not curlang in ['de', 'fr', 'en', 'it']: curlang = 'de' # Default language parent = BlogPage.objects.filter(slug='news-%s' % curlang) if not parent: return [] posts = EntryPage.objects.live().descendant_of(parent[0]) # Order by most recent date first posts = posts.order_by('-date') return posts[:settings.BLOG_ENTRIES_HOME_PAGE] @property def newsentries(self): # Get the last few news entries for the home page entries = Entry.objects.filter( models.Q(expire_at__isnull=True) | models.Q(expire_at__gt=datetime.datetime.now()) ).all().order_by('-published') # Filter out by current language curlang = translation.get_language() if curlang in ['de']: entries = entries.exclude(lang='fr') else: entries = entries.exclude(lang='de') # TODO: English news? news = events = jobs = [] Stream1 = Stream.objects.filter(title='News') if Stream1: news = entries.filter(stream=Stream1.first()) Stream2 = Stream.objects.filter(title='Events') if Stream2: events = entries.filter(stream=Stream2.first()) Stream3 = Stream.objects.filter(title='Jobs') if Stream3: jobs = entries.filter(stream=Stream3.first()) i = settings.NEWS_ENTRIES_HOME_PAGE return list(chain(news[:i], events[:i], jobs[:i])) def get_context(self, request): # Update template context context = super(HomePage, self).get_context(request) context['featured'] = self.featured context['blogentries'] = self.blogentries context['newsentries'] = self.newsentries context['entryfeeds'] = settings.STREAMS_ON_HOME_PAGE return context parent_page_types = ['wagtailcore.Page'] class Meta: verbose_name = "Frontpage"