vbv/server/vbv_lernwelt/assignment/models.py

127 lines
3.3 KiB
Python

from django.db import models
from slugify 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 AssignmentListPage(CourseBasePage):
subpage_types = ["assignment.Assignment"]
parent_page_types = ["course.CoursePage"]
def save(self, clean=True, user=None, log_action=False, **kwargs):
self.slug = find_available_slug(
slugify(f"{self.get_parent().slug}-assignment", allow_unicode=True)
)
super(AssignmentListPage, self).save(clean, user, log_action, **kwargs)
def __str__(self):
return f"{self.title}"
# class AssignmentSubmission(modModel):
# created_at = models.DateTimeField(auto_now_add=True)
class ExplanationBlock(blocks.StructBlock):
text = blocks.TextBlock()
class Meta:
icon = "comment"
class PerformanceObjectiveBlock(blocks.StructBlock):
text = blocks.TextBlock()
class Meta:
icon = "tick"
class UserTextInputBlock(blocks.StaticBlock):
text = blocks.TextBlock(blank=True)
class Meta:
icon = "edit"
class UserConfirmationBlock(blocks.StructBlock):
text = blocks.TextBlock()
class Meta:
icon = "tick-inverse"
class TaskContentStreamBlock(blocks.StreamBlock):
explanation = ExplanationBlock()
user_text_input = UserTextInputBlock()
user_confirmation = UserConfirmationBlock()
class TaskBlock(blocks.StructBlock):
title = blocks.TextBlock()
file_submission_required = blocks.BooleanBlock(required=False)
content = TaskContentStreamBlock(
blank=True,
)
class Meta:
icon = "tasks"
label = "Teilauftrag"
class Assignment(CourseBasePage):
starting_position = models.TextField(help_text="Erläuterung der Ausgangslage")
effort_required = models.CharField(
max_length=100, help_text="Zeitaufwand als Text", blank=True
)
performance_objectives = StreamField(
[
("performance_objective", PerformanceObjectiveBlock()),
],
use_json_field=True,
blank=True,
help_text="Leistungsziele des Auftrags",
)
assessment_description = models.TextField(
blank=True, help_text="Beschreibung der Bewertung"
)
assessment_document_url = models.CharField(
max_length=255,
blank=True,
help_text="URL zum Beeurteilungsinstrument",
)
tasks = StreamField(
[
("task", TaskBlock()),
],
use_json_field=True,
blank=True,
help_text="Teilaufgaben",
)
content_panels = Page.content_panels + [
FieldPanel("starting_position"),
FieldPanel("effort_required"),
FieldPanel("performance_objectives"),
FieldPanel("assessment_description"),
FieldPanel("assessment_document_url"),
FieldPanel("tasks"),
]
subpage_types = []
class Meta:
verbose_name = "Auftrag"
def save(self, clean=True, user=None, log_action=False, **kwargs):
self.slug = find_available_slug(
slugify(f"{self.get_parent().slug}-{self.title}", allow_unicode=True)
)
super(Assignment, self).save(clean, user, log_action, **kwargs)