108 lines
2.9 KiB
Python
108 lines
2.9 KiB
Python
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 <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, user_with_roles, cs_id)
|
|
|
|
return sheet
|
|
|
|
|
|
def _add_rows(
|
|
sheet,
|
|
users,
|
|
course_session_id,
|
|
):
|
|
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,
|
|
)
|
|
continue
|
|
|
|
user_role = (user_cs.get("user_role"),)
|
|
|
|
sheet.cell(row=row_idx, column=1, value=user["first_name"])
|
|
sheet.cell(row=row_idx, column=2, value=user["last_name"])
|
|
sheet.cell(row=row_idx, column=3, value=user["email"])
|
|
sheet.cell(row=row_idx, column=4, value=user.get("Lehrvertragsnummer", ""))
|
|
sheet.cell(
|
|
row=row_idx,
|
|
column=5,
|
|
value=user.get("phone", ""),
|
|
)
|
|
sheet.cell(row=row_idx, column=6, value=user_role[0])
|