import enum from typing import List, TypedDict from vbv_lernwelt.core.models import User from vbv_lernwelt.course.services import mark_course_completion from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse class AttendanceUserStatus(enum.Enum): PRESENT = "PRESENT" ABSENT = "ABSENT" class AttendanceUser(TypedDict): user_id: str status: AttendanceUserStatus 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] result_user_list = [] for attendance_user in attendance_user_list: u = User.objects.filter(id=attendance_user.get("user_id")).first() if u is not None: result_user_list.append( { "user_id": u.id, "status": attendance_user.get("status"), "email": u.email, "first_name": u.first_name, "last_name": u.last_name, } ) completion_status = ( "success" if attendance_user.get("status") == "PRESENT" else "fail" ) mark_course_completion( page_key=attendance_course.learning_content.translation_key, user=u, course_session=attendance_course.course_session, completion_status=completion_status, ) 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_list_removed = [ user_id for user_id in user_id_list_before if user_id not in user_id_list_after ] for user_id in user_id_list_removed: # FIXME: create completion for every user in attendance_user_list u = User.objects.filter(id=user_id).first() if u is not None: mark_course_completion( page_key=attendance_course.learning_content.translation_key, user=u, course_session=attendance_course.course_session, completion_status="fail", ) return attendance_course