233 lines
8.4 KiB
Python
233 lines
8.4 KiB
Python
from django.db import models
|
|
from django_jsonform.models.fields import JSONField as JSONSchemaField
|
|
|
|
from vbv_lernwelt.assignment.models import AssignmentType
|
|
from vbv_lernwelt.duedate.models import DueDate
|
|
from vbv_lernwelt.learnpath.models import Circle
|
|
|
|
|
|
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="")
|
|
|
|
class Meta:
|
|
ordering = ["course_session", "due_date__start"]
|
|
|
|
# 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 self.learning_content_id:
|
|
if not self.due_date_id:
|
|
self.due_date = DueDate.objects.create(
|
|
course_session=self.course_session,
|
|
)
|
|
|
|
if not self.due_date.manual_override_fields:
|
|
self.due_date.url = self.learning_content.get_frontend_url(
|
|
course_session_id=self.course_session.id
|
|
)
|
|
self.due_date.url_expert = f"/course/{self.due_date.course_session.course.slug}/cockpit/attendance?id={self.learning_content_id}&courseSessionId={self.course_session.id}"
|
|
self.due_date.title = self.learning_content.title
|
|
self.due_date.page = self.learning_content.page_ptr
|
|
self.due_date.assignment_type_translation_key = (
|
|
"learningContentTypes.attendanceCourse"
|
|
)
|
|
|
|
self.due_date.save()
|
|
|
|
super().save(*args, **kwargs)
|
|
|
|
def get_circle(self):
|
|
try:
|
|
return self.learning_content.get_ancestors().exact_type(Circle).first()
|
|
except Exception:
|
|
# noop
|
|
pass
|
|
return None
|
|
|
|
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,
|
|
)
|
|
|
|
class Meta:
|
|
ordering = ["course_session", "submission_deadline__start"]
|
|
|
|
def save(self, *args, **kwargs):
|
|
if self.learning_content_id:
|
|
title = self.learning_content.title
|
|
page = self.learning_content.page_ptr
|
|
url = self.learning_content.get_frontend_url(
|
|
course_session_id=self.course_session.id
|
|
)
|
|
assignment_type = self.learning_content.assignment_type
|
|
assignment_type_translation_keys = {
|
|
AssignmentType.CASEWORK.value: "learningContentTypes.casework",
|
|
AssignmentType.PREP_ASSIGNMENT.value: "learningContentTypes.prepAssignment",
|
|
AssignmentType.REFLECTION.value: "learningContentTypes.reflection",
|
|
}
|
|
|
|
url_expert = f"/course/{self.course_session.course.slug}/cockpit/assignment/{self.learning_content_id}?courseSessionId={self.course_session.id}"
|
|
|
|
if assignment_type in (
|
|
AssignmentType.CASEWORK.value,
|
|
AssignmentType.PREP_ASSIGNMENT.value,
|
|
):
|
|
if not self.submission_deadline_id:
|
|
self.submission_deadline = DueDate.objects.create(
|
|
course_session=self.course_session,
|
|
)
|
|
|
|
if not self.submission_deadline.manual_override_fields:
|
|
self.submission_deadline.url = url
|
|
self.submission_deadline.url_expert = url_expert
|
|
self.submission_deadline.title = title
|
|
self.submission_deadline.assignment_type_translation_key = (
|
|
assignment_type_translation_keys[assignment_type]
|
|
)
|
|
self.submission_deadline.date_type_translation_key = (
|
|
"assignment.dueDateSubmission"
|
|
)
|
|
self.submission_deadline.page = page
|
|
|
|
self.submission_deadline.save()
|
|
|
|
if assignment_type == AssignmentType.CASEWORK.value:
|
|
if not self.evaluation_deadline_id:
|
|
self.evaluation_deadline = DueDate.objects.create(
|
|
course_session=self.course_session,
|
|
)
|
|
|
|
if not self.evaluation_deadline.manual_override_fields:
|
|
self.evaluation_deadline.url = url
|
|
self.evaluation_deadline.url_expert = url_expert
|
|
self.evaluation_deadline.title = title
|
|
self.evaluation_deadline.assignment_type_translation_key = (
|
|
assignment_type_translation_keys[assignment_type]
|
|
)
|
|
self.evaluation_deadline.date_type_translation_key = (
|
|
"assignment.dueDateEvaluation"
|
|
)
|
|
self.evaluation_deadline.page = page
|
|
|
|
self.evaluation_deadline.save()
|
|
|
|
super().save(*args, **kwargs)
|
|
|
|
def __str__(self):
|
|
return f"{self.course_session} - {self.learning_content}"
|
|
|
|
|
|
class CourseSessionEdoniqTest(models.Model):
|
|
course_session = models.ForeignKey(
|
|
"course.CourseSession",
|
|
on_delete=models.CASCADE,
|
|
)
|
|
learning_content = models.ForeignKey(
|
|
"learnpath.LearningContentEdoniqTest",
|
|
on_delete=models.CASCADE,
|
|
)
|
|
deadline = models.OneToOneField(
|
|
"duedate.DueDate",
|
|
on_delete=models.CASCADE,
|
|
related_name="test_submission_deadline",
|
|
null=True,
|
|
)
|
|
|
|
class Meta:
|
|
ordering = ["course_session", "deadline__start"]
|
|
|
|
def __str__(self):
|
|
return f"{self.course_session} - {self.learning_content}"
|
|
|
|
def save(self, *args, **kwargs):
|
|
if self.learning_content_id:
|
|
if not self.deadline_id:
|
|
self.deadline = DueDate.objects.create(
|
|
course_session=self.course_session,
|
|
)
|
|
|
|
if not self.deadline.manual_override_fields:
|
|
self.deadline.url = self.learning_content.get_frontend_url(
|
|
course_session_id=self.course_session.id
|
|
)
|
|
self.deadline.url_expert = f"/course/{self.course_session.course.slug}/cockpit?courseSessionId={self.course_session.id}"
|
|
self.deadline.title = self.learning_content.title
|
|
self.deadline.page = self.learning_content.page_ptr
|
|
self.deadline.assignment_type_translation_key = (
|
|
"learningContentTypes.edoniqTest"
|
|
)
|
|
self.deadline.date_type_translation_key = "assignment.dueDateSubmission"
|
|
|
|
self.deadline.save()
|
|
|
|
super().save(*args, **kwargs)
|