feat: API to list self evaluation feedback for fb provider
This commit is contained in:
parent
e107c32734
commit
8bf762173a
|
|
@ -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",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -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})
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue