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 <learningcontenttitle> bestanden, Circle <title> <learningcontenttitle> Resultat, ... col_idx = add_user_headers(sheet) sheet.cell(row=1, column=col_idx, value=str(_("Telefon"))) sheet.cell(row=1, column=col_idx + 1, value=str(_("Rolle"))) _add_rows(sheet, user_with_roles, cs_id) return sheet def _add_rows( sheet, users, course_session_id, ): idx_offset = 0 for row_idx, user in enumerate(users, start=2): def get_user_cs_by_id(user_cs, cs_id): return next((cs for cs in user_cs if int(cs.get("id")) == cs_id), None) user_cs = get_user_cs_by_id(user["course_sessions"], course_session_id) if not user_cs: logger.warning( "User not found in course session", user_id=user["user_id"], course_session_id=course_session_id, ) idx_offset += 1 continue user_role = (user_cs.get("user_role"),) idx = row_idx - idx_offset sheet.cell(row=idx, column=1, value=user["first_name"]) sheet.cell(row=idx, column=2, value=user["last_name"]) sheet.cell(row=idx, column=3, value=user["email"]) sheet.cell(row=idx, column=4, value=user.get("Lehrvertragsnummer", "")) sheet.cell( row=idx, column=5, value=user.get("phone", ""), ) sheet.cell(row=idx, column=6, value=user_role[0])