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)