django_airavata/wagtailapps/base/blocks.py (506 lines of code) (raw):

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"