feat: Feedback member API to get/put lu feedback

This commit is contained in:
Livio Bieri 2024-01-23 11:45:55 +01:00
parent d2352d6166
commit 16cd16212a
3 changed files with 144 additions and 15 deletions

View File

@ -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],
)
)

View File

@ -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/<int:learning_unit_id>/feedback/start",
start_self_evaluation_feedback,
name="start_self_evaluation_feedback",
),
path(
"requester/<int:learning_unit_id>/feedback",
get_self_evaluation_feedback_as_requester,
name="get_self_evaluation_feedback_as_requester",
),
path(
"provider/feedback/<int:feedback_id>/submit",
submit_provider_self_evaluation_feedback,
@ -25,7 +31,7 @@ urlpatterns = [
),
path(
"provider/feedback/<int:feedback_id>",
get_provider_self_evaluation_feedback,
name="get_provider_self_evaluation_feedback",
get_self_evaluation_feedback_as_provider,
name="get_self_evaluation_feedback_as_provider",
),
]

View File

@ -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):