Handle export for multiple course sessions
This commit is contained in:
parent
022b83819e
commit
93efd7333e
|
|
@ -1,10 +1,11 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from vbv_lernwelt.course.models import Course, CourseSession, CourseSessionUser
|
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
|
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)
|
@admin.register(Course)
|
||||||
|
|
@ -15,6 +16,7 @@ class CourseAdmin(admin.ModelAdmin):
|
||||||
"category_name",
|
"category_name",
|
||||||
"slug",
|
"slug",
|
||||||
]
|
]
|
||||||
|
actions = [get_feedbacks_for_courses]
|
||||||
|
|
||||||
|
|
||||||
@admin.register(CourseSession)
|
@admin.register(CourseSession)
|
||||||
|
|
@ -29,7 +31,7 @@ class CourseSessionAdmin(admin.ModelAdmin):
|
||||||
"created_at",
|
"created_at",
|
||||||
"updated_at",
|
"updated_at",
|
||||||
]
|
]
|
||||||
actions = [get_feedbacks_for_course]
|
actions = [get_feedbacks_for_course_sessions]
|
||||||
|
|
||||||
|
|
||||||
@admin.register(CourseSessionUser)
|
@admin.register(CourseSessionUser)
|
||||||
|
|
|
||||||
|
|
@ -15,4 +15,4 @@ logger = structlog.get_logger(__name__)
|
||||||
)
|
)
|
||||||
def command(course_session_id, save_as_file):
|
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
|
# 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)
|
||||||
|
|
|
||||||
|
|
@ -121,14 +121,14 @@ def initial_data_for_feedback_page(
|
||||||
return {}
|
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()
|
wb = Workbook()
|
||||||
|
|
||||||
# remove the first sheet is just easier than keeping track of the active sheet
|
# remove the first sheet is just easier than keeping track of the active sheet
|
||||||
wb.remove_sheet(wb.active)
|
wb.remove_sheet(wb.active)
|
||||||
|
|
||||||
feedbacks = FeedbackResponse.objects.filter(
|
feedbacks = FeedbackResponse.objects.filter(
|
||||||
course_session_id=course_session_id,
|
course_session_id__in=course_session_ids,
|
||||||
submitted=True,
|
submitted=True,
|
||||||
).order_by("circle", "updated_at")
|
).order_by("circle", "updated_at")
|
||||||
grouped_feedbacks = groupby(feedbacks, key=attrgetter("circle"))
|
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",
|
"export_feedback_for_circle",
|
||||||
data={
|
data={
|
||||||
"circle": circle.id,
|
"circle": circle.id,
|
||||||
"course_session_id": course_session_id,
|
"course_session_ids": course_session_ids,
|
||||||
"count": len(group_feedbacks),
|
"count": len(group_feedbacks),
|
||||||
},
|
},
|
||||||
label="feedback_export",
|
label="feedback_export",
|
||||||
|
|
@ -178,19 +178,30 @@ def _add_rows(sheet, data):
|
||||||
sheet.cell(row=row_idx, column=col_idx, value=response)
|
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")
|
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
|
# used as admin action, that's why it's not in the views.py
|
||||||
def get_feedbacks_for_course(_modeladmin, _request, queryset):
|
def get_feedbacks_for_course_sessions(_modeladmin, _request, queryset):
|
||||||
excel_bytes = export_feedback(queryset.first(), False)
|
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(
|
response = HttpResponse(
|
||||||
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
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)
|
response.write(excel_bytes)
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue