99 lines
3.3 KiB
Python
99 lines
3.3 KiB
Python
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({})
|