vbv/server/vbv_lernwelt/media_library/models.py

196 lines
6.3 KiB
Python

import re
from django.db import models
from django.utils.text import slugify
from wagtail.admin.panels import FieldPanel
from wagtail.documents.models import AbstractDocument, Document
from wagtail.fields import RichTextField
from vbv_lernwelt.core.constants import (
DEFAULT_RICH_TEXT_FEATURES,
DEFAULT_RICH_TEXT_FEATURES_WITH_HEADER,
)
from vbv_lernwelt.core.model_utils import find_available_slug
from vbv_lernwelt.course.models import CourseBasePage
class MediaLibraryPage(CourseBasePage):
parent_page_types = ["course.CoursePage"]
subpage_types = [
"media_library.MediaLibraryCategoryPage",
"media_library.MediaLibraryUrlPage",
]
serialize_field_names = ["course", "description", "children"]
description = RichTextField(blank=True, features=DEFAULT_RICH_TEXT_FEATURES)
content_panels = [
FieldPanel("title", classname="full title"),
FieldPanel("description", classname="full title"),
]
def save(self, clean=True, user=None, log_action=False, **kwargs):
self.slug = find_available_slug(
slugify(f"{self.get_parent().slug}-media", allow_unicode=True),
ignore_page_id=self.id,
)
super(MediaLibraryPage, self).save(clean, user, log_action, **kwargs)
def get_frontend_url(self):
return f"/course/{self.slug.replace('-media', '')}/media"
class MediaLibraryCategoryPage(CourseBasePage):
"""
Kategorie unter Mediathek: "Allgemeines" oder "Handlungsfelder"
"""
parent_page_types = ["media_library.MediaLibraryPage"]
subpage_types = ["media_library.MediaLibraryContentPage"]
serialize_field_names = ["children", "icon_url", "description"]
description = RichTextField(blank=True, features=DEFAULT_RICH_TEXT_FEATURES)
icon_url = models.CharField(
max_length=255, default="/static/icons/icon-handlungsfelder-overview.svg"
)
content_panels = [
FieldPanel("title"),
FieldPanel("icon_url"),
FieldPanel("description"),
]
def save(self, clean=True, user=None, log_action=False, **kwargs):
self.slug = find_available_slug(
slugify(f"{self.get_parent().slug}-cat-{self.title}", allow_unicode=True),
ignore_page_id=self.id,
)
super(MediaLibraryCategoryPage, self).save(clean, user, log_action, **kwargs)
def get_frontend_url(self):
r = re.compile(r"^(?P<coursePart>.+?)-media-cat-(?P<catPart>.+)$")
m = r.match(self.slug)
return f"/course/{m.group('coursePart')}/media/{m.group('catPart')}"
class MediaLibraryContentPage(CourseBasePage):
"""
Inhalt einer Seite in der Mediathek, entweder Handlungsfeld wie "Fahrzeug" oder
Unterseite unter "Allgemein" wie "Versicherungswirtschaft"
"""
parent_page_types = ["media_library.MediaLibraryCategoryPage"]
serialize_field_names = [
"icon_overview_url",
"icon_detail_url",
"description",
"body",
]
description = RichTextField(blank=True, features=DEFAULT_RICH_TEXT_FEATURES)
icon_overview_url = models.CharField(
max_length=255, default="/static/icons/handlungsfelder/icon-hf-fahrzeug.svg"
)
icon_detail_url = models.CharField(
max_length=255,
default="/static/icons/handlungsfelder/icon-hf-fahrzeug-detail.svg",
)
body = RichTextField(
blank=True, features=DEFAULT_RICH_TEXT_FEATURES_WITH_HEADER + ["h2"]
)
content_panels = [
FieldPanel("title"),
FieldPanel("icon_overview_url"),
FieldPanel("icon_detail_url"),
FieldPanel("description"),
FieldPanel("body"),
]
def save(self, clean=True, user=None, log_action=False, **kwargs):
self.slug = find_available_slug(
slugify(
f"{self.get_parent().slug}-content-{self.title}", allow_unicode=True
),
ignore_page_id=self.id,
)
super(MediaLibraryContentPage, self).save(clean, user, log_action, **kwargs)
def get_frontend_url(self):
r = re.compile(
r"^(?P<coursePart>.+?)-media-cat-(?P<catPart>.+?)-content-(?P<contentPart>.+)$"
)
m = r.match(self.slug)
return f"/course/{m.group('coursePart')}/media/{m.group('catPart')}/{m.group('contentPart')}"
class MediaLibraryUrlPage(CourseBasePage):
"""
Link in der Mediathek auf externe Seite, wie Lernmedien und/oder Lexikon
"""
parent_page_types = ["media_library.MediaLibraryPage"]
serialize_field_names = [
"children",
"icon_url",
"content_url",
"url_open_blank",
"description",
"body",
]
description = RichTextField(blank=True, features=DEFAULT_RICH_TEXT_FEATURES)
icon_url = models.CharField(
max_length=255, default="/static/icons/icon-handlungsfelder-overview.svg"
)
content_url = models.URLField(blank=True)
url_open_blank = models.BooleanField(default=False)
body = RichTextField(
blank=True,
features=DEFAULT_RICH_TEXT_FEATURES_WITH_HEADER + ["h2"],
help_text="Wird nur angezeigt, wenn kein Link angegeben ist.",
)
content_panels = [
FieldPanel("title"),
FieldPanel("icon_url"),
FieldPanel("content_url"),
FieldPanel("url_open_blank"),
FieldPanel("description"),
FieldPanel("body"),
]
def save(self, clean=True, user=None, log_action=False, **kwargs):
self.slug = find_available_slug(
slugify(f"{self.get_parent().slug}-cat-{self.title}", allow_unicode=True),
ignore_page_id=self.id,
)
super(MediaLibraryUrlPage, self).save(clean, user, log_action, **kwargs)
def get_frontend_url(self):
r = re.compile(r"^(?P<coursePart>.+?)-media-cat-(?P<catPart>.+)$")
m = r.match(self.slug)
return f"/course/{m.group('coursePart')}/media/{m.group('catPart')}"
class LibraryDocument(AbstractDocument):
"""Unused for now"""
# Todo: check https://filepreviews.io/
display_text = models.CharField(max_length=1024, default="")
description = models.TextField(default="")
link_display_text = models.CharField(max_length=1024, default="")
thumbnail = models.CharField(default="", max_length=1024)
admin_form_fields = Document.admin_form_fields + (
"display_text",
"description",
"link_display_text",
"thumbnail",
)