WIP: Add single feedback endpoint

This commit is contained in:
Christian Cueni 2023-01-24 11:29:20 +01:00
parent 46710d29b9
commit 88848aa292
3 changed files with 119 additions and 7 deletions

View File

@ -35,7 +35,7 @@ from vbv_lernwelt.course.views import (
request_course_completion,
request_course_completion_for_user,
)
from vbv_lernwelt.feedback.views import get_expert_feedbacks_for_course
from vbv_lernwelt.feedback.views import get_expert_feedbacks_for_course, get_feedback_for_circle
def raise_example_error(request):
@ -92,9 +92,12 @@ urlpatterns = [
name='file_upload_local'),
# feedback
path(r'api/core/feedback/summary/<str:course_id>/', get_expert_feedbacks_for_course,
path(r'api/core/feedback/<str:course_id>/summary/', get_expert_feedbacks_for_course,
name='feedback_summary'),
path(r'api/core/feedback/<str:course_id>/<str:circle_id>/', get_feedback_for_circle,
name='feedback_for_circle'),
# testing and debug
path('server/raise_error/',
user_passes_test(lambda u: u.is_superuser, login_url='/login/')(

View File

@ -9,7 +9,7 @@ from vbv_lernwelt.feedback.factories import FeedbackFactory
from vbv_lernwelt.learnpath.models import Circle
class FeedbackApiTestCase(APITestCase):
class FeedbackApiBaseTestCase(APITestCase):
def setUp(self) -> None:
create_default_users()
create_test_course()
@ -48,6 +48,9 @@ class FeedbackApiTestCase(APITestCase):
username="patrizia.huggel@eiger-versicherungen.ch", password="myvbv1234"
)
class FeedbackSummaryApiTestCase(FeedbackApiBaseTestCase):
def test_can_get_feedback_summary_for_circles(self):
number_basis_feedback = 5
number_analyse_feedback = 10
@ -67,7 +70,7 @@ class FeedbackApiTestCase(APITestCase):
for i in range(number_analyse_feedback):
FeedbackFactory(circle=analyse_circle, course_session=csu.course_session).save()
response = self.client.get(f"/api/core/feedback/summary/{csu.course_session.course.id}/")
response = self.client.get(f"/api/core/feedback/{csu.course_session.course.id}/summary/")
self.assertEqual(response.status_code, 200)
expected = {
@ -94,7 +97,7 @@ class FeedbackApiTestCase(APITestCase):
for i in range(number_analyse_feedback):
FeedbackFactory(circle=analyse_circle, course_session=csu.course_session).save()
response = self.client.get(f"/api/core/feedback/summary/{csu.course_session.course.id}/")
response = self.client.get(f"/api/core/feedback/{csu.course_session.course.id}/summary/")
self.assertEqual(response.status_code, 200)
expected = {
@ -111,7 +114,79 @@ class FeedbackApiTestCase(APITestCase):
analyse_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-analyse")
FeedbackFactory(circle=analyse_circle, course_session=csu.course_session).save()
response = self.client.get(f"/api/core/feedback/summary/{csu.course_session.course.id}/")
response = self.client.get(f"/api/core/feedback/{csu.course_session.course.id}/summary/")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, {})
class FeedbackDetailApiTestCase(FeedbackApiBaseTestCase):
def test_can_receive_feedback(self):
expected = {
"satisfaction": [1, 4, 2],
"goal_attainment": [2, 4, 3],
"proficiency": [20, 60, 80],
"received_materials": [True, False, True],
"materials_rating": [3, 2, 1],
"instructor_competence": [1, 2, 3],
"instructor_open_feedback": ["super", "ok", "naja"],
"would_recommend": [False, True, False],
"course_positive_feedback": ["Bla", "Katze", "Hund"],
"course_negative_feedback": ["Maus", "Hase", "Fuchs"],
}
csu = CourseSessionUser.objects.get(
course_session=self.course_session,
user=User.objects.get(username="patrizia.huggel@eiger-versicherungen.ch"),
role=CourseSessionUser.Role.EXPERT,
)
circle = Circle.objects.get(slug="test-lehrgang-lp-circle-analyse")
for i in range(3):
FeedbackFactory(
circle=circle,
course_session=csu.course_session,
satisfaction=expected["satisfaction"][i],
goal_attainment=expected["goal_attainment"][i],
proficiency=expected["proficiency"][i],
received_materials=expected["received_materials"][i],
materials_rating=expected["materials_rating"][i],
instructor_competence=expected["instructor_competence"][i],
instructor_open_feedback=expected["instructor_open_feedback"][i],
would_recommend=expected["would_recommend"][i],
course_positive_feedback=expected["course_positive_feedback"][i],
course_negative_feedback=expected["course_negative_feedback"][i],
).save()
response = self.client.get(f"/api/core/feedback/{csu.course_session.course.id}/{circle.id}/")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, expected)
def test_cannot_receive_feedback_from_other_circle(self):
csu = CourseSessionUser.objects.get(
course_session=self.course_session,
user=User.objects.get(username="patrizia.huggel@eiger-versicherungen.ch"),
role=CourseSessionUser.Role.EXPERT,
)
circle = Circle.objects.get(slug="test-lehrgang-lp-circle-basis")
FeedbackFactory(circle=circle, course_session=csu.course_session).save()
response = self.client.get(f"/api/core/feedback/{csu.course_session.course.id}/{circle.id}/")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, {})
def test_student_cannot_receive_feedback(self):
self.client.login(username="student", password="test")
csu = CourseSessionUser.objects.get(
course_session=self.course_session,
user=self.user,
)
circle = Circle.objects.get(slug="test-lehrgang-lp-circle-analyse")
FeedbackFactory(circle=circle, course_session=csu.course_session).save()
response = self.client.get(f"/api/core/feedback/{csu.course_session.course.id}/{circle.id}/")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, {})

View File

@ -6,11 +6,23 @@ from vbv_lernwelt.feedback.models import FeedbackResponse
logger = structlog.get_logger(__name__)
FEEDBACK_FIELDS = [
"satisfaction",
"goal_attainment",
"proficiency",
"received_materials",
"materials_rating",
"instructor_competence",
"instructor_open_feedback",
"would_recommend",
"course_positive_feedback",
"course_negative_feedback",
]
@api_view(["GET"])
def get_expert_feedbacks_for_course(request, course_id):
feedbacks = FeedbackResponse.objects.filter(course_session__course_id=course_id, circle__expert__user=request.user)
other = list(FeedbackResponse.objects.all())
circle_count = {}
for feedback in feedbacks:
@ -23,3 +35,25 @@ def get_expert_feedbacks_for_course(request, course_id):
circle_count[feedback.circle_id]["count"] += 1
return Response(status=200, data=circle_count)
@api_view(["GET"])
def get_feedback_for_circle(request, course_id, circle_id):
feedbacks = FeedbackResponse.objects.filter(course_session__course_id=course_id,
circle__expert__user=request.user,
circle_id=circle_id)
# I guess this is ok for the üK case
feedback_data = {}
if len(feedbacks) == 0:
return Response(status=200, data=feedback_data)
for field in FEEDBACK_FIELDS:
feedback_data[field] = []
for feedback in feedbacks:
for field in FEEDBACK_FIELDS:
feedback_data[field].append(getattr(feedback, field))
return Response(status=200, data=feedback_data)