class OpenHoursBlock(blocks.StructBlock): """ Holds day and time combination for business open hours. """ days = MultiSelectBlock( required=True, verbose_name=_('Days'), help_text=_('For late night hours past 23:59, define each day in a separate block.'), widget=forms.CheckboxSelectMultiple, choices=( ('Monday', _('Monday')), ('Tuesday', _('Tuesday')), ('Wednesday', _('Wednesday')), ('Thursday', _('Thursday')), ('Friday', _('Friday')), ('Saturday', _('Saturday')), ('Sunday', _('Sunday')), )) start_time = blocks.TimeBlock(verbose_name=_('Opening time')) end_time = blocks.TimeBlock(verbose_name=_('Closing time')) class Meta: template = 'coderedcms/blocks/struct_data_hours.json' label = _('Open Hours') value_class = OpenHoursValue
class AgendaItemBlock(blocks.StructBlock): """Content for an event agenda item""" start_time = blocks.TimeBlock() end_time = blocks.TimeBlock(required=False) title = blocks.CharBlock() speaker = blocks.PageChooserBlock(required=False, page_type='people.Person') external_speaker = blocks.StructBlock([ ('name', blocks.CharBlock(required=False)), ('url', blocks.URLBlock(label='URL', required=False)), ])
class SessionBlock(blocks.StructBlock): name = blocks.TextBlock(required=False) #session_type = SessionTypesBlock() description = blocks.RichTextBlock(required=False) start_time = blocks.TimeBlock(required=False) end_time = blocks.TimeBlock(required=False) speakers = blocks.StreamBlock([('speaker', SessionSpeakerBlock())], required=False) archived_video_link = blocks.URLBlock( help_text="Enter youtube link after conference", required=False)
class SessionDayBlock(blocks.StructBlock): collapsible = blocks.BooleanBlock( help_text="Allow schedule sessions to expand and collapse", required=False, default=True) day = IntegerChoiceBlock( help_text="What day of the conference is this session on?", required=False, default=1) start_time = blocks.TimeBlock(required=False) end_time = blocks.TimeBlock(required=False) sessions = blocks.StreamBlock([('session', SessionBlock())])
class AgendaItemBlock(blocks.StructBlock): start_time = blocks.TimeBlock(label="Start", required=False) end_time = blocks.TimeBlock(label="End", required=False) description = blocks.CharBlock(max_length=100, required=False) location = blocks.CharBlock(max_length=100, required=False) speakers = blocks.ListBlock(blocks.StructBlock([ ('name', blocks.CharBlock(required=False)), ('url', blocks.URLBlock(required=False)), ], icon='user', required=False)) objects = PageManager() class Meta: icon = 'date'
class ConcertBlock(blocks.StructBlock): band_img = ImageChooserBlock(required=True) hidden = blocks.BooleanBlock( default=True, help_text=_( 'If hidden box is checked, concert will not be displayed on' ' the page'), required=False) on_sale = blocks.BooleanBlock( default=True, help_text=_('If unchecked, Buy Tickets button will be grayed out'), required=False) virtual = blocks.BooleanBlock(default=False, help_text=_('Is this a virtual concert?'), required=False) canceled = blocks.BooleanBlock(default=False, required=False) postponed = blocks.BooleanBlock(default=False, required=False) sold_out = blocks.BooleanBlock(default=False, required=False) # Virtual concert will remain available on demand until this date available_until = blocks.DateTimeBlock( required=False, blank=True, null=True, help_text=_( 'Date that on-demand virtual concert will remain available until')) # Band/opener names and url properties replaced with single RichTextField to account for wide variety in how the # bands info may be displayed band_info = blocks.RichTextBlock(help_text=_( 'Provide the names of the bands/openers and any other info here. Text will be' ' centered.')) concert_dates = blocks.ListBlock(blocks.DateTimeBlock()) gates_time = blocks.TimeBlock(default=datetime.time(hour=18), required=False, blank=True, null=True) show_time = blocks.TimeBlock(default=datetime.time(hour=19), required=False, blank=True, null=True) member_price = blocks.CharBlock(default='$', max_length=100, blank=True, null=True) public_price = blocks.CharBlock(default='$', max_length=100) # Added a ticket URL for concerts that are sold from a non-standard URL ticket_url = blocks.URLBlock( default='https://redbuttegarden.ticketfly.com')
class HomePage(Page): advert = models.ForeignKey('home.Advert', null=True, blank=True, on_delete=models.SET_NULL, related_name='+') body = StreamField([ ('Paragraph', blocks.RichTextBlock()), ('Image', ImageChooserBlock()), ('OtherImgBlock', OtherImgBlock()), ('Text', blocks.TextBlock()), ('Heading', blocks.CharBlock()), ('BlockQuote', blocks.BlockQuoteBlock()), ('Email', blocks.EmailBlock()), ('URL', blocks.URLBlock()), ('Boolean', blocks.BooleanBlock()), ('Integer', blocks.IntegerBlock()), ('Float', blocks.FloatBlock()), ('Decimal', blocks.DecimalBlock()), ('Date', blocks.DateBlock()), ('Time', blocks.TimeBlock()), ('DateTime', blocks.DateTimeBlock()), ('RawHTML', blocks.RawHTMLBlock()), ('Choice', blocks.ChoiceBlock()), ('PageChooser', blocks.PageChooserBlock()), ('DocumentChooser', DocumentChooserBlock()), ('Banner', BannerBlock()), ('Embed', EmbedBlock()), ('RecommendCourse', blocks.StructBlock([('title', blocks.CharBlock()), ('courses', blocks.ListBlock(CourseBlock()))], template='home/blocks/recommend_courses.html')), ('SeriesCourse', blocks.StructBlock([('title', blocks.CharBlock()), ('series', blocks.ListBlock(SeriesBlock()))], template='home/blocks/series_list.html')), ('StoryBlock', StoryBlock()), ('ProfessorBlock', ProfessorBlock()), ('CategoriesListBlock', CategoriesListBlock()), ('SubjectCourse', blocks.StructBlock( [('required_course', blocks.ListBlock(SeriesBlock())), ('optional_course', blocks.ListBlock(SeriesBlock()))], template='home/blocks/subject_course.html')), ('VipBlock', VipBlock()), ('SeriesProcessBlock', SeriesProcessBlock()), ]) content_panels = Page.content_panels + [ StreamFieldPanel('body'), SnippetChooserPanel('advert'), ] api_fields = [ APIField('body'), ]
class EventDetailBlock(blocks.StructBlock): """ Represents the details of an event from start date to address and location on a map """ start_date = blocks.DateBlock() start_time = blocks.TimeBlock() end_date = blocks.DateBlock() end_time = blocks.TimeBlock() address = blocks.CharBlock() location = GeoBlock(address_field='address', required=False) class Meta: icon = 'site' template = 'blog/event_details.html' default = { 'start_date': datetime.date.today(), 'start_time': datetime.datetime.now().time(), 'end_date': datetime.date.today(), 'end_time': datetime.datetime.now().time(), 'address': 'Mgarr Road, Xewkija XWK 9014, Malta' } label = 'Event details'
class _S_TallBlock(blocks.StructBlock): timeblock = blocks.TimeBlock() datetimeblock = blocks.DateTimeBlock() richtextblock = blocks.RichTextBlock() rawhtmlblock = blocks.RawHTMLBlock() blockquoteblock = blocks.BlockQuoteBlock() choiceblock = blocks.ChoiceBlock(choices=[ ("apples", "Apple"), ("bananas", "Bananas"), ]) graphql_fields = [ GraphQLString("timeblock"), GraphQLString("datetimeblock"), GraphQLString("richtextblock"), GraphQLString("rawhtmlblock"), GraphQLString("blockquoteblock"), GraphQLString("choiceblock"), ]
class CustomBlock1(blocks.StructBlock): field_char = blocks.CharBlock(required=False) field_text = blocks.TextBlock(required=False) field_email = blocks.EmailBlock(required=False) field_int = blocks.IntegerBlock(required=False) field_float = blocks.FloatBlock(required=False) field_decimal = blocks.DecimalBlock(required=False) field_regex = blocks.RegexBlock(regex=r'^[0-9]{3}$', required=False) field_url = blocks.URLBlock(required=False) field_bool = blocks.BooleanBlock(required=False) field_date = blocks.DateBlock(required=False) field_time = blocks.TimeBlock(required=False) field_datetime = blocks.DateTimeBlock(required=False) field_rich = blocks.RichTextBlock(required=False) field_raw = blocks.RawHTMLBlock(required=False) field_quote = blocks.BlockQuoteBlock(required=False) field_choice = blocks.ChoiceBlock(choices=[('tea', 'Tea'), ('coffee', 'Coffee')], icon='cup', required=False) field_static = blocks.StaticBlock(required=False) field_list = blocks.ListBlock(blocks.CharBlock, required=False) field_list_2 = blocks.ListBlock(CustomBlockInner, required=False)
class PageTypeA(Page): streamfield = StreamField([ ('h1', blocks.CharBlock(icon="title", classname="title")), ('h2', blocks.CharBlock(icon="subtitle", classname="subtitle")), ('n1', blocks.IntegerBlock(icon="subtitle", classname="subtitle")), ], null=True, blank=True) another = StreamField([ ('h3', blocks.CharBlock(icon="title", classname="title")), ('h4', blocks.CharBlock(icon="subtitle", classname="subtitle")), ('n2', blocks.IntegerBlock(icon="subtitle", classname="subtitle")), ], null=True, blank=True) third = StreamField([ ('char', blocks.CharBlock()), ('text', blocks.TextBlock()), ('email', blocks.EmailBlock()), ('int', blocks.IntegerBlock()), ('float', blocks.FloatBlock()), ('decimal', blocks.DecimalBlock()), ('regex', blocks.RegexBlock(regex=r'^[0-9]{3}$')), ('url', blocks.URLBlock()), ('bool', blocks.BooleanBlock()), ('date', blocks.DateBlock()), ('time', blocks.TimeBlock()), ('datetime', blocks.DateTimeBlock()), ('rich', blocks.RichTextBlock()), ('raw', blocks.RawHTMLBlock()), ('quote', blocks.BlockQuoteBlock()), ('choice', blocks.ChoiceBlock(choices=[('tea', 'Tea'), ('coffee', 'Coffee')], icon='cup')), ('static', blocks.StaticBlock()), ], null=True) links = StreamField([ ('image', ImageChooserBlock()), ('page', PageChooserBlock()), ('snippet', SnippetChooserBlock(target_model=App2Snippet)), ], null=True) lists = StreamField([ ('char', blocks.ListBlock(blocks.CharBlock())), ('text', blocks.ListBlock(blocks.TextBlock())), ('int', blocks.ListBlock(blocks.IntegerBlock())), ('float', blocks.ListBlock(blocks.FloatBlock())), ('decimal', blocks.ListBlock(blocks.DecimalBlock())), ('date', blocks.ListBlock(blocks.DateBlock())), ('time', blocks.ListBlock(blocks.TimeBlock())), ('datetime', blocks.ListBlock(blocks.DateTimeBlock())), ], null=True) links_list = StreamField([ ('image', blocks.ListBlock(ImageChooserBlock())), ('page', blocks.ListBlock(PageChooserBlock())), ('snippet', blocks.ListBlock(SnippetChooserBlock(target_model=App2Snippet))), ], null=True) custom = StreamField([ ('custom1', CustomBlock1()), ('custom2', CustomBlock2()), ], null=True) another_custom = StreamField([ ('custom1', CustomBlock1()), ('custom2', CustomBlock2()), ], null=True) custom_lists = StreamField([ ('custom1', blocks.ListBlock(CustomBlock1())), ('custom2', blocks.ListBlock(CustomBlock2())), ], null=True) content_panels = [ FieldPanel('title', classname="full title"), StreamFieldPanel('streamfield'), StreamFieldPanel('another'), StreamFieldPanel('third'), StreamFieldPanel('links'), StreamFieldPanel('custom'), StreamFieldPanel('another_custom'), StreamFieldPanel('lists'), StreamFieldPanel('links_list'), StreamFieldPanel('custom_lists'), ]
class BasicPage(Page): body = StreamField([ ('heading', blocks.CharBlock(classname="full title")), ('paragraph', blocks.RichTextBlock()), ('image', ImageChooserBlock()), ('table', TableBlock()), ('BlockQuoteBlock', BlockQuoteBlock()), ('URLBlock', URLBlock()), ('EmailBlock', EmailBlock()), ('DateBlock', DateBlock()), ('TimeBlock', TimeBlock()), ('DateTimeBlock', DateBlock()), ('PageChooserBlock', PageChooserBlock()), ('DocumentChooserBlock', DocumentChooserBlock()), ('IframeBlock', TextBlock()), ('EmbedBlock', EmbedBlock()), ('form', WagtailFormBlock()), ('show_business_hours', BooleanBlock( required=False, help_text="If checked, the library hours will display on the page", template='basic_page/blocks/business_hours.html', icon='user')), ('show_next_closure', BooleanBlock( required=False, help_text="If checked, the next library closure will display", template='basic_page/blocks/next_closure.html', icon='user')), ('show_all_closures', BooleanBlock( required=False, help_text= "If checked, all upcoming library closures will be shown", template='basic_page/blocks/all_closures.html', icon='user')), ('map', blocks.StructBlock([ ('address', GeoAddressBlock(required=True)), ('map', GeoBlock(address_field='address')), ], template='basic_page/blocks/map.html', icon='user')), ('bookClub', blocks.StructBlock( [('book_club_name', blocks.CharBlock()), ('book_club_day_of_the_week', blocks.TextBlock()), ('book_club_PDF', DocumentChooserBlock(required=False)), ('book_club_time', blocks.TimeBlock()), ('books', blocks.StreamBlock([ ( 'book', blocks.StructBlock( [ ('book_name', blocks.CharBlock()), ('author_name', blocks.CharBlock()), ('reading_date', blocks.DateBlock()), ('book_description', blocks.RichTextBlock()), ('book_cover', ImageChooserBlock(required=False)), ], template='basic_page/blocks/books.html'), ), ]))], template='basic_page/blocks/book_club.html', icon='openquote')), ('panel', blocks.StructBlock([ ('panel_name', blocks.CharBlock()), ('show_by_default', blocks.BooleanBlock( required=False, help_text="Display Panel as open by default")), ('panel_body', blocks.StreamBlock([ ( 'panel_items', blocks.StructBlock([ ('panel_item_title', blocks.CharBlock()), ('panel_link', URLBlock( required=False, help_text="Use this for images you wish to link" )), ('panel_image', ImageChooserBlock( required=False, help_text="Use this for images you wish to link" )), ('panel_description', blocks.RichTextBlock()), ], template= 'basic_page/blocks/panel_items.html'), ), ])) ], template='basic_page/blocks/panel.html', icon='collapse-down')), ], blank=True) def get_context(self, request): data = super(BasicPage, self).get_context(request) return data content_panels = Page.content_panels + [ StreamFieldPanel('body'), ] # Search index configuration search_fields = Page.search_fields + [ index.SearchField('body'), ]