diff --git a/server/vbv_lernwelt/course/admin.py b/server/vbv_lernwelt/course/admin.py index afaa928f..5777b9be 100644 --- a/server/vbv_lernwelt/course/admin.py +++ b/server/vbv_lernwelt/course/admin.py @@ -1,7 +1,10 @@ from django.contrib import admin from vbv_lernwelt.course.models import Course, CourseSession, CourseSessionUser -from vbv_lernwelt.feedback.services import get_feedbacks_for_course_sessions, get_feedbacks_for_courses +from vbv_lernwelt.feedback.services import ( + get_feedbacks_for_course_sessions, + get_feedbacks_for_courses, +) from vbv_lernwelt.learnpath.models import Circle get_feedbacks_for_course_sessions.short_description = "Feedback export" diff --git a/server/vbv_lernwelt/feedback/services.py b/server/vbv_lernwelt/feedback/services.py index 7e84915b..cd597e4e 100644 --- a/server/vbv_lernwelt/feedback/services.py +++ b/server/vbv_lernwelt/feedback/services.py @@ -32,6 +32,34 @@ VV_FEEDBACK_QUESTIONS = [ ("course_negative_feedback", "Wo siehst du Verbesserungspotential?"), ] +UK_FEEDBACK_QUESTIONS = [ + ("satisfaction", "Zufriedenheit insgesamt"), + ("goal_attainment", "Zielerreichung insgesamt"), + ( + "proficiency", + "Wie beurteilst du deine Sicherheit bezüglichen den Themen nach dem Kurs?", + ), + ( + "preparation_task_clarity", + "Waren die Vorbereitungsaufträge klar und verständlich?", + ), + ( + "instructor_competence", + "Wie beurteilst du die Themensicherheit und Fachkompetenz des Kursleiters/der Kursleiterin?", + ), + ( + "instructor_respect", + "Wurden Fragen und Anregungen der Kursteilnehmenden ernst genommen und aufgegriffen?", + ), + ( + "instructor_open_feedback", + "Was möchtest du dem Kursleiter/der Kursleiterin sonst noch sagen?", + ), + ("would_recommend", "Würdest du den Kurs weiterempfehlen?"), + ("course_positive_feedback", "Was hat dir besonders gut gefallen?"), + ("course_negative_feedback", "Wo siehst du Verbesserungspotential?"), +] + def update_feedback_response( feedback_user: User, @@ -130,7 +158,7 @@ def export_feedback(course_session_ids: list[str], save_as_file: bool): feedbacks = FeedbackResponse.objects.filter( course_session_id__in=course_session_ids, submitted=True, - ).order_by("circle", "updated_at") + ).order_by("circle", "course_session", "updated_at") grouped_feedbacks = groupby(feedbacks, key=attrgetter("circle")) for circle, group_feedbacks in grouped_feedbacks: @@ -158,22 +186,35 @@ def export_feedback(course_session_ids: list[str], save_as_file: bool): def _create_sheet(wb: Workbook, title: str, data: list[FeedbackResponse]): sheet = wb.create_sheet(title=title) + + if len(data) == 0: + return sheet + + # we instruct the users not to mix exports of different courses, so we can assume the questions are the same and of the first type + question_data = ( + UK_FEEDBACK_QUESTIONS + if data[0].data["feedback_type"] == "uk" + else VV_FEEDBACK_QUESTIONS + ) + # add header - sheet.cell(row=1, column=1, value="Datum") - questions = [q[1] for q in VV_FEEDBACK_QUESTIONS] - for col_idx, title in enumerate(questions, start=2): + sheet.cell(row=1, column=1, value="Durchführung") + sheet.cell(row=1, column=2, value="Datum") + questions = [q[1] for q in question_data] + for col_idx, title in enumerate(questions, start=3): sheet.cell(row=1, column=col_idx, value=title) - _add_rows(sheet, data) + _add_rows(sheet, data, question_data) return sheet -def _add_rows(sheet, data): +def _add_rows(sheet, data, question_data): for row_idx, feedback in enumerate(data, start=2): + sheet.cell(row=row_idx, column=1, value=feedback.course_session.title) sheet.cell( - row=row_idx, column=1, value=feedback.updated_at.date().strftime("%d.%m.%Y") + row=row_idx, column=2, value=feedback.updated_at.date().strftime("%d.%m.%Y") ) - for col_idx, question in enumerate(VV_FEEDBACK_QUESTIONS, start=2): + for col_idx, question in enumerate(question_data, start=3): response = feedback.data.get(question[0], "") sheet.cell(row=row_idx, column=col_idx, value=response) @@ -201,7 +242,9 @@ def _handle_feedback_export_action(course_seesions, file_name): response = HttpResponse( content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ) - response["Content-Disposition"] = f"attachment; filename={make_export_filename(file_name)}" + response[ + "Content-Disposition" + ] = f"attachment; filename={make_export_filename(file_name)}" response.write(excel_bytes) return response