From 16cd16212ab9b88e9c9b299c950bedf1f53abc43 Mon Sep 17 00:00:00 2001 From: Livio Bieri Date: Tue, 23 Jan 2024 11:45:55 +0100 Subject: [PATCH] feat: Feedback member API to get/put lu feedback --- .../tests/test_api.py | 119 +++++++++++++++++- .../self_evaluation_feedback/urls.py | 14 ++- .../self_evaluation_feedback/views.py | 26 +++- 3 files changed, 144 insertions(+), 15 deletions(-) diff --git a/server/vbv_lernwelt/self_evaluation_feedback/tests/test_api.py b/server/vbv_lernwelt/self_evaluation_feedback/tests/test_api.py index 5cbbff04..2ecd42b8 100644 --- a/server/vbv_lernwelt/self_evaluation_feedback/tests/test_api.py +++ b/server/vbv_lernwelt/self_evaluation_feedback/tests/test_api.py @@ -78,9 +78,22 @@ class SelfEvaluationFeedbackAPI(APITestCase): # WHEN response = self.client.post( - reverse("start_self_evaluation_feedback"), + reverse( + "start_self_evaluation_feedback", + args=[learning_unit.id], + ), + { + "feedback_provider_user_id": self.mentor.id, + }, + ) + + # make sure re-starting is a no-op + self.client.post( + reverse( + "start_self_evaluation_feedback", + args=[learning_unit.id], + ), { - "learning_unit_id": learning_unit.id, "feedback_provider_user_id": self.mentor.id, }, ) @@ -110,9 +123,8 @@ class SelfEvaluationFeedbackAPI(APITestCase): # WHEN response = self.client.post( - reverse("start_self_evaluation_feedback"), + reverse("start_self_evaluation_feedback", args=[learning_unit.id]), { - "learning_unit_id": learning_unit.id, "feedback_provider_user_id": not_a_mentor.id, }, ) @@ -120,7 +132,102 @@ class SelfEvaluationFeedbackAPI(APITestCase): # THEN self.assertEqual(response.status_code, 403) - def test_get_provider_self_evaluation_feedback(self): + def test_get_self_evaluation_feedback_as_requester(self): + """Tests endpoint of feedback REQUESTER""" + + # GIVEN + learning_unit = create_learning_unit(course=self.course, circle=self.circle) + + performance_criteria_1 = create_performance_criteria_page( + course=self.course, + course_page=self.course_page, + circle=self.circle, + learning_unit=learning_unit, + ) + + create_performance_criteria_page( + course=self.course, + course_page=self.course_page, + circle=self.circle, + learning_unit=learning_unit, + ) + + completion = mark_course_completion( + page=performance_criteria_1, + user=self.member, + course_session=self.course_session, + completion_status=CourseCompletionStatus.SUCCESS.value, + ) + + self_evaluation_feedback = create_self_evaluation_feedback( + learning_unit=learning_unit, + feedback_requester_user=self.member, + feedback_provider_user=self.mentor, + ) + + CourseCompletionFeedback.objects.create( + feedback=self_evaluation_feedback, + course_completion=completion, + feedback_assessment=CourseCompletionStatus.FAIL.value, + ) + + self.client.force_login(self.member) + + # WHEN + response = self.client.get( + reverse( + "get_self_evaluation_feedback_as_requester", + args=[learning_unit.id], + ) + ) + + # THEN + self.assertEqual(response.status_code, 200) + + feedback = response.data + self.assertEqual(feedback["learning_unit_id"], learning_unit.id) + self.assertEqual(feedback["feedback_submitted"], False) + self.assertEqual(feedback["circle_name"], self.circle.title) + + provider_user = feedback["feedback_provider_user"] + self.assertEqual(provider_user["id"], str(self.mentor.id)) # noqa + self.assertEqual(provider_user["first_name"], self.mentor.first_name) + self.assertEqual(provider_user["last_name"], self.mentor.last_name) + self.assertEqual(provider_user["avatar_url"], self.mentor.avatar_url) + + requester_user = feedback["feedback_requester_user"] + self.assertEqual(requester_user["id"], str(self.member.id)) # noqa + self.assertEqual(requester_user["first_name"], self.member.first_name) + self.assertEqual(requester_user["last_name"], self.member.last_name) + self.assertEqual(requester_user["avatar_url"], self.member.avatar_url) + + self.assertEqual(len(feedback["criteria"]), 2) + + first_criteria = feedback["criteria"][0] + self.assertEqual(first_criteria["course_completion_id"], completion.id) + self.assertEqual(first_criteria["title"], performance_criteria_1.title) + self.assertEqual( + first_criteria["self_assessment"], + CourseCompletionStatus.SUCCESS.value, + ) + self.assertEqual( + first_criteria["feedback_assessment"], CourseCompletionStatus.FAIL.value + ) + + second_criteria = feedback["criteria"][1] + self.assertEqual(second_criteria["course_completion_id"], None) + self.assertEqual(second_criteria["title"], performance_criteria_1.title) + self.assertEqual( + second_criteria["self_assessment"], CourseCompletionStatus.UNKNOWN.value + ) + self.assertEqual( + second_criteria["feedback_assessment"], + CourseCompletionStatus.UNKNOWN.value, + ) + + def test_get_self_evaluation_feedback_as_provider(self): + """Tests endpoint of feedback PROVIDER""" + # GIVEN learning_unit = create_learning_unit(course=self.course, circle=self.circle) @@ -162,7 +269,7 @@ class SelfEvaluationFeedbackAPI(APITestCase): # WHEN response = self.client.get( reverse( - "get_provider_self_evaluation_feedback", + "get_self_evaluation_feedback_as_provider", args=[self_evaluation_feedback.id], ) ) diff --git a/server/vbv_lernwelt/self_evaluation_feedback/urls.py b/server/vbv_lernwelt/self_evaluation_feedback/urls.py index bf81e809..d6d14f76 100644 --- a/server/vbv_lernwelt/self_evaluation_feedback/urls.py +++ b/server/vbv_lernwelt/self_evaluation_feedback/urls.py @@ -2,17 +2,23 @@ from django.urls import path from vbv_lernwelt.self_evaluation_feedback.views import ( add_provider_self_evaluation_feedback, - get_provider_self_evaluation_feedback, + get_self_evaluation_feedback_as_provider, + get_self_evaluation_feedback_as_requester, submit_provider_self_evaluation_feedback, start_self_evaluation_feedback, ) urlpatterns = [ path( - "requester/feedback/start", + "requester//feedback/start", start_self_evaluation_feedback, name="start_self_evaluation_feedback", ), + path( + "requester//feedback", + get_self_evaluation_feedback_as_requester, + name="get_self_evaluation_feedback_as_requester", + ), path( "provider/feedback//submit", submit_provider_self_evaluation_feedback, @@ -25,7 +31,7 @@ urlpatterns = [ ), path( "provider/feedback/", - get_provider_self_evaluation_feedback, - name="get_provider_self_evaluation_feedback", + get_self_evaluation_feedback_as_provider, + name="get_self_evaluation_feedback_as_provider", ), ] diff --git a/server/vbv_lernwelt/self_evaluation_feedback/views.py b/server/vbv_lernwelt/self_evaluation_feedback/views.py index 3f9a352d..25f78e32 100644 --- a/server/vbv_lernwelt/self_evaluation_feedback/views.py +++ b/server/vbv_lernwelt/self_evaluation_feedback/views.py @@ -19,8 +19,7 @@ from vbv_lernwelt.self_evaluation_feedback.serializers import ( @api_view(["POST"]) @permission_classes([IsAuthenticated]) -def start_self_evaluation_feedback(request): - learning_unit_id = request.data.get("learning_unit_id") +def start_self_evaluation_feedback(request, learning_unit_id): feedback_provider_user_id = request.data.get("feedback_provider_user_id") learning_unit = get_object_or_404(LearningUnit, id=learning_unit_id) @@ -33,13 +32,16 @@ def start_self_evaluation_feedback(request): ).exists(): raise PermissionDenied() - SelfEvaluationFeedback.objects.create( + # calling start multiple times shall be a no-op + _, created = SelfEvaluationFeedback.objects.get_or_create( feedback_requester_user=request.user, feedback_provider_user=feedback_provider_user, learning_unit=learning_unit, ) - # TODO: Create notification for feedback_provider_user + if created: + # TODO: Create notification for feedback_provider_user + ... return Response({"success": True}) @@ -59,7 +61,7 @@ def submit_provider_self_evaluation_feedback(request, feedback_id): @api_view(["GET"]) @permission_classes([IsAuthenticated]) -def get_provider_self_evaluation_feedback(request, feedback_id): +def get_self_evaluation_feedback_as_provider(request, feedback_id): feedback = get_object_or_404( SelfEvaluationFeedback, id=feedback_id, feedback_provider_user=request.user ) @@ -67,6 +69,20 @@ def get_provider_self_evaluation_feedback(request, feedback_id): return Response(SelfEvaluationFeedbackSerializer(feedback).data) +@api_view(["GET"]) +@permission_classes([IsAuthenticated]) +def get_self_evaluation_feedback_as_requester(request, learning_unit_id): + learning_unit = get_object_or_404(LearningUnit, id=learning_unit_id) + + feedback = get_object_or_404( + SelfEvaluationFeedback, + learning_unit=learning_unit, + feedback_requester_user=request.user, + ) + + return Response(SelfEvaluationFeedbackSerializer(feedback).data) + + @api_view(["PUT"]) @permission_classes([IsAuthenticated]) def add_provider_self_evaluation_feedback(request, feedback_id):