From b1ddedb52a46721593f11774e1a1340a0550d3b2 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 6 Dec 2023 17:11:39 +0100 Subject: [PATCH] Add serializers for different Feedbacks --- cypress/e2e/feedback/feedbackStudent.cy.js | 13 +++--- .../feedback/graphql/mutations.py | 17 ++++++- server/vbv_lernwelt/feedback/serializers.py | 17 ++++++- server/vbv_lernwelt/feedback/services.py | 44 ++++++++++++++----- 4 files changed, 68 insertions(+), 23 deletions(-) diff --git a/cypress/e2e/feedback/feedbackStudent.cy.js b/cypress/e2e/feedback/feedbackStudent.cy.js index 7fe74a9d..86ceca2c 100644 --- a/cypress/e2e/feedback/feedbackStudent.cy.js +++ b/cypress/e2e/feedback/feedbackStudent.cy.js @@ -5,7 +5,6 @@ describe("feedbackStudent.cy.js", () => { beforeEach(() => { cy.manageCommand("cypress_reset"); login("test-student1@example.com", "test"); - cy.visit("/course/test-lehrgang/learn/fahrzeug/feedback"); }); describe("Feedback UK", () => { @@ -178,8 +177,7 @@ describe("feedbackStudent.cy.js", () => { cy.url().should((url) => { expect(url).to.match(/\/reisen\/feedback(\?step=0)?$/); }); - cy.get('[data-cy="introduction"]').should( - "contain", + cy.get('[data-cy="introduction"]').contains( "Wir bitten dich um dein Feedback. Es hilft uns, damit wir deine Lernerlebnisse verbessern können." ); @@ -204,7 +202,7 @@ describe("feedbackStudent.cy.js", () => { (ac) => { expect(ac.submitted).to.be.false; expect(ac.data.satisfaction).to.equal(4); - expect(ac.data.instructor_competence).to.equal(null); + expect(ac.data.course_positive_feedback).to.equal(null); } ); cy.get('[data-cy="radio-3"]').click(); @@ -262,7 +260,7 @@ describe("feedbackStudent.cy.js", () => { // marked complete in circle cy.url().should((url) => { - expect(url).to.match(/\/reisen#lu-transfer?$/); + expect(url).to.match(/\/reisen#lu-transfer-reflexion-feedback?$/); }); cy.reload(); cy.get( @@ -279,13 +277,12 @@ describe("feedbackStudent.cy.js", () => { expect(ac.submitted).to.be.true; expect(ac.data).to.deep.equal({ course_negative_feedback: "Ich bin unzufrieden mit einigen Sachen.", - course_positive_feedback: - "Ich bin zufrieden mit den meisten Dingen.", + course_positive_feedback: "Der Circle ist eigentlich ganz nett.", goal_attainment: 3, preparation_task_clarity: false, proficiency: 80, satisfaction: 4, - would_recommend: true, + would_recommend: false, }); } ); diff --git a/server/vbv_lernwelt/feedback/graphql/mutations.py b/server/vbv_lernwelt/feedback/graphql/mutations.py index ab6b6489..2f58b3d2 100644 --- a/server/vbv_lernwelt/feedback/graphql/mutations.py +++ b/server/vbv_lernwelt/feedback/graphql/mutations.py @@ -7,7 +7,10 @@ from vbv_lernwelt.course.models import CourseSession from vbv_lernwelt.feedback.graphql.types import ( FeedbackResponseObjectType as FeedbackResponseType, ) -from vbv_lernwelt.feedback.serializers import CourseFeedbackSerializer +from vbv_lernwelt.feedback.serializers import ( + CourseFeedbackSerializerUK, + CourseFeedbackSerializerVV, +) from vbv_lernwelt.feedback.services import update_feedback_response from vbv_lernwelt.iam.permissions import has_course_session_access from vbv_lernwelt.learnpath.models import ( @@ -76,7 +79,17 @@ class SendFeedbackMutation(graphene.Mutation): course_session_id=course_session_id, ) - serializer = CourseFeedbackSerializer(data=data) + if learning_content_type == "learnpath.LearningContentFeedbackVV": + serializer = CourseFeedbackSerializerVV(data=data) + elif learning_content_type == "learnpath.LearningContentFeedbackUK": + serializer = CourseFeedbackSerializerUK(data=data) + else: + errors = [ + ErrorType( + field="learningContentType", messages="Invalid learningContentType" + ) + ] + return SendFeedbackMutation(errors=errors) if not serializer.is_valid(): logger.error( diff --git a/server/vbv_lernwelt/feedback/serializers.py b/server/vbv_lernwelt/feedback/serializers.py index bfa9c8a1..0014d565 100644 --- a/server/vbv_lernwelt/feedback/serializers.py +++ b/server/vbv_lernwelt/feedback/serializers.py @@ -13,7 +13,7 @@ class FeedbackIntegerField(serializers.IntegerField): ) -class CourseFeedbackSerializer(serializers.Serializer): +class CourseFeedbackSerializerUK(serializers.Serializer): satisfaction = FeedbackIntegerField() goal_attainment = FeedbackIntegerField() proficiency = serializers.IntegerField(required=False, allow_null=True) @@ -33,6 +33,21 @@ class CourseFeedbackSerializer(serializers.Serializer): ) +class CourseFeedbackSerializerVV(serializers.Serializer): + satisfaction = FeedbackIntegerField() + goal_attainment = FeedbackIntegerField() + proficiency = serializers.IntegerField(required=False, allow_null=True) + preparation_task_clarity = serializers.BooleanField(required=False, allow_null=True) + materials_rating = FeedbackIntegerField() + would_recommend = serializers.BooleanField(required=False, allow_null=True) + course_positive_feedback = serializers.CharField( + required=False, allow_null=True, allow_blank=True + ) + course_negative_feedback = serializers.CharField( + required=False, allow_null=True, allow_blank=True + ) + + class CypressFeedbackResponseSerializer(serializers.ModelSerializer): class Meta: model = FeedbackResponse diff --git a/server/vbv_lernwelt/feedback/services.py b/server/vbv_lernwelt/feedback/services.py index 83f53599..27b0da21 100644 --- a/server/vbv_lernwelt/feedback/services.py +++ b/server/vbv_lernwelt/feedback/services.py @@ -33,18 +33,7 @@ def update_feedback_response( original_data = feedback_response.data updated_data = validated_data - initial_data = { - "satisfaction": None, - "goal_attainment": None, - "proficiency": None, - "preparation_task_clarity": None, - "instructor_competence": None, - "instructor_respect": None, - "instructor_open_feedback": "", - "would_recommend": None, - "course_negative_feedback": "", - "course_positive_feedback": "", - } + initial_data = initial_data_for_feedback_page(learning_content_feedback_page) merged_data = initial_data | { key: updated_data[key] @@ -78,3 +67,34 @@ def update_feedback_response( ) return feedback_response + + +def initial_data_for_feedback_page( + learning_content_feedback_page: Union[ + LearningContentFeedbackUK, LearningContentFeedbackVV + ] +): + if hasattr(learning_content_feedback_page, "learningcontentfeedbackuk"): + return { + "satisfaction": None, + "goal_attainment": None, + "proficiency": None, + "preparation_task_clarity": None, + "instructor_competence": None, + "instructor_respect": None, + "instructor_open_feedback": "", + "would_recommend": None, + "course_negative_feedback": "", + "course_positive_feedback": "", + } + if hasattr(learning_content_feedback_page, "learningcontentfeedbackvv"): + return { + "satisfaction": None, + "goal_attainment": None, + "proficiency": None, + "preparation_task_clarity": None, + "would_recommend": None, + "course_negative_feedback": "", + "course_positive_feedback": "", + } + return {}