112 lines
3.4 KiB
Python
112 lines
3.4 KiB
Python
from django.db import models
|
|
from django.utils.text import slugify
|
|
from wagtail import blocks
|
|
from wagtail.admin.panels import FieldPanel
|
|
from wagtail.fields import StreamField
|
|
from wagtail.models import Page
|
|
|
|
from vbv_lernwelt.core.model_utils import find_available_slug
|
|
from vbv_lernwelt.course.models import CourseBasePage
|
|
|
|
|
|
class CompetenceProfilePage(CourseBasePage):
|
|
serialize_field_names = [
|
|
"course",
|
|
"circles",
|
|
"children",
|
|
]
|
|
|
|
parent_page_types = ["course.CoursePage"]
|
|
subpage_types = ["competence.CompetencePage"]
|
|
|
|
content_panels = [
|
|
FieldPanel("title", classname="full title"),
|
|
]
|
|
|
|
def full_clean(self, *args, **kwargs):
|
|
self.slug = find_available_slug(
|
|
slugify(f"{self.get_parent().slug}-competence", allow_unicode=True)
|
|
)
|
|
super(CompetenceProfilePage, self).full_clean(*args, **kwargs)
|
|
|
|
def get_frontend_url(self):
|
|
return f"/competence/{self.slug}"
|
|
|
|
|
|
class CompetencePage(CourseBasePage):
|
|
serialize_field_names = [
|
|
"competence_id",
|
|
"children",
|
|
]
|
|
|
|
parent_page_types = ["competence.CompetenceProfilePage"]
|
|
subpage_types = ["competence.PerformanceCriteria"]
|
|
competence_id = models.TextField(default="A1")
|
|
items = StreamField(
|
|
[
|
|
("item", blocks.TextBlock()),
|
|
],
|
|
use_json_field=True,
|
|
)
|
|
|
|
content_panels = [
|
|
FieldPanel("title"),
|
|
FieldPanel("competence_id"),
|
|
]
|
|
|
|
def full_clean(self, *args, **kwargs):
|
|
self.slug = find_available_slug(
|
|
slugify(
|
|
f"{self.get_parent().slug}-competence-{self.competence_id}",
|
|
allow_unicode=True,
|
|
)
|
|
)
|
|
super(CompetencePage, self).full_clean(*args, **kwargs)
|
|
|
|
|
|
class PerformanceCriteria(CourseBasePage):
|
|
parent_page_types = ["competence.CompetenceProfilePage"]
|
|
competence_id = models.TextField(default="A1.1")
|
|
learning_unit = models.ForeignKey(
|
|
"learnpath.LearningUnit",
|
|
null=True,
|
|
blank=True,
|
|
on_delete=models.SET_NULL,
|
|
)
|
|
|
|
content_panels = [
|
|
FieldPanel("title"),
|
|
FieldPanel("competence_id"),
|
|
FieldPanel("learning_unit"),
|
|
]
|
|
|
|
def full_clean(self, *args, **kwargs):
|
|
profile_parent = self.get_ancestors().exact_type(CompetenceProfilePage).last()
|
|
if self.learning_unit and self.learning_unit.course_category:
|
|
self.slug = find_available_slug(
|
|
slugify(
|
|
f"{profile_parent.slug}-crit-{self.competence_id}-{self.learning_unit.course_category.title}",
|
|
allow_unicode=True,
|
|
)
|
|
)
|
|
else:
|
|
self.slug = find_available_slug(
|
|
slugify(
|
|
f"{profile_parent.slug}-crit-{self.competence_id}",
|
|
allow_unicode=True,
|
|
)
|
|
)
|
|
super(PerformanceCriteria, self).full_clean(*args, **kwargs)
|
|
|
|
@classmethod
|
|
def get_serializer_class(cls):
|
|
from vbv_lernwelt.competence.serializers import PerformanceCriteriaSerializer
|
|
|
|
return PerformanceCriteriaSerializer
|
|
|
|
def get_admin_display_title(self):
|
|
if self.learning_unit and self.learning_unit.course_category:
|
|
return f"{self.competence_id} ({self.learning_unit.course_category.title}) {self.draft_title[:30]}"
|
|
else:
|
|
return f"{self.competence_id} {self.draft_title[:30]}"
|