diff --git a/server/vbv_lernwelt/course_session/management/commands/export_attendance.py b/server/vbv_lernwelt/course_session/management/commands/export_attendance.py index 7d914120..064d16e6 100644 --- a/server/vbv_lernwelt/course_session/management/commands/export_attendance.py +++ b/server/vbv_lernwelt/course_session/management/commands/export_attendance.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_attendance([course_session_id, 14], save_as_file) + export_attendance([course_session_id], save_as_file) diff --git a/server/vbv_lernwelt/course_session/services/export.py b/server/vbv_lernwelt/course_session/services/export.py index 1078541e..c6703f4d 100644 --- a/server/vbv_lernwelt/course_session/services/export.py +++ b/server/vbv_lernwelt/course_session/services/export.py @@ -1,3 +1,4 @@ +import typing from datetime import datetime from io import BytesIO from itertools import groupby @@ -11,30 +12,35 @@ from vbv_lernwelt.course_session.models import CourseSessionAttendanceCourse logger = structlog.get_logger(__name__) -def export_attendance(course_session_ids: list[str], save_as_file: bool, circles=None): +def export_attendance( + course_session_ids: list[str], save_as_file: bool, circle_ids: list[int] = None +): wb = Workbook() # remove the first sheet is just easier than keeping track of the active sheet wb.remove(wb.active) - # get attencdance courses for course sessions and circles - # get users for each course session - # set headers - # sheets group, cs or generation? - - cs_users = CourseSessionUser.objects.filter(course_session_id__in=course_session_ids, - role=CourseSessionUser.Role.MEMBER).order_by("course_session", - "user__last_name", - "user__first_name") + cs_users = CourseSessionUser.objects.filter( + course_session_id__in=course_session_ids, role=CourseSessionUser.Role.MEMBER + ).order_by("course_session", "user__last_name", "user__first_name") attendance_courses = CourseSessionAttendanceCourse.objects.filter( - course_session_id__in=course_session_ids).order_by("course_session", "due_date") + course_session_id__in=course_session_ids + ).order_by("course_session", "due_date") - grouped_cs_users = {key: list(group) for key, group in - groupby(sorted(cs_users, key=lambda x: x.course_session.title), - key=lambda x: x.course_session.title)} - grouped_attendance_course = {key: list(group) for key, group in - groupby(sorted(attendance_courses, key=lambda x: x.course_session.title), - key=lambda x: x.course_session.title)} + grouped_cs_users = { + key: list(group) + for key, group in groupby( + sorted(cs_users, key=lambda x: x.course_session.title), + key=lambda x: x.course_session.title, + ) + } + grouped_attendance_course = { + key: list(group) + for key, group in groupby( + sorted(attendance_courses, key=lambda x: x.course_session.title), + key=lambda x: x.course_session.title, + ) + } for course_session, cs_users in grouped_cs_users.items(): logger.debug( @@ -44,7 +50,13 @@ def export_attendance(course_session_ids: list[str], save_as_file: bool, circles }, label="attendance_export", ) - _create_sheet(wb, course_session, cs_users, grouped_attendance_course[course_session]) + _create_sheet( + wb, + course_session, + cs_users, + grouped_attendance_course[course_session], + circle_ids, + ) if save_as_file: wb.save(make_export_filename()) @@ -56,8 +68,13 @@ def export_attendance(course_session_ids: list[str], save_as_file: bool, circles return output.getvalue() -def _create_sheet(wb: Workbook, title: str, users: list[CourseSessionUser], - attendance_courses: list[CourseSessionAttendanceCourse]): +def _create_sheet( + wb: Workbook, + title: str, + users: list[CourseSessionUser], + attendance_courses: list[CourseSessionAttendanceCourse], + circle_ids: typing.Optional[list[int]], +): sheet = wb.create_sheet(title=sanitize_sheet_name(title)) if len(users) == 0: @@ -74,11 +91,17 @@ def _create_sheet(wb: Workbook, title: str, users: list[CourseSessionUser], col_idx = 5 attendance_data = {} for course in attendance_courses: - course_title = course.get_circle().title - sheet.cell(row=1, column=col_idx, - value=f"Anwesenheit {course_title} {course.due_date.start.strftime('%d.%m.%Y')}") - user_dict_map = {d['user_id']: d for d in course.attendance_user_list} - attendance_data[course_title] = user_dict_map + circle = course.get_circle() + if circle_ids and circle.id not in circle_ids: + continue + + sheet.cell( + row=1, + column=col_idx, + value=f"Anwesenheit {circle.title} {course.due_date.start.strftime('%d.%m.%Y')}", + ) + user_dict_map = {d["user_id"]: d for d in course.attendance_user_list} + attendance_data[circle.title] = user_dict_map col_idx += 1 @@ -92,7 +115,11 @@ def _add_rows(sheet, users: list[CourseSessionUser], attendance_data): sheet.cell(row=row_idx, column=1, value=user.user.first_name) sheet.cell(row=row_idx, column=2, value=user.user.last_name) sheet.cell(row=row_idx, column=3, value=user.user.email) - sheet.cell(row=row_idx, column=4, value=user.user.additional_json_data.get("Lehrvertragsnummer", "")) + sheet.cell( + row=row_idx, + column=4, + value=user.user.additional_json_data.get("Lehrvertragsnummer", ""), + ) col_idx = 5 for key, user_dict_map in attendance_data.items(): diff --git a/server/vbv_lernwelt/feedback/services.py b/server/vbv_lernwelt/feedback/services.py index b3ada7aa..e528ad96 100644 --- a/server/vbv_lernwelt/feedback/services.py +++ b/server/vbv_lernwelt/feedback/services.py @@ -10,7 +10,10 @@ from openpyxl import Workbook from vbv_lernwelt.core.models import User from vbv_lernwelt.course.models import CourseCompletionStatus, CourseSession from vbv_lernwelt.course.services import mark_course_completion -from vbv_lernwelt.course_session.services.export import make_export_filename, sanitize_sheet_name +from vbv_lernwelt.course_session.services.export import ( + make_export_filename, + sanitize_sheet_name, +) from vbv_lernwelt.feedback.models import FeedbackResponse from vbv_lernwelt.learnpath.models import ( LearningContentFeedbackUK,