from django.db import models from wagtail.wagtailcore.models import Page, Orderable from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from wagtail.wagtailcore.fields import RichTextField, StreamField from wagtail.wagtailcore import blocks from wagtail.wagtailimages.edit_handlers import ImageChooserPanel from wagtail.wagtailimages.blocks import ImageChooserBlock from django.utils.translation import ugettext as _ from wagtail.wagtailadmin.edit_handlers import FieldPanel, StreamFieldPanel from wagtail.wagtailsnippets.models import register_snippet # Page pouvant afficher des actualités class COFActuIndexMixin(): @property def actus(self): actus = COFActuPage.objects.live().order_by('-date_start').descendant_of(self) return actus # Racine du site du COF class COFRootPage(Page, COFActuIndexMixin): introduction = RichTextField("Introduction") content_panels = Page.content_panels + [ FieldPanel('introduction', classname="full"), ] subpage_types = ['COFActuIndexPage', 'COFPage', 'COFDirectoryPage'] class Meta: verbose_name = "Racine site du COF" verbose_name_plural = "Racines site du COF" # Page lambda du site class COFPage(Page): body = StreamField([ ('heading', blocks.CharBlock(classname="full title")), ('paragraph', blocks.RichTextBlock()), ('image', ImageChooserBlock()), ]) content_panels = Page.content_panels + [ StreamFieldPanel('body'), ] subpage_types = ['COFDirectoryPage', 'COFPage'] parent_page_types = ['COFPage', 'COFRootPage'] class Meta: verbose_name = "Page normale COF" verbose_name_plural = "Pages normales COF" # Actualités class COFActuIndexPage(Page, COFActuIndexMixin): subpage_types = ['COFActuPage'] parent_page_types = ['COFRootPage'] class Meta: verbose_name = "Index des actualités" verbose_name_plural = "Indexs des actualités" def get_context(self, request): context = super(COFActuIndexPage, self).get_context(request) actus = COFActuPage.objects.live().descendant_of(self).order_by('-date_end') page = request.GET.get('page') paginator = Paginator(actus, 5) try: actus = paginator.page(page) except PageNotAnInteger: actus = paginator.page(1) except EmptyPage: actus = paginator.page(paginator.num_pages) context['actus'] = actus return context class COFActuPage(Page): chapo = models.TextField("Description rapide", blank=True) body = RichTextField("Contenu") image = models.ForeignKey( 'wagtailimages.Image', verbose_name="Image à la Une", null=True, blank=True, on_delete=models.SET_NULL, related_name='+' ) is_event = models.BooleanField("Évènement", default=True, blank=True) date_start = models.DateTimeField("Date et heure de début") date_end = models.DateTimeField("Date et heure de fin", blank=True, default=None, null=True) all_day = models.BooleanField("Toute la journée", default=False, blank=True) content_panels = Page.content_panels + [ ImageChooserPanel('image'), FieldPanel('chapo'), FieldPanel('body', classname="full"), FieldPanel("is_event"), FieldPanel("date_start"), FieldPanel("date_end"), FieldPanel("all_day"), ] subpage_types = [] parent_page_types = ['COFActuIndexPage'] class Meta: verbose_name = "Actualité simple" verbose_name_plural = "Actualités simples" @property def dates(self): if self.date_end: if self.date_end.date() == self.date_start.date(): if self.all_day: return self.date_start.strftime(_("le %A %d %B %Y")) else: return _("le %s de %s à %s") % \ (self.date_start.strftime("%A %d %B %Y"), self.date_start.strftime(_("%Hh%M")), self.date_end.strftime(_("%Hh%M"))) else: tmpl = "%A %d %B %Y" diff_i = len(tmpl) if self.date_end.year != self.date_start.year: diff_i = len(tmpl) elif self.date_end.month != self.date_start.month: diff_i = len(tmpl) - 3 elif self.date_end.day != self.date_start.day: diff_i = len(tmpl) - 6 common = tmpl[diff_i:] diff = tmpl[:diff_i] if self.all_day: return _("du %s au %s %s") % \ (self.date_start.strftime(diff), self.date_end.strftime(diff), self.date_end.strftime(common)) else: return _("du %s %s à %s au %s à %s") % \ (self.date_start.strftime(diff), self.date_start.strftime(common), self.date_start.strftime("%Hh%M"), self.date_end.strftime(diff), self.date_end.strftime("%Hh%M")) else: if self.all_day: return self.date_start.strftime(_("le %A %d %B %Y")) else: return self.date_start.strftime(_("le %A %d %B %Y à %Hh%M")) class Meta: verbose_name = "Actualité" verbose_name_plural = "Actualités" # Annuaires (Clubs, partenaires, bonnes adresses) class COFDirectoryPage(Page): introduction = RichTextField("Introduction") alphabetique = models.BooleanField("Tri par ordre alphabétique ?", default=True, blank=True) content_panels = Page.content_panels + [ FieldPanel('introduction'), FieldPanel('alphabetique'), ] subpage_types = ['COFActuPage', 'COFDirectoryEntryPage'] parent_page_types = ['COFRootPage', 'COFPage'] @property def entries(self): entries = COFDirectoryEntryPage.objects.live()\ .descendant_of(self) if self.alphabetique: entries = entries.order_by("title") return entries class Meta: verbose_name = "Annuaire (clubs, partenaires, bons plans...)" verbose_name_plural = "Annuaires" class COFDirectoryEntryPage(Page, Orderable): body = RichTextField("Description") links = StreamField([ ('lien', blocks.StructBlock([ ('url', blocks.URLBlock(required=True)), ('texte', blocks.CharBlock()), ])), ('contact', blocks.StructBlock([ ('email', blocks.EmailBlock(required=True)), ('texte', blocks.CharBlock()), ])), ]) image = models.ForeignKey( 'wagtailimages.Image', verbose_name="Image", null=True, blank=True, on_delete=models.SET_NULL, related_name='+' ) content_panels = Page.content_panels + [ ImageChooserPanel('image'), FieldPanel('body', classname="full"), StreamFieldPanel("links"), ] subpage_types = [] parent_page_types = ['COFDirectoryPage'] class Meta: verbose_name = "Éntrée d'annuaire" verbose_name_plural = "Éntrées d'annuaire"