from rest_framework import permissions from rest_framework.decorators import api_view, permission_classes from rest_framework.generics import get_object_or_404 from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from vbv_lernwelt.core.serializers import UserSerializer from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.iam.permissions import is_course_session_member from vbv_lernwelt.learning_mentor.content.praxis_assignment import ( get_praxis_assignments, ) from vbv_lernwelt.learning_mentor.models import LearningMentor, MentorInvitation from vbv_lernwelt.learning_mentor.serializers import PraxisAssignmentStatusSerializer from vbv_lernwelt.learnpath.models import Circle from vbv_lernwelt.notify.email.email_services import EmailTemplate, send_email @api_view(["GET"]) @permission_classes([IsAuthenticated]) def mentor_summary(request, course_session_id: int): course_session = CourseSession.objects.get(id=course_session_id) mentor = get_object_or_404( LearningMentor, mentor=request.user, course=course_session.course ) participants = mentor.participants.filter(course_session=course_session) users = [p.user for p in participants] praxis_assignments, circle_ids = get_praxis_assignments(course_session, users) circles = Circle.objects.filter(id__in=circle_ids).values("id", "title") return Response( { "participants": [UserSerializer(user).data for user in users], "circles": list(circles), "praxis_assignments": PraxisAssignmentStatusSerializer( praxis_assignments, many=True ).data, } ) class CourseSessionMember(permissions.BasePermission): def has_permission(self, request, view): return is_course_session_member( request.user, view.kwargs.get("course_session_id") ) @api_view(["GET"]) @permission_classes([IsAuthenticated]) def list_invitations(request, course_session_id: int): pass @api_view(["POST"]) @permission_classes([IsAuthenticated, CourseSessionMember]) def create_invitation(request, course_session_id: int): user = request.user course_session = get_object_or_404(CourseSession, id=course_session_id) course_session_user = get_object_or_404( CourseSessionUser, user=user, course_session=course_session ) email = request.data.get("email") if not email: return Response({"error": "email is required"}, status=400) invitation, _ = MentorInvitation.objects.get_or_create( email=email, participant=course_session_user, ) target_url = f"/lernbegleitung/{course_session_id}/invitation/{invitation.id}" send_email( recipient_email=email, template=EmailTemplate.LEARNING_MENTOR_INVITATION, template_data={ "inviter_name": f"{user.first_name} {user.last_name}", "inviter_email": user.email, "target_url": f"https://my.vbv-afa.ch{target_url}", }, template_language=request.user.language, fail_silently=True, ) return Response({"invitation": invitation.id}) @api_view(["POST"]) @permission_classes([IsAuthenticated]) def accept_invitation(request, course_session_id: int): return Response({})