import graphene import structlog 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.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): course_session_attendance_course = graphene.Field(CourseSessionAttendanceCourseType) class Input: id = graphene.ID(required=True) attendance_user_list = graphene.List(AttendanceUserInputType, required=True) @classmethod def mutate( cls, root, info, id, attendance_user_list, ): attendance_course = CourseSessionAttendanceCourse.objects.get(id=id) if not has_course_access( info.context.user, attendance_course.course_session.course_id, ): raise PermissionDenied() # FIXME: create completion for every user in attendance_user_list result_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( course_session_attendance_course=attendance_course ) class CourseSessionMutation: update_course_session_attendance_course_users = AttendanceCourseUserMutation.Field()