2017-08-07 23:31:27 +02:00
|
|
|
from django.db import models
|
|
|
|
|
|
|
|
from wagtail.wagtailcore.models import Page, Orderable
|
|
|
|
|
2018-01-22 21:24:20 +01:00
|
|
|
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
2017-08-07 23:31:27 +02:00
|
|
|
from wagtail.wagtailcore.fields import RichTextField, StreamField
|
|
|
|
from wagtail.wagtailcore import blocks
|
2017-08-09 00:07:56 +02:00
|
|
|
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
|
|
|
|
from wagtail.wagtailimages.blocks import ImageChooserBlock
|
2017-08-26 18:05:20 +02:00
|
|
|
from django.utils.translation import ugettext as _
|
2017-08-07 23:31:27 +02:00
|
|
|
|
2017-08-09 00:07:56 +02:00
|
|
|
from wagtail.wagtailadmin.edit_handlers import FieldPanel, StreamFieldPanel
|
|
|
|
from wagtail.wagtailsnippets.models import register_snippet
|
2017-08-07 23:31:27 +02:00
|
|
|
|
2017-08-19 01:32:26 +02:00
|
|
|
# Page pouvant afficher des actualités
|
|
|
|
class COFActuIndexMixin():
|
|
|
|
@property
|
|
|
|
def actus(self):
|
2018-01-22 21:24:20 +01:00
|
|
|
actus = COFActuPage.objects.live().order_by('-date_start').descendant_of(self)
|
|
|
|
return actus
|
2017-08-19 01:32:26 +02:00
|
|
|
|
2017-08-09 00:07:56 +02:00
|
|
|
# Racine du site du COF
|
2017-08-19 01:32:26 +02:00
|
|
|
class COFRootPage(Page, COFActuIndexMixin):
|
2017-08-09 00:07:56 +02:00
|
|
|
introduction = RichTextField("Introduction")
|
|
|
|
|
|
|
|
content_panels = Page.content_panels + [
|
|
|
|
FieldPanel('introduction', classname="full"),
|
|
|
|
]
|
|
|
|
|
|
|
|
subpage_types = ['COFActuIndexPage', 'COFPage', 'COFDirectoryPage']
|
2017-08-19 01:32:26 +02:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
verbose_name = "Racine site du COF"
|
|
|
|
verbose_name_plural = "Racines site du COF"
|
2017-08-09 00:07:56 +02:00
|
|
|
|
|
|
|
# Page lambda du site
|
2017-08-07 23:31:27 +02:00
|
|
|
class COFPage(Page):
|
2017-08-09 00:07:56 +02:00
|
|
|
body = StreamField([
|
|
|
|
('heading', blocks.CharBlock(classname="full title")),
|
|
|
|
('paragraph', blocks.RichTextBlock()),
|
|
|
|
('image', ImageChooserBlock()),
|
|
|
|
])
|
|
|
|
|
|
|
|
content_panels = Page.content_panels + [
|
|
|
|
StreamFieldPanel('body'),
|
|
|
|
]
|
|
|
|
|
2017-08-19 01:32:26 +02:00
|
|
|
subpage_types = ['COFDirectoryPage', 'COFPage']
|
2017-08-09 00:07:56 +02:00
|
|
|
parent_page_types = ['COFPage', 'COFRootPage']
|
|
|
|
|
2017-08-19 01:32:26 +02:00
|
|
|
class Meta:
|
|
|
|
verbose_name = "Page normale COF"
|
|
|
|
verbose_name_plural = "Pages normales COF"
|
2017-08-09 00:07:56 +02:00
|
|
|
|
|
|
|
# Actualités
|
2017-08-19 01:32:26 +02:00
|
|
|
class COFActuIndexPage(Page, COFActuIndexMixin):
|
2018-01-22 21:24:20 +01:00
|
|
|
subpage_types = ['COFActuPage']
|
2017-08-09 00:07:56 +02:00
|
|
|
parent_page_types = ['COFRootPage']
|
2017-08-19 01:32:26 +02:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
verbose_name = "Index des actualités"
|
|
|
|
verbose_name_plural = "Indexs des actualités"
|
2017-08-09 00:07:56 +02:00
|
|
|
|
2018-01-20 19:33:50 +01:00
|
|
|
def get_context(self, request):
|
|
|
|
context = super(COFActuIndexPage, self).get_context(request)
|
2018-01-22 21:24:20 +01:00
|
|
|
actus = COFActuPage.objects.live().descendant_of(self).order_by('-date_end')
|
2018-01-20 19:33:50 +01:00
|
|
|
|
|
|
|
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
|
|
|
|
|
2017-08-09 00:07:56 +02:00
|
|
|
class COFActuPage(Page):
|
2018-01-22 21:24:20 +01:00
|
|
|
chapo = models.TextField("Description rapide", blank=True)
|
2017-08-09 00:07:56 +02:00
|
|
|
body = RichTextField("Contenu")
|
|
|
|
image = models.ForeignKey(
|
2017-08-19 01:32:26 +02:00
|
|
|
'wagtailimages.Image', verbose_name="Image à la Une",
|
2017-08-09 00:07:56 +02:00
|
|
|
null=True, blank=True,
|
|
|
|
on_delete=models.SET_NULL, related_name='+'
|
|
|
|
)
|
2018-01-22 21:24:20 +01:00
|
|
|
is_event = models.BooleanField("Évènement", default=True, blank=True)
|
2017-08-19 01:32:26 +02:00
|
|
|
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)
|
2018-01-22 21:24:20 +01:00
|
|
|
|
2017-08-09 00:07:56 +02:00
|
|
|
|
2017-08-19 01:32:26 +02:00
|
|
|
content_panels = Page.content_panels + [
|
|
|
|
ImageChooserPanel('image'),
|
|
|
|
FieldPanel('chapo'),
|
|
|
|
FieldPanel('body', classname="full"),
|
2018-01-22 21:24:20 +01:00
|
|
|
FieldPanel("is_event"),
|
2017-08-19 01:32:26 +02:00
|
|
|
FieldPanel("date_start"),
|
|
|
|
FieldPanel("date_end"),
|
|
|
|
FieldPanel("all_day"),
|
|
|
|
]
|
|
|
|
|
|
|
|
subpage_types = []
|
2017-08-09 00:07:56 +02:00
|
|
|
parent_page_types = ['COFActuIndexPage']
|
2017-08-22 00:58:18 +02:00
|
|
|
|
2018-01-22 21:24:20 +01:00
|
|
|
class Meta:
|
|
|
|
verbose_name = "Actualité simple"
|
|
|
|
verbose_name_plural = "Actualités simples"
|
|
|
|
|
2017-08-22 00:58:18 +02:00
|
|
|
@property
|
|
|
|
def dates(self):
|
|
|
|
if self.date_end:
|
|
|
|
if self.date_end.date() == self.date_start.date():
|
|
|
|
if self.all_day:
|
2017-08-26 18:05:20 +02:00
|
|
|
return self.date_start.strftime(_("le %A %d %B %Y"))
|
2017-08-22 00:58:18 +02:00
|
|
|
else:
|
2017-08-26 18:05:20 +02:00
|
|
|
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")))
|
2017-08-22 00:58:18 +02:00
|
|
|
else:
|
2017-08-26 18:05:20 +02:00
|
|
|
tmpl = "%A %d %B %Y"
|
2017-08-22 00:58:18 +02:00
|
|
|
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
|
2018-01-22 21:24:20 +01:00
|
|
|
common = tmpl[diff_i:]
|
|
|
|
diff = tmpl[:diff_i]
|
2017-08-22 00:58:18 +02:00
|
|
|
if self.all_day:
|
2017-08-26 18:05:20 +02:00
|
|
|
return _("du %s au %s %s") % \
|
|
|
|
(self.date_start.strftime(diff),
|
|
|
|
self.date_end.strftime(diff),
|
|
|
|
self.date_end.strftime(common))
|
2017-08-22 00:58:18 +02:00
|
|
|
else:
|
2017-08-26 18:05:20 +02:00
|
|
|
return _("du %s %s à %s au %s à %s") % \
|
2017-08-22 00:58:18 +02:00
|
|
|
(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:
|
2017-08-26 18:05:20 +02:00
|
|
|
return self.date_start.strftime(_("le %A %d %B %Y"))
|
2017-08-22 00:58:18 +02:00
|
|
|
else:
|
2017-08-26 18:05:20 +02:00
|
|
|
return self.date_start.strftime(_("le %A %d %B %Y à %Hh%M"))
|
2017-08-19 01:32:26 +02:00
|
|
|
class Meta:
|
2018-01-22 21:24:20 +01:00
|
|
|
verbose_name = "Actualité"
|
|
|
|
verbose_name_plural = "Actualités"
|
2017-08-20 00:39:19 +02:00
|
|
|
|
2017-08-09 00:07:56 +02:00
|
|
|
# Annuaires (Clubs, partenaires, bonnes adresses)
|
|
|
|
class COFDirectoryPage(Page):
|
|
|
|
introduction = RichTextField("Introduction")
|
2018-01-28 19:09:35 +01:00
|
|
|
alphabetique = models.BooleanField("Tri par ordre alphabétique ?",
|
|
|
|
default=True, blank=True)
|
|
|
|
|
2017-08-19 01:32:26 +02:00
|
|
|
content_panels = Page.content_panels + [
|
|
|
|
FieldPanel('introduction'),
|
2018-01-28 19:09:35 +01:00
|
|
|
FieldPanel('alphabetique'),
|
2017-08-19 01:32:26 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
subpage_types = ['COFActuPage', 'COFDirectoryEntryPage']
|
2017-08-09 00:07:56 +02:00
|
|
|
parent_page_types = ['COFRootPage', 'COFPage']
|
|
|
|
|
2017-08-19 01:32:26 +02:00
|
|
|
@property
|
|
|
|
def entries(self):
|
2017-08-26 18:05:20 +02:00
|
|
|
entries = COFDirectoryEntryPage.objects.live()\
|
2018-01-28 19:09:35 +01:00
|
|
|
.descendant_of(self)
|
|
|
|
if self.alphabetique:
|
|
|
|
entries = entries.order_by("title")
|
2017-08-19 01:32:26 +02:00
|
|
|
return entries
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
verbose_name = "Annuaire (clubs, partenaires, bons plans...)"
|
|
|
|
verbose_name_plural = "Annuaires"
|
|
|
|
|
|
|
|
|
2018-01-28 19:09:35 +01:00
|
|
|
class COFDirectoryEntryPage(Page, Orderable):
|
2017-08-09 00:07:56 +02:00
|
|
|
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()),
|
|
|
|
])),
|
|
|
|
])
|
2017-08-19 01:32:26 +02:00
|
|
|
|
2017-08-09 00:07:56 +02:00
|
|
|
image = models.ForeignKey(
|
2017-08-19 01:32:26 +02:00
|
|
|
'wagtailimages.Image', verbose_name="Image",
|
2017-08-09 00:07:56 +02:00
|
|
|
null=True, blank=True,
|
|
|
|
on_delete=models.SET_NULL, related_name='+'
|
|
|
|
)
|
|
|
|
|
2017-08-19 01:32:26 +02:00
|
|
|
content_panels = Page.content_panels + [
|
|
|
|
ImageChooserPanel('image'),
|
|
|
|
FieldPanel('body', classname="full"),
|
|
|
|
StreamFieldPanel("links"),
|
|
|
|
]
|
|
|
|
|
|
|
|
subpage_types = []
|
2017-08-09 00:07:56 +02:00
|
|
|
parent_page_types = ['COFDirectoryPage']
|
|
|
|
|
2017-08-19 01:32:26 +02:00
|
|
|
class Meta:
|
|
|
|
verbose_name = "Éntrée d'annuaire"
|
|
|
|
verbose_name_plural = "Éntrées d'annuaire"
|