123 lines
3.8 KiB
Python
123 lines
3.8 KiB
Python
import graphene
|
|
import structlog
|
|
from graphene import relay
|
|
from rest_framework.exceptions import PermissionDenied
|
|
|
|
from vbv_lernwelt.course.graphql.types import CourseSessionUserType
|
|
from vbv_lernwelt.course.models import CourseSessionUser
|
|
from vbv_lernwelt.course_session.graphql.types import (
|
|
CourseSessionAttendanceCourseObjectType,
|
|
)
|
|
from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse
|
|
from vbv_lernwelt.course_session.services.attendance import (
|
|
AttendanceUserStatus,
|
|
update_attendance_list,
|
|
)
|
|
from vbv_lernwelt.iam.permissions import has_course_access
|
|
from vbv_lernwelt.learnpath.models import CourseProfile
|
|
|
|
logger = structlog.get_logger(__name__)
|
|
|
|
|
|
class UpdateCourseProfileSuccess(graphene.ObjectType):
|
|
user = graphene.Field(CourseSessionUserType(), required=True)
|
|
|
|
|
|
class UpdateCourseProfileError(graphene.ObjectType):
|
|
message = graphene.String()
|
|
|
|
|
|
class UpdateCourseProfileResult(graphene.Union):
|
|
class Meta:
|
|
types = (
|
|
UpdateCourseProfileError,
|
|
UpdateCourseProfileSuccess,
|
|
)
|
|
|
|
@classmethod
|
|
def resolve_type(cls, instance, info):
|
|
if type(instance).__name__ == "UpdateCourseProfileSuccess":
|
|
return UpdateCourseProfileSuccess
|
|
return UpdateCourseProfileError
|
|
|
|
|
|
class AttendanceUserInputType(graphene.InputObjectType):
|
|
user_id = graphene.UUID(required=True)
|
|
status = graphene.Field(
|
|
graphene.Enum.from_enum(AttendanceUserStatus), required=True
|
|
)
|
|
|
|
|
|
class AttendanceCourseUserMutation(graphene.Mutation):
|
|
course_session_attendance_course = graphene.Field(
|
|
CourseSessionAttendanceCourseObjectType
|
|
)
|
|
|
|
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 attendance_course or not has_course_access(
|
|
info.context.user,
|
|
attendance_course.course_session.course_id,
|
|
):
|
|
raise PermissionDenied()
|
|
|
|
attendance_course = update_attendance_list(
|
|
attendance_course=attendance_course,
|
|
attendance_user_list=attendance_user_list,
|
|
)
|
|
|
|
return AttendanceCourseUserMutation(
|
|
course_session_attendance_course=attendance_course
|
|
)
|
|
|
|
|
|
class CourseSessionProfileMutation(relay.ClientIDMutation):
|
|
class Input:
|
|
course_profile = graphene.String(required=True)
|
|
course_slug = graphene.String(required=True)
|
|
|
|
result = UpdateCourseProfileResult()
|
|
|
|
@classmethod
|
|
def mutate_and_get_payload(cls, root, info, **input):
|
|
course_profile = input.get("course_profile")
|
|
course_slug = input.get("course_slug")
|
|
user = info.context.user
|
|
|
|
try:
|
|
if course_profile == "":
|
|
profile = None
|
|
else:
|
|
profile = CourseProfile.objects.get(code=course_profile)
|
|
|
|
# csu = user.coursesessionuser_set.first()
|
|
csu = CourseSessionUser.objects.get(
|
|
course_session__course__slug=course_slug, user=user
|
|
)
|
|
csu.chosen_profile = profile
|
|
csu.save()
|
|
return cls(result=UpdateCourseProfileSuccess(user=csu))
|
|
except CourseProfile.DoesNotExist:
|
|
return cls(result=UpdateCourseProfileError("Course Profile does not exist"))
|
|
except CourseSessionUser.DoesNotExist:
|
|
return cls(
|
|
result=UpdateCourseProfileError("Course Session User does not exist")
|
|
)
|
|
|
|
|
|
class CourseSessionMutation:
|
|
update_course_session_attendance_course_users = AttendanceCourseUserMutation.Field()
|
|
update_course_session_profile = CourseSessionProfileMutation.Field()
|