From b75737468c2670df8bfb2d08c08c7e6d2baef8f0 Mon Sep 17 00:00:00 2001 From: Reto Aebersold Date: Mon, 11 Dec 2023 13:55:40 +0100 Subject: [PATCH] feat: mentor invite --- .../learning_mentor/tests/test_invitation.py | 29 +++++++++++++++++++ server/vbv_lernwelt/learning_mentor/urls.py | 5 ++++ server/vbv_lernwelt/learning_mentor/views.py | 20 +++++++++++-- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/server/vbv_lernwelt/learning_mentor/tests/test_invitation.py b/server/vbv_lernwelt/learning_mentor/tests/test_invitation.py index a5022eff..7486c892 100644 --- a/server/vbv_lernwelt/learning_mentor/tests/test_invitation.py +++ b/server/vbv_lernwelt/learning_mentor/tests/test_invitation.py @@ -100,6 +100,35 @@ class LearningMentorInvitationTest(APITestCase): [{"id": str(MentorInvitation.objects.get(email=email).id), "email": email}], ) + def test_delete_invitation(self) -> None: + # GIVEN + self.client.force_login(self.participant) + participant_cs_user = add_course_session_user( + self.course_session, + self.participant, + role=CourseSessionUser.Role.MEMBER, + ) + email = "test@exmaple.com" + + invitation = MentorInvitation.objects.create( + participant=participant_cs_user, email=email + ) + + delete_url = reverse( + "delete_invitation", + kwargs={ + "course_session_id": self.course_session.id, + "invitation_id": invitation.id, + }, + ) + + # WHEN + response = self.client.delete(delete_url) + + # THEN + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + self.assertFalse(MentorInvitation.objects.filter(id=invitation.id).exists()) + def test_accept_invitation(self) -> None: # GIVEN invitee = create_user("invitee") diff --git a/server/vbv_lernwelt/learning_mentor/urls.py b/server/vbv_lernwelt/learning_mentor/urls.py index 3859bafc..57f33a8e 100644 --- a/server/vbv_lernwelt/learning_mentor/urls.py +++ b/server/vbv_lernwelt/learning_mentor/urls.py @@ -6,5 +6,10 @@ urlpatterns = [ path("summary", views.mentor_summary, name="mentor_summary"), path("invitations", views.list_invitations, name="list_invitations"), path("invitations/create", views.create_invitation, name="create_invitation"), + path( + "invitations//delete", + views.delete_invitation, + name="delete_invitation", + ), path("invitations/accept", views.accept_invitation, name="accept_invitation"), ] diff --git a/server/vbv_lernwelt/learning_mentor/views.py b/server/vbv_lernwelt/learning_mentor/views.py index f381d8d5..73f2078d 100644 --- a/server/vbv_lernwelt/learning_mentor/views.py +++ b/server/vbv_lernwelt/learning_mentor/views.py @@ -1,3 +1,5 @@ +from uuid import UUID + from rest_framework import permissions, status from rest_framework.decorators import api_view, permission_classes from rest_framework.generics import get_object_or_404 @@ -60,11 +62,25 @@ def list_invitations(request, course_session_id: int): 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) + invitations = MentorInvitation.objects.filter(participant=course_session_user) + serializer = InvitationSerializer(invitations, many=True) return Response(serializer.data) +@api_view(["DELETE"]) +@permission_classes([IsAuthenticated, CourseSessionMember]) +def delete_invitation(request, course_session_id: int, invitation_id: UUID): + 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 + ) + get_object_or_404( + MentorInvitation, id=invitation_id, participant=course_session_user + ).delete() + + return Response(status=status.HTTP_204_NO_CONTENT) + + @api_view(["POST"]) @permission_classes([IsAuthenticated, CourseSessionMember]) def create_invitation(request, course_session_id: int):