vbv/server/vbv_lernwelt/learning_mentor/views.py

108 lines
3.7 KiB
Python

from rest_framework import permissions, status
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 (
InvitationSerializer,
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, CourseSessionMember])
def list_invitations(request, course_session_id: int):
course_session = get_object_or_404(CourseSession, id=course_session_id)
course_session_user = get_object_or_404(
CourseSessionUser, user=request.user, course_session=course_session
)
snippets = MentorInvitation.objects.filter(participant=course_session_user)
serializer = InvitationSerializer(snippets, many=True)
return Response(serializer.data)
@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
)
serializer = InvitationSerializer(
data=request.data, context={"course_session_user": course_session_user}
)
if not serializer.is_valid():
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
invitation = serializer.save()
target_url = f"/lernbegleitung/{course_session_id}/invitation/{invitation.id}"
send_email(
recipient_email=invitation.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(serializer.data)
@api_view(["POST"])
@permission_classes([IsAuthenticated])
def accept_invitation(request, course_session_id: int):
return Response({})