From 93efd7333ecda943d75c7653224927eb8aba49e0 Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Wed, 28 Feb 2024 14:57:19 +0100 Subject: [PATCH] Handle export for multiple course sessions --- server/vbv_lernwelt/course/admin.py | 8 +++--- .../management/commands/export_feedback.py | 2 +- server/vbv_lernwelt/feedback/services.py | 27 +++++++++++++------ 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/server/vbv_lernwelt/course/admin.py b/server/vbv_lernwelt/course/admin.py index 1285f3e8..afaa928f 100644 --- a/server/vbv_lernwelt/course/admin.py +++ b/server/vbv_lernwelt/course/admin.py @@ -1,10 +1,11 @@ from django.contrib import admin from vbv_lernwelt.course.models import Course, CourseSession, CourseSessionUser -from vbv_lernwelt.feedback.services import get_feedbacks_for_course +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.short_description = "Feedback export" +get_feedbacks_for_course_sessions.short_description = "Feedback export" +get_feedbacks_for_courses.short_description = "Feedback export" @admin.register(Course) @@ -15,6 +16,7 @@ class CourseAdmin(admin.ModelAdmin): "category_name", "slug", ] + actions = [get_feedbacks_for_courses] @admin.register(CourseSession) @@ -29,7 +31,7 @@ class CourseSessionAdmin(admin.ModelAdmin): "created_at", "updated_at", ] - actions = [get_feedbacks_for_course] + actions = [get_feedbacks_for_course_sessions] @admin.register(CourseSessionUser) diff --git a/server/vbv_lernwelt/feedback/management/commands/export_feedback.py b/server/vbv_lernwelt/feedback/management/commands/export_feedback.py index f0cae06b..790661d9 100644 --- a/server/vbv_lernwelt/feedback/management/commands/export_feedback.py +++ b/server/vbv_lernwelt/feedback/management/commands/export_feedback.py @@ -15,4 +15,4 @@ logger = structlog.get_logger(__name__) ) def command(course_session_id, save_as_file): # using the output from call_command was a bit cumbersome, so this is just a wrapper for the actual function - export_feedback(course_session_id, save_as_file) + export_feedback([course_session_id], save_as_file) diff --git a/server/vbv_lernwelt/feedback/services.py b/server/vbv_lernwelt/feedback/services.py index 265139d1..7e84915b 100644 --- a/server/vbv_lernwelt/feedback/services.py +++ b/server/vbv_lernwelt/feedback/services.py @@ -121,14 +121,14 @@ def initial_data_for_feedback_page( return {} -def export_feedback(course_session_id: str, save_as_file: bool): +def export_feedback(course_session_ids: list[str], save_as_file: bool): wb = Workbook() # remove the first sheet is just easier than keeping track of the active sheet wb.remove_sheet(wb.active) feedbacks = FeedbackResponse.objects.filter( - course_session_id=course_session_id, + course_session_id__in=course_session_ids, submitted=True, ).order_by("circle", "updated_at") grouped_feedbacks = groupby(feedbacks, key=attrgetter("circle")) @@ -139,7 +139,7 @@ def export_feedback(course_session_id: str, save_as_file: bool): "export_feedback_for_circle", data={ "circle": circle.id, - "course_session_id": course_session_id, + "course_session_ids": course_session_ids, "count": len(group_feedbacks), }, label="feedback_export", @@ -178,19 +178,30 @@ def _add_rows(sheet, data): sheet.cell(row=row_idx, column=col_idx, value=response) -def make_export_filename(): +def make_export_filename(name: str = "feedback_export"): today_date = datetime.today().strftime("%Y-%m-%d") - return f"feedback_export_{today_date}.xlsx" + return f"{name}_{today_date}.xlsx" # used as admin action, that's why it's not in the views.py -def get_feedbacks_for_course(_modeladmin, _request, queryset): - excel_bytes = export_feedback(queryset.first(), False) +def get_feedbacks_for_course_sessions(_modeladmin, _request, queryset): + file_name = "feedback_export_durchfuehrungen" + return _handle_feedback_export_action(queryset, file_name) + + +def get_feedbacks_for_courses(_modeladmin, _request, queryset): + course_sessions = CourseSession.objects.filter(course__in=queryset) + file_name = "feedback_export_lehrgaenge" + return _handle_feedback_export_action(course_sessions, file_name) + + +def _handle_feedback_export_action(course_seesions, file_name): + excel_bytes = export_feedback(course_seesions, False) response = HttpResponse( content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ) - response["Content-Disposition"] = f"attachment; filename={make_export_filename()}" + response["Content-Disposition"] = f"attachment; filename={make_export_filename(file_name)}" response.write(excel_bytes) return response