Working with enums in graphql...

This commit is contained in:
Daniel Egger 2023-06-26 15:16:08 +02:00
parent b9c9b009ff
commit ab8dbd09ef
6 changed files with 55 additions and 41 deletions

View File

@ -107,15 +107,23 @@ export type AttendanceCourseUserMutation = {
}; };
export type AttendanceUserInputType = { export type AttendanceUserInputType = {
user_id?: InputMaybe<Scalars['ID']>; status: AttendanceUserStatus;
user_id: Scalars['ID'];
}; };
/** An enumeration. */
export enum AttendanceUserStatus {
Absent = 'ABSENT',
Present = 'PRESENT'
}
export type AttendanceUserType = { export type AttendanceUserType = {
__typename?: 'AttendanceUserType'; __typename?: 'AttendanceUserType';
email?: Maybe<Scalars['String']>; email?: Maybe<Scalars['String']>;
first_name?: Maybe<Scalars['String']>; first_name?: Maybe<Scalars['String']>;
last_name?: Maybe<Scalars['String']>; last_name?: Maybe<Scalars['String']>;
user_id?: Maybe<Scalars['ID']>; status: AttendanceUserStatus;
user_id: Scalars['ID'];
}; };
/** An enumeration. */ /** An enumeration. */

View File

@ -25,12 +25,19 @@ value as specified by
scalar DateTime scalar DateTime
type AttendanceUserType { type AttendanceUserType {
user_id: ID user_id: ID!
status: AttendanceUserStatus!
first_name: String first_name: String
last_name: String last_name: String
email: String email: String
} }
"""An enumeration."""
enum AttendanceUserStatus {
PRESENT
ABSENT
}
type CourseType { type CourseType {
id: ID! id: ID!
title: String! title: String!
@ -246,7 +253,8 @@ type AttendanceCourseUserMutation {
} }
input AttendanceUserInputType { input AttendanceUserInputType {
user_id: ID user_id: ID!
status: AttendanceUserStatus!
} }
type AssignmentCompletionMutation { type AssignmentCompletionMutation {

View File

@ -2,13 +2,13 @@ import graphene
import structlog import structlog
from rest_framework.exceptions import PermissionDenied 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.permissions import has_course_access
from vbv_lernwelt.course_session.graphql.types import ( from vbv_lernwelt.course_session.graphql.types import CourseSessionAttendanceCourseType
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 from vbv_lernwelt.course_session.services.attendance import (
AttendanceUserStatus,
update_attendance_list,
)
logger = structlog.get_logger(__name__) logger = structlog.get_logger(__name__)
@ -37,29 +37,16 @@ class AttendanceCourseUserMutation(graphene.Mutation):
): ):
attendance_course = CourseSessionAttendanceCourse.objects.get(id=id) attendance_course = CourseSessionAttendanceCourse.objects.get(id=id)
if not has_course_access( if not attendance_course or not has_course_access(
info.context.user, info.context.user,
attendance_course.course_session.course_id, attendance_course.course_session.course_id,
): ):
raise PermissionDenied() raise PermissionDenied()
# FIXME: create completion for every user in attendance_user_list attendance_course = update_attendance_list(
attendance_course=attendance_course,
result_user_list = [] attendance_user_list=attendance_user_list,
for attendance_user in attendance_user_list: )
u = User.objects.filter(id=attendance_user.user_id).first()
if u is not None:
result_user_list.append(
{
"user_id": u.id,
"email": u.email,
"first_name": u.first_name,
"last_name": u.last_name,
}
)
attendance_course.attendance_user_list = result_user_list
attendance_course.save()
return AttendanceCourseUserMutation( return AttendanceCourseUserMutation(
course_session_attendance_course=attendance_course course_session_attendance_course=attendance_course

View File

@ -29,14 +29,18 @@ 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"), "status": attendance_user.get(
"status", AttendanceUserStatus.PRESENT
).value,
"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 = ( completion_status = (
"success" if attendance_user.get("status") == "PRESENT" else "fail" "success"
if attendance_user.get("status").value == "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,

View File

@ -3,10 +3,13 @@ from django.test import TestCase
from vbv_lernwelt.core.create_default_users import create_default_users from vbv_lernwelt.core.create_default_users import create_default_users
from vbv_lernwelt.core.models import User from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.creators.test_course import create_test_course from vbv_lernwelt.course.creators.test_course import create_test_course
from vbv_lernwelt.course.models import CourseSession, CourseCompletion from vbv_lernwelt.course.models import CourseCompletion, CourseSession
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
from vbv_lernwelt.course_session.services.attendance import update_attendance_list from vbv_lernwelt.course_session.services.attendance import (
AttendanceUserStatus,
update_attendance_list,
)
class AttendanceServicesTestCase(TestCase): class AttendanceServicesTestCase(TestCase):
@ -24,7 +27,8 @@ class AttendanceServicesTestCase(TestCase):
student = User.objects.get(username="test-student1@example.com") student = User.objects.get(username="test-student1@example.com")
update_attendance_list( update_attendance_list(
self.attendance_course, [{"user_id": student.id, "status": "PRESENT"}] self.attendance_course,
[{"user_id": student.id, "status": AttendanceUserStatus.PRESENT}],
) )
attendance_course = CourseSessionAttendanceCourse.objects.get( attendance_course = CourseSessionAttendanceCourse.objects.get(
@ -49,7 +53,8 @@ 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( update_attendance_list(
self.attendance_course, [{"user_id": student.id, "status": "PRESENT"}] self.attendance_course,
[{"user_id": student.id, "status": AttendanceUserStatus.PRESENT}],
) )
self.assertEqual(CourseCompletion.objects.count(), 1) self.assertEqual(CourseCompletion.objects.count(), 1)
cc = CourseCompletion.objects.first() cc = CourseCompletion.objects.first()

View File

@ -23,13 +23,13 @@ class AttendanceCourseUserMutationTestCase(GraphQLTestCase):
def test_simple_query(self): def test_simple_query(self):
response = self.query( response = self.query(
""" f"""
{ {{
course_session_attendance_course(id:1) { course_session_attendance_course(id:{self.attendance_course.id}) {{
id id
trainer trainer
} }}
} }}
""" """
) )
@ -47,10 +47,10 @@ class AttendanceCourseUserMutationTestCase(GraphQLTestCase):
query = f""" query = f"""
mutation {{ mutation {{
update_course_session_attendance_course_users( update_course_session_attendance_course_users(
id:1, id:{self.attendance_course.id},
attendance_user_list:[ attendance_user_list:[
{{user_id: {student.id}}}, {{user_id: {student.id}, status: PRESENT}},
{{user_id: "123123123"}} {{user_id: "123123123", status: PRESENT}},
] ]
) {{ ) {{
course_session_attendance_course {{ course_session_attendance_course {{
@ -60,6 +60,7 @@ class AttendanceCourseUserMutationTestCase(GraphQLTestCase):
first_name first_name
last_name last_name
email email
status
}} }}
}} }}
}} }}
@ -84,6 +85,7 @@ class AttendanceCourseUserMutationTestCase(GraphQLTestCase):
"first_name": student.first_name, "first_name": student.first_name,
"last_name": student.last_name, "last_name": student.last_name,
"email": student.email, "email": student.email,
"status": "PRESENT",
} }
], ],
} }