from __future__ import unicode_literals from django.db import models from modelcluster.fields import ParentalKey from modelcluster.models import ClusterableModel from wagtail.wagtailadmin.edit_handlers import ( FieldPanel, FieldRowPanel, InlinePanel, MultiFieldPanel, PageChooserPanel, StreamFieldPanel, ) from wagtail.wagtailcore.fields import RichTextField, StreamField from wagtail.wagtailcore.models import Collection, Page from wagtail.wagtailforms.models import AbstractEmailForm, AbstractFormField from wagtail.wagtailimages.edit_handlers import ImageChooserPanel from wagtail.wagtailsearch import index from wagtail.wagtailsnippets.models import register_snippet from .blocks import BaseStreamBlock @register_snippet class People(ClusterableModel): """ `People` snippets are secondary content objects that do not require their own full webpage to render. """ first_name = models.CharField("First name", max_length=254) last_name = models.CharField("Last name", max_length=254) job_title = models.CharField("Job title", max_length=254) image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+' ) panels = [ FieldPanel('first_name', classname="col6"), FieldPanel('last_name', classname="col6"), FieldPanel('job_title'), ImageChooserPanel('image') ] search_fields = Page.search_fields + [ index.SearchField('first_name'), index.SearchField('last_name'), ] @property def thumb_image(self): # fail silently if there is no profile pic or the rendition file can't # be found. Note @richbrennan worked out how to do this... try: return self.image.get_rendition('fill-50x50').img_tag() except: return '' def __str__(self): return '{} {}'.format(self.first_name, self.last_name) class Meta: verbose_name = 'Person' verbose_name_plural = 'People' @register_snippet class FooterText(models.Model): """ This provides editable text for the site footer """ body = RichTextField() panels = [ FieldPanel('body'), ] def __str__(self): return "Footer text" class Meta: verbose_name_plural = 'Footer Text' class StandardPage(Page): """ A fairly generic site page, to be used for About, etc. """ introduction = models.TextField( help_text='Text to describe the page', blank=True) image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Landscape mode only; horizontal width between 1000px and 3000px.' ) body = StreamField( BaseStreamBlock(), verbose_name="Page body", blank=True ) content_panels = Page.content_panels + [ FieldPanel('introduction', classname="full"), StreamFieldPanel('body'), ImageChooserPanel('image'), ] class HomePage(Page): """ The Home Page """ image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Homepage image' ) hero_text = models.CharField( max_length=255, help_text='Write an introduction for the bakery' ) hero_cta = models.CharField( verbose_name='Hero CTA', max_length=255, help_text='Text to display on Call to Action' ) hero_cta_link = models.ForeignKey( 'wagtailcore.Page', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', verbose_name='Hero CTA link', help_text='Choose a page to link to for the Call to Action' ) body = StreamField( BaseStreamBlock(), verbose_name="Home content block", blank=True ) promo_image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Promo image' ) promo_title = models.CharField( null=True, blank=True, max_length=255, help_text='Title to display above the promo copy' ) promo_text = RichTextField( null=True, blank=True, help_text='Write some promotional copy' ) featured_section_1_title = models.CharField( null=True, blank=True, max_length=255, help_text='Title to display above the promo copy' ) featured_section_1 = models.ForeignKey( 'wagtailcore.Page', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='First featured section for the homepage. Will display up to three child items.', verbose_name='Featured section 1' ) featured_section_2_title = models.CharField( null=True, blank=True, max_length=255, help_text='Title to display above the promo copy' ) featured_section_2 = models.ForeignKey( 'wagtailcore.Page', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Second featured section for the homepage. Will display up to three child items.', verbose_name='Featured section 2' ) featured_section_3_title = models.CharField( null=True, blank=True, max_length=255, help_text='Title to display above the promo copy' ) featured_section_3 = models.ForeignKey( 'wagtailcore.Page', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Third featured section for the homepage. Will display up to six child items.', verbose_name='Featured section 3' ) content_panels = Page.content_panels + [ MultiFieldPanel([ ImageChooserPanel('image'), FieldPanel('hero_text', classname="full"), MultiFieldPanel([ FieldPanel('hero_cta'), PageChooserPanel('hero_cta_link'), ]) ], heading="Hero section"), MultiFieldPanel([ ImageChooserPanel('promo_image'), FieldPanel('promo_title'), FieldPanel('promo_text'), ], heading="Promo section"), StreamFieldPanel('body'), MultiFieldPanel([ MultiFieldPanel([ FieldPanel('featured_section_1_title'), PageChooserPanel('featured_section_1'), ]), MultiFieldPanel([ FieldPanel('featured_section_2_title'), PageChooserPanel('featured_section_2'), ]), MultiFieldPanel([ FieldPanel('featured_section_3_title'), PageChooserPanel('featured_section_3'), ]) ], heading="Featured homepage sections", classname="collapsible") ] def __str__(self): return self.title class GalleryPage(Page): """ This is a page to list locations from the selected Collection """ introduction = models.TextField( help_text='Text to describe the page', blank=True) image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Landscape mode only; horizontal width between 1000px and 3000px.' ) body = StreamField( BaseStreamBlock(), verbose_name="Page body", blank=True ) collection = models.ForeignKey( Collection, limit_choices_to=~models.Q(name__in=['Root']), null=True, blank=True, on_delete=models.SET_NULL, help_text='Select the image collection for this gallery.' ) content_panels = Page.content_panels + [ FieldPanel('introduction', classname="full"), StreamFieldPanel('body'), ImageChooserPanel('image'), FieldPanel('collection'), ] # Defining what content type can sit under the parent. Since it's a blank # array no subpage can be added subpage_types = [] class FormField(AbstractFormField): page = ParentalKey('FormPage', related_name='form_fields') class FormPage(AbstractEmailForm): image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+' ) body = StreamField(BaseStreamBlock()) thank_you_text = RichTextField(blank=True) content_panels = AbstractEmailForm.content_panels + [ ImageChooserPanel('image'), StreamFieldPanel('body'), InlinePanel('form_fields', label="Form fields"), FieldPanel('thank_you_text', classname="full"), MultiFieldPanel([ FieldRowPanel([ FieldPanel('from_address', classname="col6"), FieldPanel('to_address', classname="col6"), ]), FieldPanel('subject'), ], "Email"), ]