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}" class CourseSessionEdoniqTest(models.Model): course_session = models.ForeignKey( "course.CourseSession", on_delete=models.CASCADE, ) learning_content = models.ForeignKey( "learnpath.LearningContentEdoniqTest", on_delete=models.CASCADE, ) due_date = models.OneToOneField( "duedate.DueDate", on_delete=models.CASCADE, related_name="edoniq_test_due_date", ) def __str__(self): return f"{self.course_session} - {self.learning_content}"