django_airavata/wagtailapps/base/models.py (704 lines of code) (raw):

from __future__ import unicode_literals import os from django.db import models from modelcluster.fields import ParentalKey from modelcluster.models import ClusterableModel from wagtail.admin.edit_handlers import ( FieldPanel, InlinePanel, MultiFieldPanel, ObjectList, PageChooserPanel, StreamFieldPanel, TabbedInterface ) from wagtail.core.fields import RichTextField, StreamField from wagtail.core.models import Orderable, Page from wagtail.images.edit_handlers import ImageChooserPanel from wagtail.snippets.models import register_snippet from .blocks import BaseStreamBlock, ContainerChoiceBlock, CssStreamBlock, Nav @register_snippet class Announcements(models.Model): """ This provides editable text for the site announcements. Again it uses the decorator `register_snippet` to allow it to be accessible via the admin. It is made accessible on the template via a template tag defined in base/templatetags/ navigation_tags.py """ announcement_text = models.CharField( max_length=255, help_text='Provide an announcement text', default='Announcement Text' ) announcement_link = models.CharField( max_length=255, help_text='Give a redirect link for announcement', default='Announcement Link' ) panels = [ FieldPanel('announcement_text'), FieldPanel('announcement_link'), ] def __str__(self): return "Announcement" class Meta: verbose_name_plural = 'Announcement' @register_snippet class NavExtra(models.Model): """ This provides editable text for the site extra navbar which comes below the main navbar. Again it uses the decorator `register_snippet` to allow it to be accessible via the admin. It is made accessible on the template via a template tag defined in base/templatetags/navigation_tags.py """ nav = StreamField([ ('nav', Nav(max_num=1)), ]) panels = [ StreamFieldPanel('nav'), ] def __str__(self): return "Nav extra" class Meta: verbose_name_plural = 'Nav extra' @register_snippet class CustomCss(models.Model): """ Custom CSS """ css = StreamField( CssStreamBlock(), verbose_name="CSS block", blank=True, null=True, help_text="Write custom css and give comments as necessary", default="") panels = [ StreamFieldPanel('css'), ] def __str__(self): return "Custom Css" class Meta: verbose_name_plural = 'Custom CSS' @register_snippet class FooterText(models.Model): """ This provides editable text for the site footer. Again it uses the decorator `register_snippet` to allow it to be accessible via the admin. It is made accessible on the template via a template tag defined in base/templatetags/ navigation_tags.py """ footer = StreamField( BaseStreamBlock(), verbose_name="Footer content block", blank=True, null=True) panels = [ StreamFieldPanel('footer'), ] def __str__(self): return "Footer" class Meta: verbose_name_plural = 'Footer' @register_snippet class Navbar(models.Model): """ This provides editable text for the site header title. Again it uses the decorator `register_snippet` to allow it to be accessible via the admin. It is made accessible on the template via a template tag defined in base/templatetags/ navigation_tags.py """ logo = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Brand Logo' ) logo_redirect_link = models.CharField( max_length=255, help_text='Provide a redirection link for the logo or logo text Eg. (https://www.google.com/)', null=True, blank=True, default='#', ) boolean_choices = ( ("yes", "Yes"), ("no", "No") ) logo_with_text = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want to display the text next to the logo", default="no") logo_width = models.IntegerField( help_text='Provide a width for the logo', null=True, blank=True, default='144', ) logo_height = models.IntegerField( help_text='Provide a height for the logo', null=True, blank=True, default='43' ) logo_text = models.CharField( max_length=255, help_text='Give a title text as an alternative to logo. Eg.(SEAGRID)', null=True, blank=True, ) logo_text_color = models.CharField( max_length=100, help_text='Give a color for logo text if you have a logo text Eg.(#FFFFFF)', null=True, blank=True, ) logo_text_size = models.IntegerField( help_text='Give a text size as number of pixels Eg.(30)', null=True, blank=True, ) panels = [ ImageChooserPanel('logo'), FieldPanel('logo_redirect_link'), FieldPanel('logo_width'), FieldPanel('logo_height'), FieldPanel('logo_text'), FieldPanel('logo_with_text'), FieldPanel('logo_text_size'), FieldPanel('logo_text_color'), ] def __str__(self): return "Navbar" class Meta: verbose_name_plural = 'Navbar' @register_snippet class CustomHeaderLinks(models.Model): """ This provides feasibility for custom links inside header. Otherwise headerlinks are generated dynamically when a new page is created. The sublinks are restricted to 4 per link """ header_link_text = models.CharField( max_length=25, help_text='Give a Link text', ) header_link = models.CharField( max_length=255, help_text='Provide a redirect Link', null=True, blank=True, ) header_sub_link_text1 = models.CharField( max_length=25, help_text='Give a Sub Link 1 text', null=True, blank=True, ) header_sub_link_text2 = models.CharField( max_length=25, help_text='Give a Sub Link 2 text', null=True, blank=True, ) header_sub_link_text3 = models.CharField( max_length=25, help_text='Give a Sub Link 3 text', null=True, blank=True, ) header_sub_link_text4 = models.CharField( max_length=25, help_text='Give a Sub Link 4 text', null=True, blank=True, ) header_sub_link1 = models.CharField( max_length=255, help_text='Provide a redirect Link for sublink 1', null=True, blank=True, ) header_sub_link2 = models.CharField( max_length=255, help_text='Provide a redirect Link for sublink 2', null=True, blank=True, ) header_sub_link3 = models.CharField( max_length=255, help_text='Provide a redirect Link for sublink 3', null=True, blank=True, ) header_sub_link4 = models.CharField( max_length=255, help_text='Provide a redirect Link for sublink 4', null=True, blank=True, ) body = models.CharField( max_length=255, help_text='Give a title text', null=True, blank=True, ) panels = [ FieldPanel('header_link_text'), FieldPanel('header_link'), MultiFieldPanel([ MultiFieldPanel([ FieldPanel('header_sub_link_text1'), FieldPanel('header_sub_link1'), ]), MultiFieldPanel([ FieldPanel('header_sub_link_text2'), FieldPanel('header_sub_link2'), ]), MultiFieldPanel([ FieldPanel('header_sub_link_text3'), FieldPanel('header_sub_link3'), ]), MultiFieldPanel([ FieldPanel('header_sub_link_text4'), FieldPanel('header_sub_link4'), ]) ], heading="Sub Links section", classname="collapsible"), ] def __str__(self): return "Header Custom Links" class Meta: verbose_name_plural = 'Header Custom Links' @register_snippet class GatewayIcon(models.Model): """ Image icon displayed in the header for logged in users. """ icon = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Choose Gateway Icon with dimensions 70x70' ) background_color = models.CharField( max_length=10, default="#EEEEEE", help_text='Background color for icon (e.g. #FFFFFF)', ) panels = [ ImageChooserPanel('icon'), FieldPanel('background_color'), ] def __str__(self): return "Gateway Icon" class Meta: verbose_name_plural = 'Gateway Icon' @register_snippet class GatewayTitle(models.Model): """ Title displayed in the header for logged in users. """ title_text = models.CharField( max_length=100, help_text='Title to display to logged in users.', ) panels = [ FieldPanel('title_text'), ] def __str__(self): return "Gateway Title: {}".format(self.title_text) class Meta: verbose_name_plural = 'Gateway Title' @register_snippet class ExtraWebResources(ClusterableModel): """ Links to CSS and JavaScript to be included in all pages. """ panels = [ InlinePanel('css_links', label="CSS Links"), InlinePanel('js_links', label="JS Links"), ] def __str__(self): try: return "Extra Web Resources: {}".format(", ".join( [os.path.basename(link.url) for link in self.css_links.all()] + [os.path.basename(link.url) for link in self.js_links.all()])) except Exception: return "Extra Web Resources" class Meta: verbose_name_plural = 'Extra Web Resources' class CssLink(Orderable): url = models.CharField( max_length=255, help_text='URL of CSS stylesheet.' ) panels = [ FieldPanel('url'), ] extra_web_resources = ParentalKey(ExtraWebResources, on_delete=models.CASCADE, related_name="css_links") class Meta: verbose_name = 'CSS Link' class JsLink(Orderable): url = models.CharField( max_length=255, help_text='URL of JavaScript script.' ) panels = [ FieldPanel('url'), ] extra_web_resources = ParentalKey(ExtraWebResources, on_delete=models.CASCADE, related_name="js_links") class Meta: verbose_name = 'JS Link' class HomePage(Page): """ The Home Page. This looks slightly more complicated than it is. You can see if you visit your site and edit the homepage that it is split between a: - Hero area - Body area - A promotional area - Moveable featured site sections """ # Hero section of HomePage 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', null=True, blank=True, ) hero_cta = models.CharField( verbose_name='Hero CTA', max_length=255, help_text='Text to display on Call to Action', null=True, blank=True, ) 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 section of the HomePage body = StreamField( BaseStreamBlock(), verbose_name="Home content block", blank=True, null=True) # Promo section of the HomePage site_logo = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Site Logo' ) features_text = RichTextField( null=True, blank=True, help_text='Write some feature description' ) feature_logo_1 = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Feature Logo 1' ) feature_1_title = models.CharField( max_length=255, help_text='Feature Title 1' ) feature_1_text = RichTextField( null=True, blank=True, help_text='Write some feature 1 text description' ) feature_logo_2 = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Feature Logo 2' ) feature_2_title = models.CharField( max_length=255, help_text='Feature Title 2' ) feature_2_text = RichTextField( null=True, blank=True, help_text='Write some feature 2 text description' ) feature_logo_3 = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Feature Logo 3' ) feature_3_title = models.CharField( max_length=255, help_text='Feature Title 3' ) feature_3_text = RichTextField( null=True, blank=True, help_text='Write some feature 3 text description' ) feature_logo_4 = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Feature Logo 4' ) feature_4_title = models.CharField( max_length=255, help_text='Feature Title 4' ) feature_4_text = RichTextField( null=True, blank=True, help_text='Write some feature 4 text description' ) custom_body_message = RichTextField( null=True, blank=True, help_text='Write some custom body message!' ) banner_image = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Choose Banner Image' ) boolean_choices = ( ("yes", "Yes"), ("no", "No") ) show_navbar = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want to display the navbar on home page and no if you don't want to.", default=True) show_nav_extra = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want the secondary navbar to show on home page or no if you don't want to", default=True) show_footer = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want the Footer to show on home page or no if you don't want to", default="yes") content_panels = Page.content_panels + [ MultiFieldPanel([ ImageChooserPanel('image'), FieldPanel('hero_text', classname="full"), MultiFieldPanel([ FieldPanel('hero_cta'), PageChooserPanel('hero_cta_link'), ]) ], heading="Hero section"), StreamFieldPanel('body'), MultiFieldPanel([ ImageChooserPanel('site_logo'), FieldPanel('features_text'), MultiFieldPanel([ ImageChooserPanel('feature_logo_1'), FieldPanel('feature_1_title'), FieldPanel('feature_1_text'), ]), MultiFieldPanel([ ImageChooserPanel('feature_logo_2'), FieldPanel('feature_2_title'), FieldPanel('feature_2_text'), ]), MultiFieldPanel([ ImageChooserPanel('feature_logo_3'), FieldPanel('feature_3_title'), FieldPanel('feature_3_text'), ]), MultiFieldPanel([ ImageChooserPanel('feature_logo_4'), FieldPanel('feature_4_title'), FieldPanel('feature_4_text'), ]) ], heading="Feature section", classname="collapsible"), FieldPanel('custom_body_message'), ImageChooserPanel('banner_image') ] customization_panels = [ FieldPanel('show_navbar'), FieldPanel('show_nav_extra'), FieldPanel('show_footer') ] edit_handler = TabbedInterface([ ObjectList(content_panels, heading='Content'), ObjectList(customization_panels, heading='Customization'), ObjectList(Page.promote_panels, heading='Promote'), ObjectList(Page.settings_panels, heading='Settings', classname="settings"), ]) def __str__(self): return self.title class Row(models.Model): body = StreamField( BaseStreamBlock(), verbose_name="Row Content", blank=True, null=True ) panels = [ StreamFieldPanel('body'), ] class Meta: abstract = True class BootstrapRow(Row): container = StreamField( ContainerChoiceBlock(), null=True, blank=True, help_text="(Optional) Create a new Bootstrap container for this " "and following rows.") body = StreamField( BaseStreamBlock(), verbose_name="Row Content", blank=True, null=True ) panels = [ StreamFieldPanel('container'), StreamFieldPanel('body'), ] class Meta: abstract = True class RowBlankPageRelation(Orderable, BootstrapRow): page = ParentalKey('django_airavata_wagtail_base.BlankPage', on_delete=models.CASCADE, related_name='row') class BlankPage(Page): """ The Blank Template Page. You can see if you visit your site and edit the blank page. Used to create free form content """ boolean_choices = ( ("yes", "Yes"), ("no", "No") ) show_navbar = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want to display the navbar on home page and no if you don't want to.", default="yes") show_nav_extra = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want the secondary navbar to show on home page or no if you don't want to", default="yes") show_footer = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want the Footer to show on home page or no if you don't want to", default="yes") show_announcements = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want the Announcements to show up on home page or no if you don't want to", default="yes") content_panels = Page.content_panels + [ InlinePanel("row", label="row") ] customization_panels = [ FieldPanel('show_navbar'), FieldPanel('show_nav_extra'), FieldPanel('show_footer'), FieldPanel('show_announcements') ] edit_handler = TabbedInterface([ ObjectList(content_panels, heading='Content'), ObjectList(customization_panels, heading='Customization'), ObjectList(Page.promote_panels, heading='Promote'), ObjectList(Page.settings_panels, heading='Settings', classname="settings"), ]) def __str__(self): return self.title class RowCybergatewayHomePageRelation(Orderable, Row): page = ParentalKey('django_airavata_wagtail_base.CybergatewayHomePage', on_delete=models.CASCADE, related_name='row') class CybergatewayHomePage(Page): """ The Cybergateway themed template Page """ # Hero section of HomePage site_logo = models.ForeignKey( 'wagtailimages.Image', null=True, blank=True, on_delete=models.SET_NULL, related_name='+', help_text='Site Logo Image' ) site_link = models.CharField( max_length=255, default="#", help_text='Give a site redirect link', ) site_text = models.CharField( max_length=50, default="#", help_text='Give a Site Name', ) site_header = models.CharField( max_length=70, default="#", help_text='Give a Site Header Name', ) site_link1 = models.CharField( max_length=70, default="#", help_text='Give a Site Nav Link [1]', ) site_link_text1 = models.CharField( max_length=70, help_text='Give a Site Nav Link Text [1]', ) site_link2 = models.CharField( max_length=70, default='#', help_text='Give a Site Nav Link [2]', ) site_link_text2 = models.CharField( max_length=70, help_text='Give a Site Nav Link Text [2]', ) site_link3 = models.CharField( max_length=70, default="#", help_text='Give a Site Nav Link [3]', ) site_link_text3 = models.CharField( max_length=70, help_text='Give a Site Nav Link Text [3]', ) contact = StreamField( BaseStreamBlock(), verbose_name="Contact Info Block", blank=True, null=True) footer = StreamField( BaseStreamBlock(), verbose_name="Footer Content Block", blank=True, null=True) boolean_choices = ( ("yes", "Yes"), ("no", "No") ) show_navbar = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want to display the navbar on home page and no if you don't want to.", default="yes") show_nav_extra = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want the secondary navbar to show on home page or no if you don't want to", default="yes") show_footer = models.CharField( choices=boolean_choices, max_length=5, help_text="Choose yes if you want the Footer to show on home page or no if you don't want to", default="yes") content_panels = Page.content_panels + [ MultiFieldPanel([ ImageChooserPanel('site_logo'), FieldPanel('site_link'), FieldPanel('site_text'), FieldPanel('site_header'), FieldPanel('site_link1'), FieldPanel('site_link_text1'), FieldPanel('site_link2'), FieldPanel('site_link_text2'), FieldPanel('site_link3'), FieldPanel('site_link_text3'), ], heading="Navbar Section"), InlinePanel("row", label="row"), StreamFieldPanel('contact'), StreamFieldPanel('footer'), ] customization_panels = [ FieldPanel('show_navbar'), FieldPanel('show_nav_extra'), FieldPanel('show_footer'), ] edit_handler = TabbedInterface([ ObjectList(content_panels, heading='Content'), ObjectList(customization_panels, heading='Customization'), ObjectList(Page.promote_panels, heading='Promote'), ObjectList(Page.settings_panels, heading='Settings', classname="settings"), ]) def __str__(self): return self.title