Refactor feedback response creation
This commit is contained in:
parent
c734bcdc98
commit
66b50d6b1d
|
|
@ -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",
|
||||
},
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
Loading…
Reference in New Issue