blob: fe2519654a2cb986d2a9e0bb53727ffccce73780 [file] [log] [blame]
from wagtail.core.blocks import (
BooleanBlock,
CharBlock,
ChoiceBlock,
IntegerBlock,
ListBlock,
RawHTMLBlock,
RichTextBlock,
StreamBlock,
StructBlock,
TextBlock
)
from wagtail.documents.blocks import DocumentChooserBlock
from wagtail.embeds.blocks import EmbedBlock
from wagtail.images.blocks import ImageChooserBlock
from wagtailcodeblock.blocks import CodeBlock
class ImageBlock(StructBlock):
"""
Custom `StructBlock` for utilizing images with associated caption and
attribution data
"""
image = ImageChooserBlock(required=True)
caption = CharBlock(required=False)
width = CharBlock(required=False)
height = IntegerBlock(required=False)
redirect_url = TextBlock(
required=False,
null=True,
blank=True,
help_text="Give a redirect link on clicking the image")
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = 'image'
template = "blocks/image_block.html"
class FontAwesomeIcon(StructBlock):
"""
Custom 'StructBlock' for utilizing images with associated caption and
attribution django_airavata
"""
icon_tag = TextBlock(required=True, blank=False,
help_text="Provide a font awesome icon class text")
icon_size = IntegerBlock(
required=False,
default=2,
null=True,
blank=True,
help_text="Provide a icon size in number type")
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = 'fa-flag'
template = "blocks/font_awesome_icon_block.html"
class ParagraphBlock(StructBlock):
"""
Custom 'StructBlock' for creating rich text content
"""
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
body = RichTextBlock()
class Meta:
icon = "fa-paragraph"
template = "blocks/paragraph_block.html"
help_text = "Create a free form paragraph"
class IuFooter(StructBlock):
"""
Custom 'StructBlock' for creating IU Footer
"""
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
footer_links = RichTextBlock()
class Meta:
icon = "fa-university"
template = "blocks/iu_footer.html"
help_text = "Create an IU Footer"
class HeadingBlock(StructBlock):
"""
Custom `StructBlock` that allows the user to select h1 - h4 sizes for
headers
"""
heading_text = CharBlock(classname="title", required=True)
size = ChoiceBlock(choices=[
('', 'Select a header size'),
('h1', 'H1'),
('h2', 'H2'),
('h3', 'H3'),
('h4', 'H4')
], blank=True, required=False)
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "title"
template = "blocks/heading_block.html"
class PlaceholderBlock(StructBlock):
"""
Custom 'StructBlock' that acts as a placeholder
"""
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "fa-map-marker"
template = "blocks/placeholder_block.html"
class CustomEmbedBlock(StructBlock):
"""
Custom 'StructBlock' that allows you to embed videos
"""
embed = EmbedBlock()
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "fa-link"
template = "blocks/embed_block.html"
help_text = ("Insert a youtube URL e.g "
"https://www.youtube.com/watch?v=SGJFWirQ3ks")
class CssCommentBlock(StructBlock):
"""
CSS Comment block
"""
message = TextBlock(
required=True, help_text="Write some comment to mark the css")
class Meta:
icon = "fa-comment"
template = "blocks/css_comment.html"
help_text = "Css Comment"
class HorizontalRule(StructBlock):
"""
HorizontalRule
"""
thickness = IntegerBlock(
required=False,
blank=True,
help_text="Enter a thickness integer value. Eg(10)")
bg_color = TextBlock(
required=True,
help_text="Enter a hexcode color for the rule Eg(#000000)")
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "fa-long-arrow-right"
template = "blocks/hrule.html"
help_text = "Horizontal Rule"
# BootStrap Components
class BootstrapJumbotron(StructBlock):
"""
Custom 'StructBlock' that allows the user to make a bootstrap jumbotron
"""
title = TextBlock()
body = RichTextBlock()
button_text = TextBlock(required=False)
button_link = TextBlock(required=False)
button_color = ChoiceBlock(choices=[
('btn-primary', 'DEFAULT'),
('btn-danger', 'RED'),
('btn-secondary', 'GREY'),
('btn-success', 'GREEN'),
('btn-warning', 'ORANGE')
], blank=True, required=False, help_text="select a button color")
button_size = ChoiceBlock(choices=[
('', 'DEFAULT'),
('btn-lg', 'LARGE'),
('btn-sm', 'SMALL')
], blank=True, required=False, help_text="select a button size")
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "fa-indent"
template = "blocks/bootstrap/jumbotron.html"
help_text = "Create a bootstrap jumbotron"
class BootstrapButton(StructBlock):
"""
Custom 'StructBlock' that allows the user to make a bootstrap button
"""
button_text = TextBlock()
button_link = TextBlock()
button_color = ChoiceBlock(choices=[
('btn-primary', 'DEFAULT'),
('btn-danger', 'RED'),
('btn-secondary', 'GREY'),
('btn-success', 'GREEN'),
('btn-warning', 'ORANGE')
], blank=True, required=False, help_text="select a button color")
button_size = ChoiceBlock(choices=[
('', 'DEFAULT'),
('btn-lg', 'LARGE'),
('btn-sm', 'SMALL')
], blank=True, required=False, help_text="select a button size")
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "fa-bold"
template = "blocks/bootstrap/button.html"
help_text = "Create a bootstrap button"
class BootstrapButtonMore(StructBlock):
"""
Custom 'StructBlock' that allows the user to make a bootstrap button that
toggles collapsible rich text block
"""
button_text = TextBlock()
button_id = TextBlock(help_text="Unique name for this collapsible")
button_color = ChoiceBlock(choices=[
('btn-primary', 'DEFAULT'),
('btn-danger', 'RED'),
('btn-secondary', 'GREY'),
('btn-success', 'GREEN'),
('btn-warning', 'ORANGE')
], blank=True, required=False, help_text="select a button color")
button_size = ChoiceBlock(choices=[
('', 'DEFAULT'),
('btn-lg', 'LARGE'),
('btn-sm', 'SMALL')
], blank=True, required=False, help_text="select a button size")
button_class = TextBlock(
required=False,
blank=True,
help_text="control the look of this button by giving unique class names "
"separated by space and styling the class in css")
body_class = TextBlock(
required=False,
blank=True,
help_text="control the look of this body by giving unique class names "
"separated by space and styling the class in css")
body_inline_style = TextBlock(
required=False,
blank=True,
help_text="apply inline CSS styles to body")
body = RichTextBlock()
class Meta:
icon = "collapse-up"
template = "blocks/bootstrap/buttonmore.html"
help_text = "Create a button that will toggle the display of a rich text body of text"
class BootstrapAlert(StructBlock):
"""
Custom 'StructBlock' that allows the user to make a bootstrap alert
"""
alert_text = TextBlock()
alert_color = ChoiceBlock(choices=[
('alert-primary', 'DEFAULT'),
('alert-secondary', 'GREY'),
('alert-success', 'GREEN'),
('alert-danger', 'RED'),
('alert-warning', 'ORANGE'),
('alert-dark', 'DARK'),
('alert-light', 'LIGHT'),
], blank=True, required=False, help_text="select a background color")
is_link = BooleanBlock(required=False)
alert_link = TextBlock(required=False)
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "fa-bell"
template = "blocks/bootstrap/alert.html"
help_text = "Create a bootstrap alert"
class BootstrapCard(StructBlock):
"""
Custom 'StructBlock' that allows the user to make a bootstrap card
"""
card_width = IntegerBlock(
help_text="18 works best for card", required=False, blank=True)
is_card_img = BooleanBlock(required=False)
is_card_img_overlay = BooleanBlock(
required=False,
default=False,
help_text="Use image as background for card",
label="Image Overlay?")
card_img = ImageChooserBlock(required=False)
card_img_width = IntegerBlock(
required=False, help_text="provide an image width")
card_img_height = IntegerBlock(
required=False, help_text="provide an image height")
card_title = TextBlock(required=False, null=True, blank=True)
card_text = RichTextBlock(required=False, null=True, blank=True)
card_bg_color = ChoiceBlock(choices=[
('bg-primary', 'DEFAULT'),
('bg-secondary', 'GREY'),
('bg-success', 'GREEN'),
('bg-danger', 'RED'),
('bg-warning', 'ORANGE'),
('bg-dark', 'DARK'),
('bg-light', 'LIGHT'),
], blank=True, required=False, help_text="select a background color")
card_text_color = ChoiceBlock(choices=[
('text-primary', 'DEFAULT'),
('text-secondary', 'GREY'),
('text-success', 'GREEN'),
('text-danger', 'RED'),
('text-warning', 'ORANGE'),
('text-dark', 'DARK'),
('text-light', 'LIGHT'),
], blank=True, required=False, help_text="select a text color")
buttons = ListBlock(BootstrapButton(required=False), default=[])
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "fa-id-card"
template = "blocks/bootstrap/card.html"
help_text = "Create a bootstrap card"
class BootstrapCarousel(StructBlock):
"""
Custom 'StructBlock' that allows the user to make a bootstrap carousel
"""
interval = IntegerBlock(default=2000, help_text="""
The amount of time to delay between automatically cycling an item. If
false, carousel will not automatically cycle.
""")
c_image1 = ImageChooserBlock(required=True)
c_image1_title = TextBlock(
required=False, blank=True, help_text="Give a title for image 1")
c_image1_body = TextBlock(
required=False, blank=True, help_text="Give a body for image 1")
c_image2 = ImageChooserBlock(required=False)
c_image2_title = TextBlock(
required=False, blank=True, help_text="Give a title for image 2")
c_image2_body = TextBlock(
required=False, blank=True, help_text="Give a body for image 2")
c_image3 = ImageChooserBlock(required=False)
c_image3_title = TextBlock(
required=False, blank=True, help_text="Give a title for image 3")
c_image3_body = TextBlock(
required=False, blank=True, help_text="Give a body for image 3")
c_image4 = ImageChooserBlock(required=False)
c_image4_title = TextBlock(
required=False, blank=True, help_text="Give a title for image 4")
c_image4_body = TextBlock(
required=False, blank=True, help_text="Give a body for image 4")
c_image5 = ImageChooserBlock(required=False)
c_image5_title = TextBlock(
required=False, blank=True, help_text="Give a title for image 5")
c_image5_body = TextBlock(
required=False, blank=True, help_text="Give a body for image 5")
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "fa-film"
template = "blocks/bootstrap/carousel.html"
help_text = ("Create a bootstrap carousel. Fill the images in order "
"to get optimized display.")
class BootstrapWell(StructBlock):
"""
Custom 'StructBlock' that allows user to make a bootstrap well.
(optimized for bootstrap 4 using card)
"""
message = RichTextBlock(help_text="Enter some message inside well")
well_bg_color = ChoiceBlock(choices=[
('bg-primary', 'DEFAULT'),
('bg-secondary', 'GREY'),
('bg-success', 'GREEN'),
('bg-danger', 'RED'),
('bg-warning', 'ORANGE'),
('bg-dark', 'DARK'),
('bg-light', 'LIGHT'),
], blank=True, required=False, help_text="select a background color")
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "fa-window-minimize"
template = "blocks/bootstrap/well.html"
class BootstrapMediaObject(StructBlock):
"""
Custom 'StructBlock' that allows user to make a bootstrap media object.
"""
media_img = ImageChooserBlock(required=True)
media_img_alt = TextBlock(required=True)
media_img_width = IntegerBlock(
required=False,
blank=True,
help_text="Enter an image width as an integer value. Eg(50)")
media_img_height = IntegerBlock(
required=False,
blank=True,
help_text="Enter an image height as an integer value Eg(50)")
heading_text = TextBlock(
required=False,
blank=True,
help_text="enter some heading text for media object")
body_text = RichTextBlock(
required=True, help_text="Enter some message for the media object")
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "fa-align-right"
template = "blocks/bootstrap/media.html"
class BootstrapEmbedVideo(StructBlock):
"""
Use Bootstrap's Embed component with video tag.
"""
video = DocumentChooserBlock(required=True)
aspect_ratio = ChoiceBlock(choices=[
('21by9', '21 x 9'),
('16by9', '16 x 9'),
('4by3', '4 x 3'),
('1by1', '1 x 1'),
], default='4by3', help_text="Aspect ratio")
custom_class = TextBlock(
required=False,
blank=True,
help_text="control this element by giving unique class names "
"separated by space and styling the class in css")
class Meta:
icon = "media"
template = "blocks/bootstrap/embed-video.html"
# StreamBlocks
class BaseStreamBlock(StreamBlock):
"""
Define the custom blocks that `StreamField` will utilize
"""
paragraph_block = ParagraphBlock()
image_block = ImageBlock()
embed_block = CustomEmbedBlock()
heading_block = HeadingBlock()
bootstrap_jumbotron = BootstrapJumbotron()
bootstrap_alert = BootstrapAlert()
bootstrap_button = BootstrapButton()
bootstrap_card = BootstrapCard()
bootstrap_carousel = BootstrapCarousel()
bootstrap_well = BootstrapWell()
horizontal_rule = HorizontalRule()
bootstrap_media_object = BootstrapMediaObject()
placeholder_block = PlaceholderBlock()
font_awesome_icon_block = FontAwesomeIcon()
iu_footer_block = IuFooter()
bootstrap_embed_video = BootstrapEmbedVideo()
expandable_rich_text_block = BootstrapButtonMore()
HTML_code = RawHTMLBlock()
# Using 'snippet' icon for uniqueness (RawHTMLBlock already uses 'code' icon)
code_snippet = CodeBlock(icon="snippet")
class CssStreamBlock(StreamBlock):
"""
Define the custom blocks for css that 'StreamField' will utilize
"""
css_block = RawHTMLBlock(required=True, help_text="Write Css Here")
css_comment = CssCommentBlock()
class ContainerBlock(StructBlock):
inline_styles = TextBlock(
required=False,
blank=True,
help_text="Apply inline CSS styles to container wrapper.")
custom_classes = CharBlock(
required=False,
help_text="Apply custom CSS classes to container wrapper. You can "
"define CSS classes in a Custom CSS snippet.")
background_image = ImageChooserBlock(
required=False,
help_text="Apply background image to container wrapper.")
def get_context(self, value, parent_context=None):
context = super().get_context(value, parent_context=parent_context)
context['container_class'] = self.container_class
return context
class Meta:
abstract = True
template = "blocks/bootstrap/container.html"
class FullWidthContainer(ContainerBlock):
container_class = "container-fluid"
class Meta:
icon = "fa-arrows-h"
class MaxWidthContainer(ContainerBlock):
container_class = "container"
class Meta:
icon = "fa-square-o"
class ContainerChoiceBlock(StreamBlock):
full_width_container = FullWidthContainer()
max_width_container = MaxWidthContainer()
class Meta:
max_num = 1
required = False
class NavItem(StructBlock):
link = CharBlock(help_text="Full URL or relative path (e.g., /auth/login)")
link_text = CharBlock(required=False)
image = ImageChooserBlock(required=False)
icon_class = CharBlock(required=False, help_text="Font awesome icon class")
show = ChoiceBlock(choices=[
('not-logged-in', 'Only when not logged in'),
('logged-in', 'Only when logged in'),
('always', 'Always'),
], default='not-logged-in')
horizontal_alignment = ChoiceBlock(choices=[
('', 'Select a horizontal alignment'),
('push-right', 'Push Right'),
], required=False)
include_in_main_menu = ChoiceBlock(choices=[
('', 'Choose if this link should also be added to main menu'),
('yes', 'Add to main menu'),
], required=False, help_text="The main menu is at the top of the dashboard when a user first logs in. Horizontal alignment does not apply when added to main menu.")
class Meta:
icon = "fa-minus"
template = "blocks/bootstrap/nav-item.html"
class LoginNavItem(NavItem):
class Meta:
default = {
'link': '/auth/login',
'link_text': 'Log in',
'icon_class': 'fas fa-sign-in-alt',
'show': 'not-logged-in',
}
class DashboardLinkNavItem(NavItem):
class Meta:
default = {
'link': '/workspace/dashboard',
'link_text': 'Go to Dashboard',
'icon_class': 'fas fa-arrow-circle-right',
'show': 'logged-in',
'horizontal_alignment': 'push-right',
}
class LogoutNavItem(NavItem):
class Meta:
default = {
'link': '/auth/logout',
'link_text': 'Logout',
'icon_class': 'fas fa-sign-out-alt',
'show': 'logged-in',
}
class CreateAccountNavItem(NavItem):
class Meta:
default = {
'link': '/auth/create-account',
'link_text': 'Create Account',
'icon_class': 'fas fa-user',
'show': 'not-logged-in',
'horizontal_alignment': 'push-right',
}
class Nav(StructBlock):
custom_class = CharBlock(required=False)
nav_items = StreamBlock([
('nav_item', NavItem()),
('login_link', LoginNavItem()),
('dashboard_link', DashboardLinkNavItem()),
('logout_link', LogoutNavItem()),
('create_account_link', CreateAccountNavItem()),
])
class Meta:
icon = "fa-bars"
template = "blocks/bootstrap/nav.html"