from io import BytesIO from typing import Optional import structlog from django.utils.translation import gettext_lazy as _ from openpyxl import Workbook from vbv_lernwelt.course.models import CourseSessionUser from vbv_lernwelt.course_session.services.export_attendance import ( add_user_headers, make_export_filename, ) from vbv_lernwelt.dashboard.utils import create_csu_dict PERSONS_EXPORT_FILENAME = _("export_personen") logger = structlog.get_logger(__name__) def export_persons( course_session_users: list[CourseSessionUser], save_as_file: bool = False, ) -> Optional[bytes]: if not course_session_users: return wb = Workbook() # remove the first sheet is just easier than keeping track of the active sheet wb.remove(wb.active) csu_data = [ create_csu_dict(csu, include_private_data=True) for csu in course_session_users ] csu_data.sort(key=lambda x: x["last_name"]) _create_sheet( wb, csu_data, ) 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, course_session_user_data: list[dict], ): sheet = wb.create_sheet() if len(course_session_user_data) == 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, course_session_user_data) return sheet def _add_rows( sheet, users, ): idx_offset = 0 for row_idx, user in enumerate(users, start=2): user_role = _role_as_string(user.get("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_number", ""), ) sheet.cell(row=idx, column=6, value=user_role) def _role_as_string(role): if role == "MEMBER": return str(_("Teilnehmer")) elif role == "EXPERT": return str(_("Trainer")) elif role == "SUPERVISOR": return str(_("Regionenleiter")) else: return role