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_COURSE_SESSION_BERN_ID,
|
||||||
TEST_STUDENT1_USER_ID,
|
TEST_STUDENT1_USER_ID,
|
||||||
TEST_TRAINER1_USER_ID,
|
TEST_TRAINER1_USER_ID,
|
||||||
|
TEST_STUDENT2_USER_ID,
|
||||||
|
TEST_STUDENT3_USER_ID,
|
||||||
)
|
)
|
||||||
from vbv_lernwelt.core.models import User
|
from vbv_lernwelt.core.models import User
|
||||||
from vbv_lernwelt.course.creators.test_course import (
|
from vbv_lernwelt.course.creators.test_course import (
|
||||||
create_edoniq_test_result_data,
|
create_edoniq_test_result_data,
|
||||||
create_test_assignment_evaluation_data,
|
create_test_assignment_evaluation_data,
|
||||||
create_test_assignment_submitted_data,
|
create_test_assignment_submitted_data,
|
||||||
|
create_feedback_response_data,
|
||||||
)
|
)
|
||||||
from vbv_lernwelt.course.models import CourseCompletion, CourseSession
|
from vbv_lernwelt.course.models import CourseCompletion, CourseSession
|
||||||
from vbv_lernwelt.feedback.models import FeedbackResponse
|
from vbv_lernwelt.feedback.models import FeedbackResponse
|
||||||
|
from vbv_lernwelt.learnpath.models import LearningContentFeedback
|
||||||
from vbv_lernwelt.notify.models import Notification
|
from vbv_lernwelt.notify.models import Notification
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -33,10 +37,16 @@ from vbv_lernwelt.notify.models import Notification
|
||||||
default=False,
|
default=False,
|
||||||
help="will create edoniq result data for test-student1@example.com",
|
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(
|
def command(
|
||||||
create_assignment_completion,
|
create_assignment_completion,
|
||||||
create_assignment_evaluation,
|
create_assignment_evaluation,
|
||||||
create_edoniq_test_results,
|
create_edoniq_test_results,
|
||||||
|
create_feedback_responses,
|
||||||
):
|
):
|
||||||
print("cypress reset data")
|
print("cypress reset data")
|
||||||
CourseCompletion.objects.all().delete()
|
CourseCompletion.objects.all().delete()
|
||||||
|
|
@ -76,3 +86,66 @@ def command(
|
||||||
assignment_user=User.objects.get(id=TEST_STUDENT1_USER_ID),
|
assignment_user=User.objects.get(id=TEST_STUDENT1_USER_ID),
|
||||||
points=19,
|
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,
|
CourseSessionAssignment,
|
||||||
CourseSessionAttendanceCourse,
|
CourseSessionAttendanceCourse,
|
||||||
)
|
)
|
||||||
|
from vbv_lernwelt.feedback.services import update_feedback_response
|
||||||
from vbv_lernwelt.learnpath.models import (
|
from vbv_lernwelt.learnpath.models import (
|
||||||
Circle,
|
Circle,
|
||||||
LearningContentAssignment,
|
LearningContentAssignment,
|
||||||
|
|
@ -200,6 +201,12 @@ def create_test_course(include_uk=True, include_vv=True, with_sessions=False):
|
||||||
user=student2,
|
user=student2,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
student3 = User.objects.get(email="test-student3@example.com")
|
||||||
|
_csu = CourseSessionUser.objects.create(
|
||||||
|
course_session=cs_bern,
|
||||||
|
user=student3,
|
||||||
|
)
|
||||||
|
|
||||||
return course
|
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):
|
def create_test_course_with_categories(apps=None, schema_editor=None):
|
||||||
if apps is not None:
|
if apps is not None:
|
||||||
Course = apps.get_model("course", "Course")
|
Course = apps.get_model("course", "Course")
|
||||||
|
|
|
||||||
|
|
@ -3,14 +3,13 @@ import structlog
|
||||||
from graphene.types.generic import GenericScalar
|
from graphene.types.generic import GenericScalar
|
||||||
from graphene_django.types import ErrorType
|
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.permissions import has_course_session_access
|
||||||
from vbv_lernwelt.course.services import mark_course_completion
|
|
||||||
from vbv_lernwelt.feedback.graphql.types import (
|
from vbv_lernwelt.feedback.graphql.types import (
|
||||||
FeedbackResponseObjectType as FeedbackResponseType,
|
FeedbackResponseObjectType as FeedbackResponseType,
|
||||||
)
|
)
|
||||||
from vbv_lernwelt.feedback.models import FeedbackResponse
|
|
||||||
from vbv_lernwelt.feedback.serializers import CourseFeedbackSerializer
|
from vbv_lernwelt.feedback.serializers import CourseFeedbackSerializer
|
||||||
|
from vbv_lernwelt.feedback.services import update_feedback_response
|
||||||
from vbv_lernwelt.learnpath.models import LearningContentFeedback
|
from vbv_lernwelt.learnpath.models import LearningContentFeedback
|
||||||
|
|
||||||
logger = structlog.get_logger(__name__)
|
logger = structlog.get_logger(__name__)
|
||||||
|
|
@ -80,53 +79,12 @@ class SendFeedbackMutation(graphene.Mutation):
|
||||||
]
|
]
|
||||||
return SendFeedbackMutation(errors=errors)
|
return SendFeedbackMutation(errors=errors)
|
||||||
|
|
||||||
feedback_response, _ = FeedbackResponse.objects.get_or_create(
|
feedback_response = update_feedback_response(
|
||||||
feedback_user_id=feedback_user_id,
|
feedback_user=info.context.user,
|
||||||
circle_id=circle.id,
|
|
||||||
course_session=course_session,
|
course_session=course_session,
|
||||||
)
|
learning_content_feedback_page=learning_content,
|
||||||
|
submitted=submitted,
|
||||||
original_data = feedback_response.data
|
validated_data=serializer.validated_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,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
return SendFeedbackMutation(feedback_response=feedback_response)
|
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