from django.contrib.auth import get_user_model from django.db import models from django_extensions.db.models import TimeStampedModel from wagtail.admin.panels import FieldPanel from wagtail.fields import RichTextField from wagtail.snippets.models import register_snippet from wagtailautocomplete.edit_handlers import AutocompletePanel from wagtail.search import index from core.constants import DEFAULT_RICH_TEXT_FEATURES from django.utils.translation import ugettext_lazy as _ from modelcluster.fields import ParentalKey @register_snippet class Assignment(index.Indexed, TimeStampedModel): title = models.CharField(max_length=255) assignment = RichTextField(features=DEFAULT_RICH_TEXT_FEATURES) solution = RichTextField(null=True, blank=True, features=DEFAULT_RICH_TEXT_FEATURES) deleted = models.BooleanField(default=False) owner = models.ForeignKey( get_user_model(), on_delete=models.PROTECT, null=True, blank=True ) # probably don't want to delete all assignments if a user gets deleted module = ParentalKey( "books.Module", related_name="assignments", on_delete=models.PROTECT ) user_created = models.BooleanField(default=False) taskbase_id = models.CharField(max_length=255, null=True, blank=True) search_fields = [ index.SearchField("title", partial_match=True), index.SearchField("assignment", partial_match=True), ] panels = [ FieldPanel("title"), FieldPanel("assignment"), FieldPanel("solution"), FieldPanel("module"), AutocompletePanel("owner"), ] def __str__(self): return ( self.title if not self.user_created else "{} (erstellt von {})".format(self.title, self.owner) ) class Meta: verbose_name = _("assignment") verbose_name_plural = _("assignments") ordering = ["-created"] class StudentSubmission(TimeStampedModel): text = models.TextField(blank=True) document = models.URLField(blank=True, default="", max_length=255) assignment = models.ForeignKey( Assignment, on_delete=models.CASCADE, related_name="submissions" ) student = models.ForeignKey( get_user_model(), on_delete=models.CASCADE, related_name="submissions" ) final = models.BooleanField(default=False) def __str__(self): return "{} - {}".format(self.student.full_name, self.text) class SubmissionFeedback(TimeStampedModel): text = models.TextField(blank=True) # teacher who created the feedback teacher = models.ForeignKey( get_user_model(), on_delete=models.CASCADE, related_name="feedbacks" ) student_submission = models.OneToOneField( StudentSubmission, on_delete=models.CASCADE, primary_key=True, related_name="submission_feedback", ) final = models.BooleanField(default=False) def __str__(self): return "{} - {}".format(self.student_submission.student.full_name, self.text)