VBV-721: Export für Berufsbildner

This commit is contained in:
Daniel Egger 2024-08-26 11:49:05 +02:00
parent 020b7b64dd
commit 889922725a
5 changed files with 47 additions and 13 deletions

View File

@ -65,12 +65,7 @@ const itemDetailUrl = (item: AssignmentStatisticsRecordType) => {
<main>
<div class="mb-10 flex items-center justify-between">
<h3>{{ $t("a.Kompetenznachweis-Elemente") }}</h3>
<button
v-if="userStore.course_session_experts.length > 0"
class="flex"
data-cy="export-button"
@click="exportData"
>
<button v-if="true" class="flex" data-cy="export-button" @click="exportData">
<it-icon-export></it-icon-export>
<span class="ml inline-block">{{ $t("a.Als Excel exportieren") }}</span>
</button>

View File

@ -45,6 +45,7 @@ class CompetenceCertificateElement:
def export_competence_elements(
course_session_ids: list[str],
circle_ids: list[int] = None,
user_ids: list[str] = None,
save_as_file: bool = False,
):
if len(course_session_ids) == 0:
@ -63,15 +64,21 @@ def export_competence_elements(
course_session_ids
)
assignemnt_completions = AssignmentCompletion.objects.filter(
assignment_completions = AssignmentCompletion.objects.filter(
course_session_id__in=course_session_ids,
assignment__assignment_type__in=COMPETENCE_ASSIGNMENT_TYPES,
).order_by("course_session", "assignment")
if user_ids:
assignment_completions = AssignmentCompletion.objects.filter(
assignment_user_id__in=user_ids if user_ids else [],
).order_by("course_session", "assignment")
# group all by the sessions title {session_id1: [...], session_id2: [...], ...}
grouped_cs_users = get_ordered_csus_by_course_session(course_session_ids)
grouped_cs_users = get_ordered_csus_by_course_session(
course_session_ids, user_ids=user_ids
)
grouped_cce = group_by_session_title(competence_certificate_elements)
grouped_ac = group_by_session_title(assignemnt_completions)
grouped_ac = group_by_session_title(assignment_completions)
# create a sheet for each course session
for course_session_title, cs_users in grouped_cs_users.items():

View File

@ -153,10 +153,17 @@ def add_user_export_data(sheet, user: CourseSessionUser, row_idx: int) -> int:
return 5 # return the next column index
def get_ordered_csus_by_course_session(course_session_ids: list[str]):
def get_ordered_csus_by_course_session(
course_session_ids: list[str], user_ids: list[str] = None
):
csus = CourseSessionUser.objects.filter(
course_session_id__in=course_session_ids, role=CourseSessionUser.Role.MEMBER
).order_by("course_session", "user__last_name", "user__first_name")
)
if user_ids:
csus = csus.filter(user_id__in=user_ids)
csus = csus.order_by("course_session", "user__last_name", "user__first_name")
return group_by_session_title(
sorted(csus, key=lambda x: x.course_session.title),
)

View File

@ -16,6 +16,7 @@ class ExportBaseTestCase(TestCase):
def _check_export(self, wb, expected_data, max_row, max_col):
for row in wb.active.iter_rows(max_col=max_col, max_row=max_row):
for cell in row:
print(cell.value)
self.assertEqual(
cell.value, expected_data[row[0].row - 1][row.index(cell)]
)

View File

@ -416,12 +416,18 @@ def export_attendance_as_xsl(request):
def export_competence_elements_as_xsl(request):
circle_ids = request.data.get("circleIds", None)
requested_course_session_ids = request.data.get("courseSessionIds", [])
course_sessions_with_roles = _get_permitted_courses_sessions_for_user(
(
course_session_ids,
participant_user_ids,
) = _filter_permitted_course_session_and_user_ids(
request.user, requested_course_session_ids
)
data = export_competence_elements(
[cswr.id for cswr in course_sessions_with_roles],
course_session_ids=list(course_session_ids),
circle_ids=circle_ids,
user_ids=list(participant_user_ids),
)
return _make_excel_response(data, COMPETENCE_ELEMENT_EXPORT_FILE_NAME)
@ -470,6 +476,24 @@ def _get_permitted_courses_sessions_for_user(
return user_course_sessions_with_roles
def _filter_permitted_course_session_and_user_ids(
user: User, requested_course_session_ids: List[str]
):
course_session_ids = set([])
participant_user_ids = set([])
for person in create_person_list_with_roles(
user, course_session_ids=requested_course_session_ids
):
for cs in person["course_sessions"]:
if str(cs["id"]) in [str(i) for i in requested_course_session_ids]:
if cs["my_role"] in ["SUPERVISOR", "EXPERT", "BERUFSBILDNER"]:
course_session_ids.add(cs["id"])
participant_user_ids.add(person["user_id"])
return course_session_ids, participant_user_ids
def _make_excel_response(data: bytes, file_name: str) -> HttpResponse:
encoded_data = base64.b64encode(data).decode("utf-8")