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,
|
||||||
request_course_completion_for_user,
|
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):
|
def raise_example_error(request):
|
||||||
|
|
@ -92,9 +92,12 @@ urlpatterns = [
|
||||||
name='file_upload_local'),
|
name='file_upload_local'),
|
||||||
|
|
||||||
# feedback
|
# 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'),
|
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
|
# testing and debug
|
||||||
path('server/raise_error/',
|
path('server/raise_error/',
|
||||||
user_passes_test(lambda u: u.is_superuser, login_url='/login/')(
|
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
|
from vbv_lernwelt.learnpath.models import Circle
|
||||||
|
|
||||||
|
|
||||||
class FeedbackApiTestCase(APITestCase):
|
class FeedbackApiBaseTestCase(APITestCase):
|
||||||
def setUp(self) -> None:
|
def setUp(self) -> None:
|
||||||
create_default_users()
|
create_default_users()
|
||||||
create_test_course()
|
create_test_course()
|
||||||
|
|
@ -48,6 +48,9 @@ class FeedbackApiTestCase(APITestCase):
|
||||||
username="patrizia.huggel@eiger-versicherungen.ch", password="myvbv1234"
|
username="patrizia.huggel@eiger-versicherungen.ch", password="myvbv1234"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class FeedbackSummaryApiTestCase(FeedbackApiBaseTestCase):
|
||||||
|
|
||||||
def test_can_get_feedback_summary_for_circles(self):
|
def test_can_get_feedback_summary_for_circles(self):
|
||||||
number_basis_feedback = 5
|
number_basis_feedback = 5
|
||||||
number_analyse_feedback = 10
|
number_analyse_feedback = 10
|
||||||
|
|
@ -67,7 +70,7 @@ class FeedbackApiTestCase(APITestCase):
|
||||||
for i in range(number_analyse_feedback):
|
for i in range(number_analyse_feedback):
|
||||||
FeedbackFactory(circle=analyse_circle, course_session=csu.course_session).save()
|
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.status_code, 200)
|
||||||
expected = {
|
expected = {
|
||||||
|
|
@ -94,7 +97,7 @@ class FeedbackApiTestCase(APITestCase):
|
||||||
for i in range(number_analyse_feedback):
|
for i in range(number_analyse_feedback):
|
||||||
FeedbackFactory(circle=analyse_circle, course_session=csu.course_session).save()
|
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.status_code, 200)
|
||||||
expected = {
|
expected = {
|
||||||
|
|
@ -111,7 +114,79 @@ class FeedbackApiTestCase(APITestCase):
|
||||||
analyse_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-analyse")
|
analyse_circle = Circle.objects.get(slug="test-lehrgang-lp-circle-analyse")
|
||||||
FeedbackFactory(circle=analyse_circle, course_session=csu.course_session).save()
|
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.status_code, 200)
|
||||||
self.assertEqual(response.data, {})
|
self.assertEqual(response.data, {})
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,23 @@ from vbv_lernwelt.feedback.models import FeedbackResponse
|
||||||
|
|
||||||
logger = structlog.get_logger(__name__)
|
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"])
|
@api_view(["GET"])
|
||||||
def get_expert_feedbacks_for_course(request, course_id):
|
def get_expert_feedbacks_for_course(request, course_id):
|
||||||
feedbacks = FeedbackResponse.objects.filter(course_session__course_id=course_id, circle__expert__user=request.user)
|
feedbacks = FeedbackResponse.objects.filter(course_session__course_id=course_id, circle__expert__user=request.user)
|
||||||
other = list(FeedbackResponse.objects.all())
|
|
||||||
circle_count = {}
|
circle_count = {}
|
||||||
|
|
||||||
for feedback in feedbacks:
|
for feedback in feedbacks:
|
||||||
|
|
@ -23,3 +35,25 @@ def get_expert_feedbacks_for_course(request, course_id):
|
||||||
circle_count[feedback.circle_id]["count"] += 1
|
circle_count[feedback.circle_id]["count"] += 1
|
||||||
|
|
||||||
return Response(status=200, data=circle_count)
|
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