vbv/server/vbv_lernwelt/course_session/services/attendance.py

69 lines
2.3 KiB
Python

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