100 lines
2.6 KiB
Python
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
|