Add more typing
This commit is contained in:
parent
46b14bd4e7
commit
b9c9b009ff
|
|
@ -4,14 +4,20 @@ from rest_framework.exceptions import PermissionDenied
|
||||||
|
|
||||||
from vbv_lernwelt.core.models import User
|
from vbv_lernwelt.core.models import User
|
||||||
from vbv_lernwelt.course.permissions import has_course_access
|
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.models import CourseSessionAttendanceCourse
|
||||||
|
from vbv_lernwelt.course_session.services.attendance import AttendanceUserStatus
|
||||||
|
|
||||||
logger = structlog.get_logger(__name__)
|
logger = structlog.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class AttendanceUserInputType(graphene.InputObjectType):
|
class AttendanceUserInputType(graphene.InputObjectType):
|
||||||
user_id = graphene.ID(required=True)
|
user_id = graphene.ID(required=True)
|
||||||
|
status = graphene.Field(
|
||||||
|
graphene.Enum.from_enum(AttendanceUserStatus), required=True
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class AttendanceCourseUserMutation(graphene.Mutation):
|
class AttendanceCourseUserMutation(graphene.Mutation):
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,14 @@ import graphene
|
||||||
from graphene_django import DjangoObjectType
|
from graphene_django import DjangoObjectType
|
||||||
|
|
||||||
from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse
|
from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse
|
||||||
|
from vbv_lernwelt.course_session.services.attendance import AttendanceUserStatus
|
||||||
|
|
||||||
|
|
||||||
class AttendanceUserType(graphene.ObjectType):
|
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()
|
first_name = graphene.String()
|
||||||
last_name = graphene.String()
|
last_name = graphene.String()
|
||||||
email = graphene.String()
|
email = graphene.String()
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,26 @@
|
||||||
|
import enum
|
||||||
|
from typing import List, TypedDict
|
||||||
|
|
||||||
from vbv_lernwelt.core.models import User
|
from vbv_lernwelt.core.models import User
|
||||||
from vbv_lernwelt.course.services import mark_course_completion
|
from vbv_lernwelt.course.services import mark_course_completion
|
||||||
from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse
|
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(
|
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 = []
|
result_user_list = []
|
||||||
for attendance_user in attendance_user_list:
|
for attendance_user in attendance_user_list:
|
||||||
|
|
@ -15,22 +29,26 @@ def update_attendance_list(
|
||||||
result_user_list.append(
|
result_user_list.append(
|
||||||
{
|
{
|
||||||
"user_id": u.id,
|
"user_id": u.id,
|
||||||
|
"status": attendance_user.get("status"),
|
||||||
"email": u.email,
|
"email": u.email,
|
||||||
"first_name": u.first_name,
|
"first_name": u.first_name,
|
||||||
"last_name": u.last_name,
|
"last_name": u.last_name,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
completion_status = (
|
||||||
|
"success" if attendance_user.get("status") == "PRESENT" else "fail"
|
||||||
|
)
|
||||||
mark_course_completion(
|
mark_course_completion(
|
||||||
page_key=attendance_course.learning_content.translation_key,
|
page_key=attendance_course.learning_content.translation_key,
|
||||||
user=u,
|
user=u,
|
||||||
course_session=attendance_course.course_session,
|
course_session=attendance_course.course_session,
|
||||||
completion_status="success",
|
completion_status=completion_status,
|
||||||
)
|
)
|
||||||
|
|
||||||
attendance_course.attendance_user_list = result_user_list
|
attendance_course.attendance_user_list = result_user_list
|
||||||
attendance_course.save()
|
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_list_removed = [
|
||||||
user_id for user_id in user_id_list_before if user_id not in user_id_list_after
|
user_id for user_id in user_id_list_before if user_id not in user_id_list_after
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,9 @@ class AttendanceServicesTestCase(TestCase):
|
||||||
def test_updateAttendanceList_withSingleUserId_findsDetailsAndStoresResult(self):
|
def test_updateAttendanceList_withSingleUserId_findsDetailsAndStoresResult(self):
|
||||||
student = User.objects.get(username="test-student1@example.com")
|
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(
|
attendance_course = CourseSessionAttendanceCourse.objects.get(
|
||||||
id=self.attendance_course.id
|
id=self.attendance_course.id
|
||||||
|
|
@ -36,6 +38,7 @@ class AttendanceServicesTestCase(TestCase):
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
"email": "test-student1@example.com",
|
"email": "test-student1@example.com",
|
||||||
|
"status": "PRESENT",
|
||||||
"user_id": -21,
|
"user_id": -21,
|
||||||
"last_name": "Student1",
|
"last_name": "Student1",
|
||||||
"first_name": "Test",
|
"first_name": "Test",
|
||||||
|
|
@ -45,8 +48,9 @@ class AttendanceServicesTestCase(TestCase):
|
||||||
|
|
||||||
def test_updateAttendanceList_willUpdateUserCourseCompletion(self):
|
def test_updateAttendanceList_willUpdateUserCourseCompletion(self):
|
||||||
student = User.objects.get(username="test-student1@example.com")
|
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)
|
self.assertEqual(CourseCompletion.objects.count(), 1)
|
||||||
cc = CourseCompletion.objects.first()
|
cc = CourseCompletion.objects.first()
|
||||||
self.assertEqual(cc.user, student)
|
self.assertEqual(cc.user, student)
|
||||||
|
|
@ -60,6 +64,16 @@ class AttendanceServicesTestCase(TestCase):
|
||||||
|
|
||||||
def test_updateAttendanceList_withRemovedUser_willUpdateUserCourseCompletion(self):
|
def test_updateAttendanceList_withRemovedUser_willUpdateUserCourseCompletion(self):
|
||||||
student = User.objects.get(username="test-student1@example.com")
|
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(
|
mark_course_completion(
|
||||||
page_key=self.attendance_course.learning_content.translation_key,
|
page_key=self.attendance_course.learning_content.translation_key,
|
||||||
user=student,
|
user=student,
|
||||||
|
|
@ -71,7 +85,7 @@ class AttendanceServicesTestCase(TestCase):
|
||||||
self.assertEqual(CourseCompletion.objects.count(), 1)
|
self.assertEqual(CourseCompletion.objects.count(), 1)
|
||||||
cc = CourseCompletion.objects.first()
|
cc = CourseCompletion.objects.first()
|
||||||
self.assertEqual(cc.user, student)
|
self.assertEqual(cc.user, student)
|
||||||
self.assertEqual(cc.completion_status, "success")
|
self.assertEqual(cc.completion_status, "fail")
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
cc.page_key, self.attendance_course.learning_content.translation_key
|
cc.page_key, self.attendance_course.learning_content.translation_key
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue