from io import BytesIO import structlog from django.utils.translation import gettext_lazy as _ from openpyxl import Workbook from vbv_lernwelt.core.models import User from vbv_lernwelt.course.models import CourseSession from vbv_lernwelt.course_session.services.export_attendance import ( add_user_headers, make_export_filename, sanitize_sheet_name, ) from vbv_lernwelt.dashboard.utils import create_person_list_with_roles PERSONS_EXPORT_FILENAME = _("export_personen") logger = structlog.get_logger(__name__) def export_persons( user: User, course_session_ids: list[str], save_as_file: bool = False, ): if len(course_session_ids) == 0: return wb = Workbook() # remove the first sheet is just easier than keeping track of the active sheet wb.remove(wb.active) user_with_roles = create_person_list_with_roles(user, course_session_ids) course_sessions = CourseSession.objects.filter(id__in=course_session_ids) for cs in course_sessions: _create_sheet( wb, cs.title, cs.id, user_with_roles, ) if save_as_file: wb.save(make_export_filename(PERSONS_EXPORT_FILENAME)) else: output = BytesIO() wb.save(output) output.seek(0) return output.getvalue() def _create_sheet( wb: Workbook, title: str, cs_id: int, user_with_roles, ): sheet = wb.create_sheet(title=sanitize_sheet_name(title)) if len(user_with_roles) == 0: return sheet # headers # common user headers, Circle