vbv/server/vbv_lernwelt/course_session/models.py

155 lines
5.2 KiB
Python

from django.db import models
from django.utils.translation import gettext_lazy as _
from django_jsonform.models.fields import JSONField as JSONSchemaField
from vbv_lernwelt.assignment.models import AssignmentType
from vbv_lernwelt.duedate.models import DueDate
class CourseSessionAttendanceCourse(models.Model):
"""
Präsenztag Durchührung
Kann über einen Zeitraum von meheren Tagen gehen.
"""
course_session = models.ForeignKey(
"course.CourseSession",
on_delete=models.CASCADE,
)
learning_content = models.ForeignKey(
"learnpath.LearningContentAttendanceCourse",
on_delete=models.CASCADE,
)
due_date = models.OneToOneField(
"duedate.DueDate",
on_delete=models.CASCADE,
related_name="attendance_course_due_date",
)
location = models.CharField(max_length=255, blank=True, default="")
trainer = models.CharField(max_length=255, blank=True, default="")
# because the attendance list is more of a snapshot of the current state
# we will store the attendance list as a JSONField
# the important field of the list type is "user_id"
ATTENDANCE_USER_LIST_SCHEMA = {
"type": "array",
"items": {
"type": "object",
"properties": {
"user_id": {
"type": "number",
"required": True,
},
"email": {"type": "string"},
"first_name": {"type": "string"},
"last_name": {"type": "string"},
},
},
}
attendance_user_list = JSONSchemaField(
default=list, schema=ATTENDANCE_USER_LIST_SCHEMA
)
def save(self, *args, **kwargs):
if not self.pk:
title = ""
url = ""
page = None
if self.learning_content_id:
title = self.learning_content.title
page = self.learning_content.page_ptr
url = self.learning_content.get_frontend_url()
self.due_date = DueDate.objects.create(
url=url,
title=f"{title}",
learning_content_description=f"{_('Präsenzkurs')}",
description="",
course_session=self.course_session,
page=page,
)
super().save(*args, **kwargs)
def __str__(self):
return f"{self.course_session} - {self.learning_content}"
class CourseSessionAssignment(models.Model):
"""
Auftrag
- Geletitete Fallarbeit ist eine speziefische ausprägung eines Auftrags (assignment_type)
"""
course_session = models.ForeignKey(
"course.CourseSession",
on_delete=models.CASCADE,
)
learning_content = models.ForeignKey(
"learnpath.LearningContentAssignment",
on_delete=models.CASCADE,
)
submission_deadline = models.OneToOneField(
"duedate.DueDate",
on_delete=models.CASCADE,
related_name="assignment_submission_deadline",
null=True,
)
evaluation_deadline = models.OneToOneField(
"duedate.DueDate",
on_delete=models.CASCADE,
related_name="assignment_evaluation_deadline",
null=True,
)
def save(self, *args, **kwargs):
if not self.pk:
title = ""
url = ""
page = None
assignment_type_description = ""
if self.learning_content_id:
title = self.learning_content.title
page = self.learning_content.page_ptr
url = self.learning_content.get_frontend_url()
assignment_type = self.learning_content.assignment_type
assignment_type_descriptions = {
AssignmentType.CASEWORK.name: _("Geleitete Fallarbeit"),
AssignmentType.PREP_ASSIGNMENT.name: _("Vorbereitungsauftrag"),
AssignmentType.REFLECTION.name: _("Reflexion"),
}
assignment_type_description = assignment_type_descriptions.get(
assignment_type, ""
)
if assignment_type in {
AssignmentType.CASEWORK.value,
AssignmentType.PREP_ASSIGNMENT.value,
}: # Reflexion
self.submission_deadline = DueDate.objects.create(
url=url,
title=f"{title}",
learning_content_description=assignment_type_description,
description=f"{_('Abgabe Termin')}",
course_session=self.course_session,
page=page,
)
if assignment_type == AssignmentType.CASEWORK.value:
self.evaluation_deadline = DueDate.objects.create(
url=url,
title=f"{title}",
learning_content_description=assignment_type_description,
description=f"{_('Freigabe Termin Bewertungen')}",
course_session=self.course_session,
page=page,
)
super().save(*args, **kwargs)
def __str__(self):
return f"{self.course_session} - {self.learning_content}"