gestioCOF/gestioncof/cms/models.py

214 lines
6.9 KiB
Python
Raw Normal View History

2019-01-06 00:17:57 +01:00
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
2017-08-07 23:31:27 +02:00
from django.db import models
from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin, route
2017-08-09 00:07:56 +02:00
from wagtail.wagtailadmin.edit_handlers import FieldPanel, StreamFieldPanel
from wagtail.wagtailcore import blocks
from wagtail.wagtailcore.fields import RichTextField, StreamField
2019-01-06 00:17:57 +01:00
from wagtail.wagtailcore.models import Page
from wagtail.wagtailimages.blocks import ImageChooserBlock
2019-01-06 00:17:57 +01:00
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
2017-08-07 23:31:27 +02:00
# Page pouvant afficher des actualités
2018-04-28 15:59:49 +02:00
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
2019-01-06 00:17:57 +01:00
2017-08-09 00:07:56 +02:00
# Racine du site du COF
class COFRootPage(Page, COFActuIndexMixin):
2017-08-09 00:07:56 +02:00
introduction = RichTextField("Introduction")
content_panels = Page.content_panels + [
FieldPanel('introduction', classname="full"),
]
2019-01-06 00:17:57 +01:00
subpage_types = ['COFActuIndexPage', 'COFPage', 'COFDirectoryPage', 'COFUtilPage']
2019-01-06 00:17:57 +01:00
class Meta:
verbose_name = "Racine site du COF"
verbose_name_plural = "Racines site du COF"
2019-01-06 00:17:57 +01:00
2018-03-21 21:50:57 +01:00
# Block iframe
class IFrameBlock(blocks.StructBlock):
url = blocks.URLBlock("Adresse de la page")
height = blocks.CharBlock("Hauteur (en pixels)")
class Meta:
verbose_name = "Page incluse (iframe, à utiliser avec précaution)"
verbose_name_plural = "Pages incluses (iframes, à utiliser avec précaution)"
template = "cofcms/iframe_block.html"
2019-01-06 00:17:57 +01:00
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()),
2018-03-21 21:50:57 +01:00
('iframe', IFrameBlock()),
2017-08-09 00:07:56 +02:00
])
content_panels = Page.content_panels + [
StreamFieldPanel('body'),
]
2019-01-06 00:17:57 +01:00
subpage_types = ['COFDirectoryPage', 'COFPage']
2017-08-09 00:07:56 +02:00
parent_page_types = ['COFPage', 'COFRootPage']
class Meta:
verbose_name = "Page normale COF"
verbose_name_plural = "Pages normales COF"
2017-08-09 00:07:56 +02:00
2019-01-06 00:17:57 +01:00
2017-08-09 00:07:56 +02:00
# Actualités
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']
2019-01-06 00:17:57 +01: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):
2018-04-28 15:59:49 +02:00
context = super().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
2019-01-06 00:17:57 +01:00
class COFActuPage(RoutablePageMixin, 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(
'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='+'
)
2019-01-06 00:17:57 +01:00
is_event = models.BooleanField("Évènement", default=True, blank=True)
date_start = models.DateTimeField("Date et heure de début")
2019-01-06 00:17:57 +01:00
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
content_panels = Page.content_panels + [
ImageChooserPanel('image'),
FieldPanel('chapo'),
FieldPanel('body', classname="full"),
2018-01-22 21:24:20 +01:00
FieldPanel("is_event"),
FieldPanel("date_start"),
FieldPanel("date_end"),
FieldPanel("all_day"),
]
subpage_types = []
2017-08-09 00:07:56 +02:00
parent_page_types = ['COFActuIndexPage']
class Meta:
2018-01-22 21:24:20 +01:00
verbose_name = "Actualité"
verbose_name_plural = "Actualités"
2019-01-06 00:17:57 +01: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)
2019-01-06 00:17:57 +01:00
content_panels = Page.content_panels + [
FieldPanel('introduction'),
2018-01-28 19:09:35 +01:00
FieldPanel('alphabetique'),
]
subpage_types = ['COFActuPage', 'COFDirectoryEntryPage']
2017-08-09 00:07:56 +02:00
parent_page_types = ['COFRootPage', 'COFPage']
@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")
return entries
class Meta:
verbose_name = "Annuaire (clubs, partenaires, bons plans...)"
verbose_name_plural = "Annuaires"
2019-01-06 00:17:57 +01:00
class COFDirectoryEntryPage(Page):
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-09 00:07:56 +02:00
image = models.ForeignKey(
'wagtailimages.Image', verbose_name="Image",
2017-08-09 00:07:56 +02:00
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 = []
2017-08-09 00:07:56 +02:00
parent_page_types = ['COFDirectoryPage']
class Meta:
verbose_name = "Entrée d'annuaire"
verbose_name_plural = "Entrées d'annuaire"
2019-01-06 00:17:57 +01:00
2018-03-21 21:50:57 +01:00
# Pour le calendrier, ne doit pas être pris par ModelTranslation
class COFUtilPage(RoutablePageMixin, Page):
2019-01-06 00:17:57 +01:00
# Mini calendrier
@route(r'^calendar/(\d+)/(\d+)/$')
def calendar(self, request, year, month):
from .views import raw_calendar_view
return raw_calendar_view(request, int(year), int(month))
2019-01-05 18:50:53 +01:00
"""
ModelTranslation override le système des @route de wagtail, ce qui empêche
COFUtilPage d'être une page traduite pour pouvoir l'utiliser.
Ce qui fait planter `get_absolute_url` pour des problèmes d'héritage des
pages parentes (qui sont, elles, traduites).
Le seul moyen trouvé pour résoudre ce problème est de faire une autre
fonction à qui on fournit request en argument (donc pas un override de
get_absolute_url).
TODO : vérifier si ces problèmes ont été résolus dans les màj de wagtail
et modeltranslation
"""
def debugged_get_url(self, request):
parent = COFRootPage.objects.parent_of(self).live().first()
burl = parent.relative_url(request.site)
return burl + self.slug
2019-01-06 00:17:57 +01:00
class Meta:
verbose_name = "Page utilitaire"
verbose_name_plural = "Pages utilitaires"