from django.db import models from django.utils.text import slugify from wagtail import fields from wagtail.admin.panels import FieldPanel, StreamFieldPanel from wagtail.documents.models import AbstractDocument, Document from wagtail.models import Page from vbv_lernwelt.core.model_utils import find_available_slug from vbv_lernwelt.learnpath.serializer_helpers import get_it_serializer_class from vbv_lernwelt.media_library.content_blocks import MediaContentCollection class MediaLibraryPage(Page): parent_page_types = ['course.CoursePage'] subpage_types = ['media_library.MediaCategoryPage'] content_panels = [ FieldPanel('title', classname="full title"), ] def full_clean(self, *args, **kwargs): self.slug = find_available_slug(slugify(f"{self.get_parent().slug}-media", allow_unicode=True)) super(MediaLibraryPage, self).full_clean(*args, **kwargs) @classmethod def get_serializer_class(cls): return get_it_serializer_class( cls, [ 'id', 'title', 'slug', 'type', 'translation_key', 'course', 'children', ] ) class MediaCategoryPage(Page): """ Handlungsfeld. zB. Fahrzeug """ course_category = models.ForeignKey('course.CourseCategory', on_delete=models.CASCADE) parent_page_types = ['media_library.MediaLibraryPage'] introduction_text = models.TextField(default='') description = fields.RichTextField(default='') body = fields.StreamField( [('content_collection', MediaContentCollection())], use_json_field=True, null=True ) content_panels = [ FieldPanel('title', classname="full title"), FieldPanel('course_category'), FieldPanel('introduction_text', classname="introduction text"), FieldPanel('description', classname="introduction text"), StreamFieldPanel('body') ] def full_clean(self, *args, **kwargs): self.slug = find_available_slug(slugify(f"{self.get_parent()}-cat-{self.title}", allow_unicode=True)) super(MediaCategoryPage, self).full_clean(*args, **kwargs) @classmethod def get_serializer_class(cls): return get_it_serializer_class( cls, field_names=[ 'id', 'title', 'slug', 'type', 'translation_key', 'course_category', 'introduction_text', 'description', 'body', ] ) class LibraryDocument(AbstractDocument): # Todo: check https://filepreviews.io/ # Custom field example: display_text = models.CharField(max_length=1024, default='') description = models.TextField(default='') link_display_text = models.CharField(max_length=1024, default='') thumbnail = models.URLField() admin_form_fields = Document.admin_form_fields + ( 'display_text', 'description', 'link_display_text', 'thumbnail' )