From 889922725ac170e71aade0f5e45d373ab6378f54 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Mon, 26 Aug 2024 11:49:05 +0200 Subject: [PATCH] =?UTF-8?q?VBV-721:=20Export=20f=C3=BCr=20Berufsbildner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/statistic/AssignmentList.vue | 7 +---- server/vbv_lernwelt/assignment/export.py | 13 +++++++-- .../services/export_attendance.py | 11 ++++++-- .../tests/test_attendance_export.py | 1 + server/vbv_lernwelt/dashboard/views.py | 28 +++++++++++++++++-- 5 files changed, 47 insertions(+), 13 deletions(-) diff --git a/client/src/pages/dashboard/statistic/AssignmentList.vue b/client/src/pages/dashboard/statistic/AssignmentList.vue index 2a609e0f..b8cf29eb 100644 --- a/client/src/pages/dashboard/statistic/AssignmentList.vue +++ b/client/src/pages/dashboard/statistic/AssignmentList.vue @@ -65,12 +65,7 @@ const itemDetailUrl = (item: AssignmentStatisticsRecordType) => {

{{ $t("a.Kompetenznachweis-Elemente") }}

- diff --git a/server/vbv_lernwelt/assignment/export.py b/server/vbv_lernwelt/assignment/export.py index fada4f82..b9f8c163 100644 --- a/server/vbv_lernwelt/assignment/export.py +++ b/server/vbv_lernwelt/assignment/export.py @@ -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(): diff --git a/server/vbv_lernwelt/course_session/services/export_attendance.py b/server/vbv_lernwelt/course_session/services/export_attendance.py index 214d9b77..3259814f 100644 --- a/server/vbv_lernwelt/course_session/services/export_attendance.py +++ b/server/vbv_lernwelt/course_session/services/export_attendance.py @@ -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), ) diff --git a/server/vbv_lernwelt/course_session/tests/test_attendance_export.py b/server/vbv_lernwelt/course_session/tests/test_attendance_export.py index eb217f4b..9b8ebb48 100644 --- a/server/vbv_lernwelt/course_session/tests/test_attendance_export.py +++ b/server/vbv_lernwelt/course_session/tests/test_attendance_export.py @@ -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)] ) diff --git a/server/vbv_lernwelt/dashboard/views.py b/server/vbv_lernwelt/dashboard/views.py index 18e2150b..31f1cf75 100644 --- a/server/vbv_lernwelt/dashboard/views.py +++ b/server/vbv_lernwelt/dashboard/views.py @@ -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")