138 lines
3.6 KiB
Python
138 lines
3.6 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),
|
|
ignore_page_id=self.id,
|
|
)
|
|
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):
|
|
serialize_field_names = [
|
|
"starting_position",
|
|
"effort_required",
|
|
"performance_objectives",
|
|
"assessment_description",
|
|
"assessment_document_url",
|
|
"tasks",
|
|
]
|
|
|
|
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 Beurteilungsinstrument",
|
|
)
|
|
|
|
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),
|
|
ignore_page_id=self.id,
|
|
)
|
|
super(Assignment, self).save(clean, user, log_action, **kwargs)
|