vbv/server/vbv_lernwelt/media_library/models.py

86 lines
2.9 KiB
Python

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'
)