kpsul/gestioncof/cms/models.py
2018-01-20 19:33:50 +01:00

227 lines
7.6 KiB
Python

from django.db import models
from wagtail.wagtailcore.models import Page, Orderable
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().descendant_of(self)
events = COFActuEventPage.objects.live().descendant_of(self)
genactus = list(actus) + list(events)
return genactus
# 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', 'COFActuEventPage']
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')
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):
body = RichTextField("Contenu")
date = models.DateField("Date du post")
image = models.ForeignKey(
'wagtailimages.Image', verbose_name="Image à la Une",
null=True, blank=True,
on_delete=models.SET_NULL, related_name='+'
)
content_panels = Page.content_panels + [
FieldPanel('date'),
ImageChooserPanel('image'),
FieldPanel('body', classname="full"),
]
subpage_types = []
parent_page_types = ['COFActuIndexPage']
class Meta:
verbose_name = "Actualité simple"
verbose_name_plural = "Actualités simples"
# Évènements
class COFActuEventPage(Page):
chapo = models.TextField("Description rapide")
body = RichTextField("Description longue")
image = models.ForeignKey(
'wagtailimages.Image', verbose_name="Image à la Une",
null=True, blank=True,
on_delete=models.SET_NULL, related_name='+'
)
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)
is_event = True
content_panels = Page.content_panels + [
ImageChooserPanel('image'),
FieldPanel('chapo'),
FieldPanel('body', classname="full"),
FieldPanel("date_start"),
FieldPanel("date_end"),
FieldPanel("all_day"),
]
subpage_types = []
parent_page_types = ['COFActuIndexPage']
@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 = "Actu liée à un évènement"
verbose_name_plural = "Actus liées à des évènements"
# Annuaires (Clubs, partenaires, bonnes adresses)
class COFDirectoryPage(Page):
introduction = RichTextField("Introduction")
content_panels = Page.content_panels + [
FieldPanel('introduction'),
]
subpage_types = ['COFActuPage', 'COFDirectoryEntryPage']
parent_page_types = ['COFRootPage', 'COFPage']
@property
def entries(self):
entries = COFDirectoryEntryPage.objects.live()\
.descendant_of(self)\
.order_by("title")
return entries
class Meta:
verbose_name = "Annuaire (clubs, partenaires, bons plans...)"
verbose_name_plural = "Annuaires"
class COFDirectoryEntryPage(Page):
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"