Refactor feedback response creation

This commit is contained in:
Daniel Egger 2023-09-26 17:05:17 +02:00
parent c734bcdc98
commit 66b50d6b1d
4 changed files with 190 additions and 49 deletions

View File

@ -5,15 +5,19 @@ from vbv_lernwelt.core.constants import (
TEST_COURSE_SESSION_BERN_ID,
TEST_STUDENT1_USER_ID,
TEST_TRAINER1_USER_ID,
TEST_STUDENT2_USER_ID,
TEST_STUDENT3_USER_ID,
)
from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.creators.test_course import (
create_edoniq_test_result_data,
create_test_assignment_evaluation_data,
create_test_assignment_submitted_data,
create_feedback_response_data,
)
from vbv_lernwelt.course.models import CourseCompletion, CourseSession
from vbv_lernwelt.feedback.models import FeedbackResponse
from vbv_lernwelt.learnpath.models import LearningContentFeedback
from vbv_lernwelt.notify.models import Notification
@ -33,10 +37,16 @@ from vbv_lernwelt.notify.models import Notification
default=False,
help="will create edoniq result data for test-student1@example.com",
)
@click.option(
"--create-feedback-responses/--no-create-feedback-responses",
default=False,
help="will create feedback response data",
)
def command(
create_assignment_completion,
create_assignment_evaluation,
create_edoniq_test_results,
create_feedback_responses,
):
print("cypress reset data")
CourseCompletion.objects.all().delete()
@ -76,3 +86,66 @@ def command(
assignment_user=User.objects.get(id=TEST_STUDENT1_USER_ID),
points=19,
)
if create_feedback_responses:
print("create_feedback_responses")
course_session = CourseSession.objects.get(id=TEST_COURSE_SESSION_BERN_ID)
learning_content_feedback_page = LearningContentFeedback.objects.get(
slug="test-lehrgang-lp-circle-fahrzeug-lc-feedback"
)
create_feedback_response_data(
feedback_user=User.objects.get(id=TEST_STUDENT1_USER_ID),
course_session=course_session,
learning_content_feedback_page=learning_content_feedback_page,
submitted=True,
feedback_data={
"satisfaction": 4,
"goal_attainment": 3,
"proficiency": 80,
"preparation_task_clarity": True,
"instructor_competence": 4,
"instructor_respect": 4,
"instructor_open_feedback": "Super Kurs!",
"would_recommend": True,
"course_negative_feedback": "Nichts Schlechtes",
"course_positive_feedback": "Nur Gutes.",
},
)
create_feedback_response_data(
feedback_user=User.objects.get(id=TEST_STUDENT2_USER_ID),
course_session=course_session,
learning_content_feedback_page=learning_content_feedback_page,
submitted=True,
feedback_data={
"satisfaction": 4,
"goal_attainment": 4,
"proficiency": 100,
"preparation_task_clarity": True,
"instructor_competence": 4,
"instructor_respect": 4,
"instructor_open_feedback": "Super, bin begeistert",
"would_recommend": True,
"course_negative_feedback": "Es wäre praktisch, Zugang zu einer FAQ zu haben.",
"course_positive_feedback": "Das Beispiel mit der Katze fand ich sehr gut veranschaulicht!",
},
)
create_feedback_response_data(
feedback_user=User.objects.get(id=TEST_STUDENT3_USER_ID),
course_session=course_session,
learning_content_feedback_page=learning_content_feedback_page,
submitted=True,
feedback_data={
"satisfaction": 2,
"goal_attainment": 2,
"proficiency": 40,
"preparation_task_clarity": True,
"instructor_competence": 2,
"instructor_respect": 2,
"instructor_open_feedback": "Ok, enspricht den Erwartungen",
"would_recommend": False,
"course_negative_feedback": "Mehr Videos wären schön.",
"course_positive_feedback": "Die Präsentation war super",
},
)

View File

@ -50,6 +50,7 @@ from vbv_lernwelt.course_session.models import (
CourseSessionAssignment,
CourseSessionAttendanceCourse,
)
from vbv_lernwelt.feedback.services import update_feedback_response
from vbv_lernwelt.learnpath.models import (
Circle,
LearningContentAssignment,
@ -200,6 +201,12 @@ def create_test_course(include_uk=True, include_vv=True, with_sessions=False):
user=student2,
)
student3 = User.objects.get(email="test-student3@example.com")
_csu = CourseSessionUser.objects.create(
course_session=cs_bern,
user=student3,
)
return course
@ -286,6 +293,36 @@ def create_edoniq_test_result_data(
)
def create_feedback_response_data(
course_session,
feedback_user,
learning_content_feedback_page,
submitted=True,
feedback_data=None,
):
if feedback_data is None:
feedback_data = {
"satisfaction": 4,
"goal_attainment": 3,
"proficiency": 80,
"preparation_task_clarity": True,
"instructor_competence": 4,
"instructor_respect": 4,
"instructor_open_feedback": "Super Kurs!",
"would_recommend": True,
"course_negative_feedback": "Nichts Schlechtes",
"course_positive_feedback": "Nur Gutes.",
}
return update_feedback_response(
feedback_user=feedback_user,
course_session=course_session,
learning_content_feedback_page=learning_content_feedback_page,
submitted=submitted,
validated_data=feedback_data,
)
def create_test_course_with_categories(apps=None, schema_editor=None):
if apps is not None:
Course = apps.get_model("course", "Course")

View File

@ -3,14 +3,13 @@ import structlog
from graphene.types.generic import GenericScalar
from graphene_django.types import ErrorType
from vbv_lernwelt.course.models import CourseCompletionStatus, CourseSession
from vbv_lernwelt.course.models import CourseSession
from vbv_lernwelt.course.permissions import has_course_session_access
from vbv_lernwelt.course.services import mark_course_completion
from vbv_lernwelt.feedback.graphql.types import (
FeedbackResponseObjectType as FeedbackResponseType,
)
from vbv_lernwelt.feedback.models import FeedbackResponse
from vbv_lernwelt.feedback.serializers import CourseFeedbackSerializer
from vbv_lernwelt.feedback.services import update_feedback_response
from vbv_lernwelt.learnpath.models import LearningContentFeedback
logger = structlog.get_logger(__name__)
@ -80,53 +79,12 @@ class SendFeedbackMutation(graphene.Mutation):
]
return SendFeedbackMutation(errors=errors)
feedback_response, _ = FeedbackResponse.objects.get_or_create(
feedback_user_id=feedback_user_id,
circle_id=circle.id,
feedback_response = update_feedback_response(
feedback_user=info.context.user,
course_session=course_session,
)
original_data = feedback_response.data
updated_data = serializer.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": "",
}
merged_data = initial_data | {
key: updated_data[key]
if updated_data.get(key, "") != ""
else original_data.get(key)
for key in initial_data.keys()
}
feedback_response.data = merged_data
if submitted:
feedback_response.submitted = submitted
feedback_response.save()
if submitted:
mark_course_completion(
user=info.context.user,
page=learning_content,
course_session=course_session,
completion_status=CourseCompletionStatus.SUCCESS.value,
)
logger.info(
"feedback successfully created",
label="feedback",
feedback_user_id=feedback_user_id,
circle_title=circle.title,
course_session_id=course_session_id,
learning_content_feedback_page=learning_content,
submitted=submitted,
validated_data=serializer.validated_data,
)
return SendFeedbackMutation(feedback_response=feedback_response)

View File

@ -0,0 +1,73 @@
import structlog
from vbv_lernwelt.core.models import User
from vbv_lernwelt.course.models import CourseSession, CourseCompletionStatus
from vbv_lernwelt.course.services import mark_course_completion
from vbv_lernwelt.feedback.models import FeedbackResponse
from vbv_lernwelt.learnpath.models import LearningContentFeedback
logger = structlog.get_logger(__name__)
def update_feedback_response(
feedback_user: User,
course_session: CourseSession,
learning_content_feedback_page: LearningContentFeedback,
submitted: bool,
validated_data: dict,
):
circle = learning_content_feedback_page.get_circle()
feedback_response, _ = FeedbackResponse.objects.get_or_create(
feedback_user_id=feedback_user.id,
circle_id=circle.id,
course_session=course_session,
)
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": "",
}
merged_data = initial_data | {
key: updated_data[key]
if updated_data.get(key, "") != ""
else original_data.get(key)
for key in initial_data.keys()
}
feedback_response.data = merged_data
# save the response before completion mark,
# because who knows what could happen in between...
if submitted:
feedback_response.submitted = submitted
feedback_response.save()
if submitted:
mark_course_completion(
user=feedback_user,
page=learning_content_feedback_page,
course_session=course_session,
completion_status=CourseCompletionStatus.SUCCESS.value,
)
logger.info(
"feedback successfully created",
label="feedback",
feedback_user_id=feedback_user.id,
circle_title=circle.title,
course_session_id=course_session.id,
)
return feedback_response