diff --git a/server/vbv_lernwelt/assignment/services.py b/server/vbv_lernwelt/assignment/services.py index 11e29a9d..c2708786 100644 --- a/server/vbv_lernwelt/assignment/services.py +++ b/server/vbv_lernwelt/assignment/services.py @@ -173,7 +173,7 @@ def update_assignment_completion( acl.completion_data[key].update(task_data) acl.save() - if completion_status == "SUBMITTED": + if completion_status == AssignmentCompletionStatus.SUBMITTED: learning_content = assignment.learningcontentassignment_set.first() if learning_content: mark_course_completion( diff --git a/server/vbv_lernwelt/course_session/admin.py b/server/vbv_lernwelt/course_session/admin.py index b0970a8e..da09cef2 100644 --- a/server/vbv_lernwelt/course_session/admin.py +++ b/server/vbv_lernwelt/course_session/admin.py @@ -9,7 +9,12 @@ from vbv_lernwelt.course_session.models import ( @admin.register(CourseSessionAttendanceCourse) class CourseSessionAttendanceCourseAdmin(admin.ModelAdmin): # Inline fields are not possible for the DueDate model, because it is not a ForeignKey relatoion. - readonly_fields = ["course_session", "learning_content", "due_date"] + readonly_fields = [ + "course_session", + "learning_content", + "due_date", + "attendance_user_list", + ] list_display = [ "course_session", "learning_content", diff --git a/server/vbv_lernwelt/course_session/models.py b/server/vbv_lernwelt/course_session/models.py index 7cd6738c..3408ae32 100644 --- a/server/vbv_lernwelt/course_session/models.py +++ b/server/vbv_lernwelt/course_session/models.py @@ -1,5 +1,6 @@ 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 @@ -32,7 +33,24 @@ class CourseSessionAttendanceCourse(models.Model): # 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 = models.JSONField(default=list) + 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: diff --git a/server/vbv_lernwelt/course_session/services/attendance.py b/server/vbv_lernwelt/course_session/services/attendance.py index 79ffb62b..22802943 100644 --- a/server/vbv_lernwelt/course_session/services/attendance.py +++ b/server/vbv_lernwelt/course_session/services/attendance.py @@ -20,7 +20,9 @@ def update_attendance_list( attendance_course: CourseSessionAttendanceCourse, attendance_user_list: List[AttendanceUser], ): - user_id_list_before = [u["user_id"] for u in attendance_course.attendance_user_list] + user_id_set_before = set( + [u["user_id"] for u in attendance_course.attendance_user_list] + ) result_user_list = [] for attendance_user in attendance_user_list: @@ -52,14 +54,13 @@ def update_attendance_list( attendance_course.attendance_user_list = result_user_list attendance_course.save() - user_id_list_after = [u["user_id"] for u in attendance_course.attendance_user_list] + user_id_set_after = set( + [u["user_id"] for u in attendance_course.attendance_user_list] + ) - user_id_list_removed = [ - user_id for user_id in user_id_list_before if user_id not in user_id_list_after - ] + user_id_set_removed = user_id_set_before - user_id_set_after - for user_id in user_id_list_removed: - # FIXME: create completion for every user in attendance_user_list + for user_id in user_id_set_removed: u = User.objects.filter(id=user_id).first() if u is not None: mark_course_completion(