mirror of
https://github.com/Hopiu/wagtail.git
synced 2026-05-11 08:43:10 +00:00
198 lines
5.3 KiB
Python
198 lines
5.3 KiB
Python
from django.db import models
|
|
from modelcluster.fields import ParentalKey
|
|
from wagtail.wagtailcore.models import Page, Orderable
|
|
from wagtail.wagtailcore.fields import RichTextField
|
|
from wagtail.wagtailadmin.edit_handlers import FieldPanel, MultiFieldPanel, InlinePanel, PageChooserPanel
|
|
from wagtail.wagtailimages.edit_handlers import ImageChooserPanel
|
|
from wagtail.wagtaildocs.edit_handlers import DocumentChooserPanel
|
|
|
|
|
|
EVENT_AUDIENCE_CHOICES = (
|
|
('public', "Public"),
|
|
('private', "Private"),
|
|
)
|
|
|
|
|
|
COMMON_PANELS = (
|
|
FieldPanel('slug'),
|
|
FieldPanel('seo_title'),
|
|
FieldPanel('show_in_menus'),
|
|
FieldPanel('search_description'),
|
|
)
|
|
|
|
|
|
# Link fields
|
|
|
|
class LinkFields(models.Model):
|
|
link_external = models.URLField("External link", blank=True)
|
|
link_page = models.ForeignKey(
|
|
'wagtailcore.Page',
|
|
null=True,
|
|
blank=True,
|
|
related_name='+'
|
|
)
|
|
link_document = models.ForeignKey(
|
|
'wagtaildocs.Document',
|
|
null=True,
|
|
blank=True,
|
|
related_name='+'
|
|
)
|
|
|
|
@property
|
|
def link(self):
|
|
if self.link_page:
|
|
return self.link_page.url
|
|
elif self.link_document:
|
|
return self.link_document.url
|
|
else:
|
|
return self.link_external
|
|
|
|
panels = [
|
|
FieldPanel('link_external'),
|
|
PageChooserPanel('link_page'),
|
|
DocumentChooserPanel('link_document'),
|
|
]
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
|
|
# Carousel items
|
|
|
|
class CarouselItem(LinkFields):
|
|
image = models.ForeignKey(
|
|
'wagtailimages.Image',
|
|
null=True,
|
|
blank=True,
|
|
on_delete=models.SET_NULL,
|
|
related_name='+'
|
|
)
|
|
embed_url = models.URLField("Embed URL", blank=True)
|
|
caption = models.CharField(max_length=255, blank=True)
|
|
|
|
panels = [
|
|
ImageChooserPanel('image'),
|
|
FieldPanel('embed_url'),
|
|
FieldPanel('caption'),
|
|
MultiFieldPanel(LinkFields.panels, "Link"),
|
|
]
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
|
|
# Related links
|
|
|
|
class RelatedLink(LinkFields):
|
|
title = models.CharField(max_length=255, help_text="Link title")
|
|
|
|
panels = [
|
|
FieldPanel('title'),
|
|
MultiFieldPanel(LinkFields.panels, "Link"),
|
|
]
|
|
|
|
class Meta:
|
|
abstract = True
|
|
|
|
|
|
# Simple page
|
|
class SimplePage(Page):
|
|
content = models.TextField()
|
|
|
|
|
|
# Event page
|
|
|
|
class EventPageCarouselItem(Orderable, CarouselItem):
|
|
page = ParentalKey('tests.EventPage', related_name='carousel_items')
|
|
|
|
|
|
class EventPageRelatedLink(Orderable, RelatedLink):
|
|
page = ParentalKey('tests.EventPage', related_name='related_links')
|
|
|
|
|
|
class EventPageSpeaker(Orderable, LinkFields):
|
|
page = ParentalKey('tests.EventPage', related_name='speakers')
|
|
first_name = models.CharField("Name", max_length=255, blank=True)
|
|
last_name = models.CharField("Surname", max_length=255, blank=True)
|
|
image = models.ForeignKey(
|
|
'wagtailimages.Image',
|
|
null=True,
|
|
blank=True,
|
|
on_delete=models.SET_NULL,
|
|
related_name='+'
|
|
)
|
|
|
|
@property
|
|
def name_display(self):
|
|
return self.first_name + " " + self.last_name
|
|
|
|
panels = [
|
|
FieldPanel('first_name'),
|
|
FieldPanel('last_name'),
|
|
ImageChooserPanel('image'),
|
|
MultiFieldPanel(LinkFields.panels, "Link"),
|
|
]
|
|
|
|
|
|
class EventPage(Page):
|
|
date_from = models.DateField("Start date", null=True)
|
|
date_to = models.DateField(
|
|
"End date",
|
|
null=True,
|
|
blank=True,
|
|
help_text="Not required if event is on a single day"
|
|
)
|
|
time_from = models.TimeField("Start time", null=True, blank=True)
|
|
time_to = models.TimeField("End time", null=True, blank=True)
|
|
audience = models.CharField(max_length=255, choices=EVENT_AUDIENCE_CHOICES)
|
|
location = models.CharField(max_length=255)
|
|
body = RichTextField(blank=True)
|
|
cost = models.CharField(max_length=255)
|
|
signup_link = models.URLField(blank=True)
|
|
feed_image = models.ForeignKey(
|
|
'wagtailimages.Image',
|
|
null=True,
|
|
blank=True,
|
|
on_delete=models.SET_NULL,
|
|
related_name='+'
|
|
)
|
|
|
|
indexed_fields = ('get_audience_display', 'location', 'body')
|
|
search_name = "Event"
|
|
|
|
EventPage.content_panels = [
|
|
FieldPanel('title', classname="full title"),
|
|
FieldPanel('date_from'),
|
|
FieldPanel('date_to'),
|
|
FieldPanel('time_from'),
|
|
FieldPanel('time_to'),
|
|
FieldPanel('location'),
|
|
FieldPanel('audience'),
|
|
FieldPanel('cost'),
|
|
FieldPanel('signup_link'),
|
|
InlinePanel(EventPage, 'carousel_items', label="Carousel items"),
|
|
FieldPanel('body', classname="full"),
|
|
InlinePanel(EventPage, 'speakers', label="Speakers"),
|
|
InlinePanel(EventPage, 'related_links', label="Related links"),
|
|
]
|
|
|
|
EventPage.promote_panels = [
|
|
MultiFieldPanel(COMMON_PANELS, "Common page configuration"),
|
|
ImageChooserPanel('feed_image'),
|
|
]
|
|
|
|
|
|
# Event index (has a separate AJAX template, and a custom template context)
|
|
class EventIndex(Page):
|
|
intro = RichTextField(blank=True)
|
|
ajax_template = 'tests/includes/event_listing.html'
|
|
|
|
def get_context(self, request):
|
|
context = super(EventIndex, self).get_context(request)
|
|
context['events'] = EventPage.objects.filter(live=True)
|
|
return context
|
|
|
|
EventIndex.content_panels = [
|
|
FieldPanel('title', classname="full title"),
|
|
FieldPanel('intro', classname="full"),
|
|
]
|