From b9c9b009ff1fe1a53e424a431576ebc7f678d5ce Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Mon, 26 Jun 2023 14:44:46 +0200 Subject: [PATCH] Add more typing --- .../course_session/graphql/mutations.py | 8 +++++- .../course_session/graphql/types.py | 6 ++++- .../course_session/services/attendance.py | 26 ++++++++++++++++--- .../course_session/tests/test_attendance.py | 22 +++++++++++++--- 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/server/vbv_lernwelt/course_session/graphql/mutations.py b/server/vbv_lernwelt/course_session/graphql/mutations.py index 95d5c137..5b9b7a67 100644 --- a/server/vbv_lernwelt/course_session/graphql/mutations.py +++ b/server/vbv_lernwelt/course_session/graphql/mutations.py @@ -4,14 +4,20 @@ from rest_framework.exceptions import PermissionDenied from vbv_lernwelt.core.models import User from vbv_lernwelt.course.permissions import has_course_access -from vbv_lernwelt.course_session.graphql.types import CourseSessionAttendanceCourseType +from vbv_lernwelt.course_session.graphql.types import ( + CourseSessionAttendanceCourseType, +) from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse +from vbv_lernwelt.course_session.services.attendance import AttendanceUserStatus logger = structlog.get_logger(__name__) class AttendanceUserInputType(graphene.InputObjectType): user_id = graphene.ID(required=True) + status = graphene.Field( + graphene.Enum.from_enum(AttendanceUserStatus), required=True + ) class AttendanceCourseUserMutation(graphene.Mutation): diff --git a/server/vbv_lernwelt/course_session/graphql/types.py b/server/vbv_lernwelt/course_session/graphql/types.py index 18206e26..36dd82f1 100644 --- a/server/vbv_lernwelt/course_session/graphql/types.py +++ b/server/vbv_lernwelt/course_session/graphql/types.py @@ -2,10 +2,14 @@ import graphene from graphene_django import DjangoObjectType from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse +from vbv_lernwelt.course_session.services.attendance import AttendanceUserStatus class AttendanceUserType(graphene.ObjectType): - user_id = graphene.ID() + user_id = graphene.ID(required=True) + status = graphene.Field( + graphene.Enum.from_enum(AttendanceUserStatus), required=True + ) first_name = graphene.String() last_name = graphene.String() email = graphene.String() diff --git a/server/vbv_lernwelt/course_session/services/attendance.py b/server/vbv_lernwelt/course_session/services/attendance.py index d506b1a0..2eca1ea9 100644 --- a/server/vbv_lernwelt/course_session/services/attendance.py +++ b/server/vbv_lernwelt/course_session/services/attendance.py @@ -1,12 +1,26 @@ +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 + attendance_course: CourseSessionAttendanceCourse, + attendance_user_list: List[AttendanceUser], ): - user_id_list_before = attendance_course.attendance_user_list or [] + 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: @@ -15,22 +29,26 @@ def update_attendance_list( 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="success", + completion_status=completion_status, ) attendance_course.attendance_user_list = result_user_list attendance_course.save() - user_id_list_after = attendance_course.attendance_user_list or [] + 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 diff --git a/server/vbv_lernwelt/course_session/tests/test_attendance.py b/server/vbv_lernwelt/course_session/tests/test_attendance.py index 393bd431..878e84d6 100644 --- a/server/vbv_lernwelt/course_session/tests/test_attendance.py +++ b/server/vbv_lernwelt/course_session/tests/test_attendance.py @@ -23,7 +23,9 @@ class AttendanceServicesTestCase(TestCase): def test_updateAttendanceList_withSingleUserId_findsDetailsAndStoresResult(self): student = User.objects.get(username="test-student1@example.com") - update_attendance_list(self.attendance_course, [{"user_id": student.id}]) + update_attendance_list( + self.attendance_course, [{"user_id": student.id, "status": "PRESENT"}] + ) attendance_course = CourseSessionAttendanceCourse.objects.get( id=self.attendance_course.id @@ -36,6 +38,7 @@ class AttendanceServicesTestCase(TestCase): [ { "email": "test-student1@example.com", + "status": "PRESENT", "user_id": -21, "last_name": "Student1", "first_name": "Test", @@ -45,8 +48,9 @@ class AttendanceServicesTestCase(TestCase): def test_updateAttendanceList_willUpdateUserCourseCompletion(self): student = User.objects.get(username="test-student1@example.com") - update_attendance_list(self.attendance_course, [{"user_id": student.id}]) - + update_attendance_list( + self.attendance_course, [{"user_id": student.id, "status": "PRESENT"}] + ) self.assertEqual(CourseCompletion.objects.count(), 1) cc = CourseCompletion.objects.first() self.assertEqual(cc.user, student) @@ -60,6 +64,16 @@ class AttendanceServicesTestCase(TestCase): def test_updateAttendanceList_withRemovedUser_willUpdateUserCourseCompletion(self): student = User.objects.get(username="test-student1@example.com") + self.attendance_course.attendance_user_list = [ + { + "email": "test-student1@example.com", + "status": "PRESENT", + "user_id": "-21", + "last_name": "Student1", + "first_name": "Test", + } + ] + self.attendance_course.save() mark_course_completion( page_key=self.attendance_course.learning_content.translation_key, user=student, @@ -71,7 +85,7 @@ class AttendanceServicesTestCase(TestCase): self.assertEqual(CourseCompletion.objects.count(), 1) cc = CourseCompletion.objects.first() self.assertEqual(cc.user, student) - self.assertEqual(cc.completion_status, "success") + self.assertEqual(cc.completion_status, "fail") self.assertEqual( cc.page_key, self.attendance_course.learning_content.translation_key )