diff --git a/client/src/components/FeedbackForm.vue b/client/src/components/FeedbackForm.vue index c53f4c97..b1815020 100644 --- a/client/src/components/FeedbackForm.vue +++ b/client/src/components/FeedbackForm.vue @@ -111,7 +111,7 @@ const sendFeedback = () => { proficiency, would_recommend: wouldRecommend, }, - page: props.page.translation_key, + page: props.page.id, course_session: courseSession.id, }); const variables = reactive({ diff --git a/client/src/components/feedback/feedbackSummary.vue b/client/src/components/feedback/feedbackSummary.vue index c14f3613..967ba7cc 100644 --- a/client/src/components/feedback/feedbackSummary.vue +++ b/client/src/components/feedback/feedbackSummary.vue @@ -65,7 +65,7 @@ function makeSummary( const props = defineProps<{ selctedCircles: string[]; circles: Circle[]; - courseId: number; + courseSessionId: number; url: string; }>(); @@ -73,7 +73,7 @@ const feedbackSummary = ref([]); let feedbackData: FeedbackSummary[] = []; onMounted(async () => { - feedbackData = await itGet(`/api/core/feedback/${props.courseId}/summary`); + feedbackData = await itGet(`/api/core/feedback/${props.courseSessionId}/summary`); feedbackSummary.value = makeSummary( feedbackData, props.circles, diff --git a/client/src/gql/graphql.ts b/client/src/gql/graphql.ts index 27ce1a71..09584176 100644 --- a/client/src/gql/graphql.ts +++ b/client/src/gql/graphql.ts @@ -528,7 +528,7 @@ export type SendFeedbackInput = { clientMutationId?: InputMaybe; course_session: Scalars['Int']['input']; data?: InputMaybe; - page: Scalars['String']['input']; + page: Scalars['Int']['input']; }; export type SendFeedbackPayload = { diff --git a/client/src/gql/schema.graphql b/client/src/gql/schema.graphql index d96790bf..47a08ee2 100644 --- a/client/src/gql/schema.graphql +++ b/client/src/gql/schema.graphql @@ -467,7 +467,7 @@ type ErrorType { } input SendFeedbackInput { - page: String! + page: Int! course_session: Int! data: GenericScalar clientMutationId: String @@ -492,4 +492,4 @@ enum AssignmentCompletionStatus { SUBMITTED EVALUATION_IN_PROGRESS EVALUATION_SUBMITTED -} \ No newline at end of file +} diff --git a/client/src/pages/cockpit/FeedbackPage.vue b/client/src/pages/cockpit/FeedbackPage.vue index 60b78277..14709777 100644 --- a/client/src/pages/cockpit/FeedbackPage.vue +++ b/client/src/pages/cockpit/FeedbackPage.vue @@ -149,7 +149,7 @@ const feedbackData = reactive({ amount: 0, questions: {} }); onMounted(async () => { log.debug("FeedbackPage mounted"); const data = await itGet( - `/api/core/feedback/${courseSession.value.course.id}/${props.circleId}` + `/api/core/feedback/${courseSession.value.id}/${props.circleId}` ); Object.assign(feedbackData, data); }); diff --git a/client/src/pages/cockpit/cockpitPage/FeedbackSubmissionProgress.vue b/client/src/pages/cockpit/cockpitPage/FeedbackSubmissionProgress.vue index c5478b85..05ed963f 100644 --- a/client/src/pages/cockpit/cockpitPage/FeedbackSubmissionProgress.vue +++ b/client/src/pages/cockpit/cockpitPage/FeedbackSubmissionProgress.vue @@ -23,7 +23,7 @@ const numFeedbacks = computed(() => { onMounted(async () => { const data = await itGet( - `/api/core/feedback/${props.courseSession.course.id}/${props.circleId}/` + `/api/core/feedback/${props.courseSession.id}/${props.circleId}/` ); completeFeedbacks.value = data.amount; }); diff --git a/server/config/urls.py b/server/config/urls.py index 0910be58..b6c480f2 100644 --- a/server/config/urls.py +++ b/server/config/urls.py @@ -136,10 +136,10 @@ urlpatterns = [ name='file_upload_local'), # feedback - path(r'api/core/feedback//summary/', get_expert_feedbacks_for_course, + path(r'api/core/feedback//summary/', get_expert_feedbacks_for_course, name='feedback_summary'), - path(r'api/core/feedback///', get_feedback_for_circle, + path(r'api/core/feedback///', get_feedback_for_circle, name='feedback_for_circle'), path("server/graphql/", diff --git a/server/vbv_lernwelt/feedback/graphql/mutations.py b/server/vbv_lernwelt/feedback/graphql/mutations.py index 976429b5..e4216616 100644 --- a/server/vbv_lernwelt/feedback/graphql/mutations.py +++ b/server/vbv_lernwelt/feedback/graphql/mutations.py @@ -1,5 +1,5 @@ import structlog -from graphene import ClientIDMutation, Field, Int, List, String +from graphene import ClientIDMutation, Field, Int, List from graphene.types.generic import GenericScalar from graphene_django.types import ErrorType @@ -20,19 +20,17 @@ class SendFeedback(ClientIDMutation): ) class Input: - page = String(required=True) + page = Int(required=True) course_session = Int(required=True) data = GenericScalar() @classmethod def mutate_and_get_payload(cls, _, info, **input): - page_key = input["page"] + page_id = input["page"] course_session_id = input["course_session"] logger.info("creating feedback") - learning_content = Page.objects.get( - translation_key=page_key, locale__language_code="de-CH" - ) + learning_content = Page.objects.get(id=page_id) circle = learning_content.get_parent().specific course_session = CourseSession.objects.get(id=course_session_id) data = input.get("data", {}) diff --git a/server/vbv_lernwelt/feedback/serializers.py b/server/vbv_lernwelt/feedback/serializers.py index 3be42ed6..7fc8a92c 100644 --- a/server/vbv_lernwelt/feedback/serializers.py +++ b/server/vbv_lernwelt/feedback/serializers.py @@ -15,7 +15,7 @@ class CourseFeedbackSerializer(serializers.Serializer): satisfaction = FeedbackIntegerField() goal_attainment = FeedbackIntegerField() proficiency = serializers.IntegerField(required=False, allow_null=True) - preparation_task_clarity = serializers.BooleanField() + preparation_task_clarity = serializers.BooleanField(required=False, allow_null=True) materials_rating = FeedbackIntegerField() instructor_competence = FeedbackIntegerField() instructor_respect = FeedbackIntegerField() diff --git a/server/vbv_lernwelt/feedback/tests/test_feedback_api.py b/server/vbv_lernwelt/feedback/tests/test_feedback_api.py index c302ca5c..68d2b3f0 100644 --- a/server/vbv_lernwelt/feedback/tests/test_feedback_api.py +++ b/server/vbv_lernwelt/feedback/tests/test_feedback_api.py @@ -126,7 +126,7 @@ class FeedbackSummaryApiTestCase(FeedbackApiBaseTestCase): ).save() response = self.client.get( - f"/api/core/feedback/{csu.course_session.course.id}/summary/" + f"/api/core/feedback/{csu.course_session.id}/summary/" ) self.assertEqual(response.status_code, 200) @@ -159,7 +159,7 @@ class FeedbackSummaryApiTestCase(FeedbackApiBaseTestCase): ).save() response = self.client.get( - f"/api/core/feedback/{csu.course_session.course.id}/summary/" + f"/api/core/feedback/{csu.course_session.id}/summary/" ) self.assertEqual(response.status_code, 200) @@ -180,7 +180,7 @@ class FeedbackSummaryApiTestCase(FeedbackApiBaseTestCase): ).save() response = self.client.get( - f"/api/core/feedback/{csu.course_session.course.id}/summary/" + f"/api/core/feedback/{csu.course_session.id}/summary/" ) self.assertEqual(response.status_code, 200) @@ -235,7 +235,7 @@ class FeedbackDetailApiTestCase(FeedbackApiBaseTestCase): ).save() response = self.client.get( - f"/api/core/feedback/{csu.course_session.course.id}/{circle.id}/" + f"/api/core/feedback/{csu.course_session.id}/{circle.id}/" ) self.maxDiff = None @@ -258,7 +258,7 @@ class FeedbackDetailApiTestCase(FeedbackApiBaseTestCase): FeedbackResponseFactory(circle=circle, course_session=csu.course_session).save() response = self.client.get( - f"/api/core/feedback/{csu.course_session.course.id}/{circle.id}/" + f"/api/core/feedback/{csu.course_session.id}/{circle.id}/" ) self.assertEqual(response.status_code, 200) @@ -274,7 +274,7 @@ class FeedbackDetailApiTestCase(FeedbackApiBaseTestCase): FeedbackResponseFactory(circle=circle, course_session=csu.course_session).save() response = self.client.get( - f"/api/core/feedback/{csu.course_session.course.id}/{circle.id}/" + f"/api/core/feedback/{csu.course_session.id}/{circle.id}/" ) self.assertEqual(response.status_code, 200) diff --git a/server/vbv_lernwelt/feedback/views.py b/server/vbv_lernwelt/feedback/views.py index 5871576f..3a708dca 100644 --- a/server/vbv_lernwelt/feedback/views.py +++ b/server/vbv_lernwelt/feedback/views.py @@ -23,9 +23,9 @@ FEEDBACK_FIELDS = [ @api_view(["GET"]) -def get_expert_feedbacks_for_course(request, course_id): +def get_expert_feedbacks_for_course(request, course_session_id): feedbacks = FeedbackResponse.objects.filter( - course_session__course_id=course_id, circle__expert__user=request.user + course_session__id=course_session_id, circle__expert__user=request.user ).order_by("circle_id") circle_count = [] @@ -43,9 +43,9 @@ def get_expert_feedbacks_for_course(request, course_id): @api_view(["GET"]) -def get_feedback_for_circle(request, course_id, circle_id): +def get_feedback_for_circle(request, course_session_id, circle_id): feedbacks = FeedbackResponse.objects.filter( - course_session__course_id=course_id, + course_session__id=course_session_id, circle__expert__user=request.user, circle_id=circle_id, ).order_by("created_at")