skillbox/server/assignments/models.py

87 lines
3.0 KiB
Python

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 gettext_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 = models.ForeignKey(
"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)