WIP: Add single feedback endpoint
This commit is contained in:
parent
46710d29b9
commit
88848aa292
|
|
@ -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/')(
|
||||
|
|
|
|||
|
|
@ -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, {})
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue