feat: API to list self evaluation feedback for fb provider

This commit is contained in:
Livio Bieri 2024-01-22 15:33:31 +01:00
parent e107c32734
commit 8bf762173a
6 changed files with 172 additions and 21 deletions

View File

@ -0,0 +1,17 @@
# Generated by Django 3.2.20 on 2024-01-22 13:20
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("self_evaluation_feedback", "0001_initial"),
]
operations = [
migrations.RenameField(
model_name="coursecompletionfeedback",
old_name="requester_evaluation",
new_name="course_completion",
),
]

View File

@ -24,9 +24,9 @@ class CourseCompletionFeedback(models.Model):
feedback = models.ForeignKey(SelfEvaluationFeedback, on_delete=models.CASCADE) feedback = models.ForeignKey(SelfEvaluationFeedback, on_delete=models.CASCADE)
# the course completion has to be evaluated by the feedback provider # the course completion has to be evaluated by the feedback provider
requester_evaluation = models.ForeignKey(CourseCompletion, on_delete=models.CASCADE) course_completion = models.ForeignKey(CourseCompletion, on_delete=models.CASCADE)
provider_evaluation_feedback = models.CharField( feedback_assessment = models.CharField(
max_length=255, max_length=255,
choices=[(status, status.value) for status in CourseCompletionStatus], choices=[(status, status.value) for status in CourseCompletionStatus],
default=CourseCompletionStatus.UNKNOWN.value, default=CourseCompletionStatus.UNKNOWN.value,

View File

@ -4,7 +4,11 @@ from rest_framework import serializers
from vbv_lernwelt.competence.models import PerformanceCriteria from vbv_lernwelt.competence.models import PerformanceCriteria
from vbv_lernwelt.core.serializers import UserSerializer from vbv_lernwelt.core.serializers import UserSerializer
from vbv_lernwelt.self_evaluation_feedback.models import SelfEvaluationFeedback from vbv_lernwelt.course.models import CourseCompletion, CourseCompletionStatus
from vbv_lernwelt.self_evaluation_feedback.models import (
CourseCompletionFeedback,
SelfEvaluationFeedback,
)
class SelfEvaluationFeedbackSerializer(serializers.ModelSerializer): class SelfEvaluationFeedbackSerializer(serializers.ModelSerializer):
@ -14,11 +18,14 @@ class SelfEvaluationFeedbackSerializer(serializers.ModelSerializer):
learning_unit_id = serializers.PrimaryKeyRelatedField( learning_unit_id = serializers.PrimaryKeyRelatedField(
read_only=True, source="learning_unit" read_only=True, source="learning_unit"
) )
feedback_id = serializers.PrimaryKeyRelatedField(
read_only=True, source="course_completion_feedback"
)
class Meta: class Meta:
model = SelfEvaluationFeedback model = SelfEvaluationFeedback
fields = [ fields = [
"id", "feedback_id",
"learning_unit_id", "learning_unit_id",
"feedback_submitted", "feedback_submitted",
"feedback_requester_user", "feedback_requester_user",
@ -31,10 +38,39 @@ class SelfEvaluationFeedbackSerializer(serializers.ModelSerializer):
PerformanceCriteria PerformanceCriteria
] = obj.learning_unit.performancecriteria_set.all() ] = obj.learning_unit.performancecriteria_set.all()
return [ criteria = []
{
"id": criteria.id, for pc in performance_criteria:
"title": criteria.title, # requester self assessment
} completion = CourseCompletion.objects.filter(
for criteria in performance_criteria page_id=pc.id,
] user=obj.feedback_requester_user,
).first()
self_assessment = (
completion.completion_status
if completion
else CourseCompletionStatus.UNKNOWN.value
)
# provider feedback assessment
feedback = CourseCompletionFeedback.objects.filter(
course_completion=completion
).first()
feedback_assessment = (
feedback.feedback_assessment
if feedback
else CourseCompletionStatus.UNKNOWN.value
)
criteria.append(
{
"course_completion_id": completion.id if completion else None,
"title": pc.title,
"self_assessment": self_assessment,
"feedback_assessment": feedback_assessment,
}
)
return criteria

View File

@ -10,10 +10,13 @@ from vbv_lernwelt.course.creators.test_utils import (
create_performance_criteria_page, create_performance_criteria_page,
create_user, create_user,
) )
from vbv_lernwelt.course.models import CourseSessionUser from vbv_lernwelt.course.models import CourseCompletionStatus, CourseSessionUser
from vbv_lernwelt.course.services import mark_course_completion from vbv_lernwelt.course.services import mark_course_completion
from vbv_lernwelt.learning_mentor.models import LearningMentor from vbv_lernwelt.learning_mentor.models import LearningMentor
from vbv_lernwelt.self_evaluation_feedback.models import SelfEvaluationFeedback from vbv_lernwelt.self_evaluation_feedback.models import (
CourseCompletionFeedback,
SelfEvaluationFeedback,
)
def create_self_evaluation_feedback( def create_self_evaluation_feedback(
@ -53,8 +56,6 @@ class SelfEvaluationFeedbackAPI(APITestCase):
learning_mentor.participants.add(member_csu) learning_mentor.participants.add(member_csu)
self.client.force_login(self.member)
def test_start_self_evaluation_feedback(self): def test_start_self_evaluation_feedback(self):
# GIVEN # GIVEN
learning_unit = create_learning_unit(course=self.course, circle=self.circle) learning_unit = create_learning_unit(course=self.course, circle=self.circle)
@ -73,6 +74,8 @@ class SelfEvaluationFeedbackAPI(APITestCase):
completion_status="SUCCESS", completion_status="SUCCESS",
) )
self.client.force_login(self.member)
# WHEN # WHEN
response = self.client.post( response = self.client.post(
reverse("start_self_evaluation_feedback"), reverse("start_self_evaluation_feedback"),
@ -103,6 +106,8 @@ class SelfEvaluationFeedbackAPI(APITestCase):
learning_unit = create_learning_unit(course=self.course, circle=self.circle) learning_unit = create_learning_unit(course=self.course, circle=self.circle)
not_a_mentor = create_user("not_a_mentor") not_a_mentor = create_user("not_a_mentor")
self.client.force_login(self.member)
# WHEN # WHEN
response = self.client.post( response = self.client.post(
reverse("start_self_evaluation_feedback"), reverse("start_self_evaluation_feedback"),
@ -114,3 +119,87 @@ class SelfEvaluationFeedbackAPI(APITestCase):
# THEN # THEN
self.assertEqual(response.status_code, 403) self.assertEqual(response.status_code, 403)
def test_list_self_evaluation_feedback_provider(self):
# 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,
)
feedback = create_self_evaluation_feedback(
learning_unit=learning_unit,
feedback_requester_user=self.member,
feedback_provider_user=self.mentor,
)
CourseCompletionFeedback.objects.create(
feedback=feedback,
course_completion=completion,
feedback_assessment=CourseCompletionStatus.FAIL.value,
)
self.client.force_login(self.mentor)
# WHEN
response = self.client.get(reverse("list_self_evaluation_feedbacks_provider"))
# THEN
self.assertEqual(response.status_code, 200)
self.assertEqual(len(response.data), 1)
self.assertEqual(response.data[0]["learning_unit_id"], learning_unit.id)
provider_user = response.data[0]["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 = response.data[0]["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(response.data[0]["criteria"]), 2)
first_criteria = response.data[0]["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 = response.data[0]["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,
)

View File

@ -1,11 +1,19 @@
from django.urls import path from django.urls import path
from .views import start_self_evaluation_feedback from vbv_lernwelt.self_evaluation_feedback.views import (
list_self_evaluation_feedbacks_provider,
start_self_evaluation_feedback,
)
urlpatterns = [ urlpatterns = [
path( path(
"start-feedback", "reqeuster/start-feedback",
start_self_evaluation_feedback, start_self_evaluation_feedback,
name="start_self_evaluation_feedback", name="start_self_evaluation_feedback",
), ),
path(
"provider/list-feedbacks",
list_self_evaluation_feedbacks_provider,
name="list_self_evaluation_feedbacks_provider",
),
] ]

View File

@ -8,6 +8,9 @@ from vbv_lernwelt.core.models import User
from vbv_lernwelt.learning_mentor.models import LearningMentor from vbv_lernwelt.learning_mentor.models import LearningMentor
from vbv_lernwelt.learnpath.models import LearningUnit from vbv_lernwelt.learnpath.models import LearningUnit
from vbv_lernwelt.self_evaluation_feedback.models import SelfEvaluationFeedback from vbv_lernwelt.self_evaluation_feedback.models import SelfEvaluationFeedback
from vbv_lernwelt.self_evaluation_feedback.serializers import (
SelfEvaluationFeedbackSerializer,
)
@api_view(["POST"]) @api_view(["POST"])
@ -39,11 +42,9 @@ def start_self_evaluation_feedback(request):
@api_view(["GET"]) @api_view(["GET"])
@permission_classes([IsAuthenticated]) @permission_classes([IsAuthenticated])
def list_self_evaluation_feedback(request): def list_self_evaluation_feedbacks_provider(request):
feedbacks = SelfEvaluationFeedback.objects.filter( feedbacks = SelfEvaluationFeedback.objects.filter(
feedback_provider_user=request.user feedback_provider_user=request.user
) )
# TODO continue here return Response(SelfEvaluationFeedbackSerializer(feedbacks, many=True).data)
return Response({"success": True})