vbv/server/vbv_lernwelt/dashboard/person_export.py

100 lines
2.6 KiB
Python

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 <title> <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