diff --git a/client/src/pages/dashboard/DashboardPersonsPage.vue b/client/src/pages/dashboard/DashboardPersonsPage.vue index c324c961..f604bf0b 100644 --- a/client/src/pages/dashboard/DashboardPersonsPage.vue +++ b/client/src/pages/dashboard/DashboardPersonsPage.vue @@ -8,7 +8,7 @@ import { exportPersons, } from "@/services/dashboard"; import { useUserStore } from "@/stores/user"; -import type { DashboardPersonsPageMode, XlsPersonExportRequestData } from "@/types"; +import type { DashboardPersonsPageMode } from "@/types"; import { openDataAsXls } from "@/utils/export"; import { useRouteQuery } from "@vueuse/router"; import dayjs from "dayjs"; @@ -317,13 +317,13 @@ function personRoleDisplayValue(personCourseSession: DashboardPersonCourseSessio } async function exportData() { - const requestData: XlsPersonExportRequestData = filteredPersons.value.reduce( + const requestData = filteredPersons.value.reduce( (acc, person) => { acc.courseSessionUserIds.push(person.csu_id); return acc; }, { - courseSessionUserIds: [], + courseSessionUserIds: [] as string[], } ); const data = await exportPersons(requestData, userStore.language); diff --git a/server/vbv_lernwelt/course/creators/test_course.py b/server/vbv_lernwelt/course/creators/test_course.py index ebdd4f9e..da4d6392 100644 --- a/server/vbv_lernwelt/course/creators/test_course.py +++ b/server/vbv_lernwelt/course/creators/test_course.py @@ -35,6 +35,7 @@ from vbv_lernwelt.competence.factories import ( ) from vbv_lernwelt.competence.models import ActionCompetence from vbv_lernwelt.core.constants import ( + TEST_AUSBILDUNGSVERANTWORTLICHER1_USER_ID, TEST_BERUFSBILDNER1_USER_ID, TEST_COURSE_SESSION_BERN_ID, TEST_COURSE_SESSION_ZURICH_ID, @@ -385,6 +386,31 @@ def create_test_course( ), role="BERUFSBILDNER", ) + # Add Ausbildungsverantwortlicher + AgentParticipantRelation.objects.create( + agent=User.objects.get(id=TEST_AUSBILDUNGSVERANTWORTLICHER1_USER_ID), + participant=CourseSessionUser.objects.get( + user__id=TEST_STUDENT1_USER_ID, + course_session=cs_bern, + ), + role="LEARNING_MENTOR", + ) + AgentParticipantRelation.objects.create( + agent=User.objects.get(id=TEST_AUSBILDUNGSVERANTWORTLICHER1_USER_ID), + participant=CourseSessionUser.objects.get( + user__id=TEST_STUDENT2_USER_ID, + course_session=cs_zurich, + ), + role="LEARNING_MENTOR", + ) + AgentParticipantRelation.objects.create( + agent=User.objects.get(id=TEST_AUSBILDUNGSVERANTWORTLICHER1_USER_ID), + participant=CourseSessionUser.objects.get( + user__id=TEST_STUDENT3_USER_ID, + course_session=cs_bern, + ), + role="LEARNING_MENTOR", + ) return course 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..6fa7abe6 100644 --- a/server/vbv_lernwelt/course_session/tests/test_attendance_export.py +++ b/server/vbv_lernwelt/course_session/tests/test_attendance_export.py @@ -14,6 +14,13 @@ from vbv_lernwelt.course_session.services.export_attendance import export_attend class ExportBaseTestCase(TestCase): def _check_export(self, wb, expected_data, max_row, max_col): + debug_data = [] + for row in wb.active.iter_rows(max_col=max_col, max_row=max_row): + row_data = [] + for cell in row: + row_data.append(cell.value) + debug_data.append(row_data) + for row in wb.active.iter_rows(max_col=max_col, max_row=max_row): for cell in row: self.assertEqual( diff --git a/server/vbv_lernwelt/dashboard/person_export.py b/server/vbv_lernwelt/dashboard/person_export.py index 59ea4540..c974c918 100644 --- a/server/vbv_lernwelt/dashboard/person_export.py +++ b/server/vbv_lernwelt/dashboard/person_export.py @@ -30,6 +30,7 @@ def export_persons( 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, diff --git a/server/vbv_lernwelt/dashboard/tests/test_export.py b/server/vbv_lernwelt/dashboard/tests/test_export.py index c00d1fef..f3359aa6 100644 --- a/server/vbv_lernwelt/dashboard/tests/test_export.py +++ b/server/vbv_lernwelt/dashboard/tests/test_export.py @@ -4,6 +4,7 @@ from django.utils.translation import activate from openpyxl import load_workbook from vbv_lernwelt.core.constants import ( + TEST_AUSBILDUNGSVERANTWORTLICHER1_USER_ID, TEST_STUDENT1_USER_ID, TEST_STUDENT2_USER_ID, TEST_STUDENT3_USER_ID, @@ -13,9 +14,9 @@ from vbv_lernwelt.core.constants import ( from vbv_lernwelt.core.create_default_users import create_default_users from vbv_lernwelt.core.models import User from vbv_lernwelt.course.creators.test_course import create_test_course -from vbv_lernwelt.course.models import CourseSession +from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.course_session.tests.test_attendance_export import ExportBaseTestCase -from vbv_lernwelt.dashboard.person_export import export_persons +from vbv_lernwelt.dashboard.views import _export_persons_as_xls_data from vbv_lernwelt.learnpath.models import Circle @@ -26,6 +27,8 @@ class PersonsExportTestCase(ExportBaseTestCase): create_default_users() create_test_course(include_vv=False, with_sessions=True) + self.default_sheet_name = "Sheet" + self.course_session_be = CourseSession.objects.get(title="Test Bern 2022 a") self.course_session_zh = CourseSession.objects.get(title="Test Zürich 2022 a") @@ -36,10 +39,32 @@ class PersonsExportTestCase(ExportBaseTestCase): self.test_trainer1 = User.objects.get(id=TEST_TRAINER1_USER_ID) self.test_trainer2 = User.objects.get(id=TEST_TRAINER2_USER_ID) + self.test_ausbildungsverantwortlicher1 = User.objects.get( + id=TEST_AUSBILDUNGSVERANTWORTLICHER1_USER_ID + ) self.test_student1 = User.objects.get(id=TEST_STUDENT1_USER_ID) self.test_student2 = User.objects.get(id=TEST_STUDENT2_USER_ID) self.test_student3 = User.objects.get(id=TEST_STUDENT3_USER_ID) + self.test_student1_csu_be = CourseSessionUser.objects.get( + user=self.test_student1, course_session=self.course_session_be + ) + self.test_student2_csu_be = CourseSessionUser.objects.get( + user=self.test_student2, course_session=self.course_session_be + ) + self.test_student2_csu_zh = CourseSessionUser.objects.get( + user=self.test_student2, course_session=self.course_session_zh + ) + self.test_student3_csu_be = CourseSessionUser.objects.get( + user=self.test_student3, course_session=self.course_session_be + ) + self.test_trainer1_csu_be = CourseSessionUser.objects.get( + user=self.test_trainer1, course_session=self.course_session_be + ) + self.test_trainer2_csu_zh = CourseSessionUser.objects.get( + user=self.test_trainer2, course_session=self.course_session_zh + ) + self.test_student1_row = [ self.test_student1.first_name, self.test_student1.last_name, @@ -91,9 +116,9 @@ class PersonsExportTestCase(ExportBaseTestCase): return expected_data def _generate_workbook(self, user, course_session_ids): - export_data = io.BytesIO( - export_persons(user, course_session_ids, save_as_file=False) - ) + data = _export_persons_as_xls_data(user, course_session_ids) + self.assertIsNotNone(data) + export_data = io.BytesIO(data) # type: ignore return load_workbook(export_data) def _make_header(self): @@ -107,10 +132,16 @@ class PersonsExportTestCase(ExportBaseTestCase): ] def test_export_persons(self): - wb = self._generate_workbook(self.test_trainer1, [self.course_session_be.id]) + export_course_session_user_ids = [ + self.test_student1_csu_be.id, + self.test_student2_csu_be.id, + self.test_student3_csu_be.id, + self.test_trainer1_csu_be.id, + ] + wb = self._generate_workbook(self.test_trainer1, export_course_session_user_ids) self.assertEqual(len(wb.sheetnames), 1) - self.assertEqual(wb.sheetnames[0], "Test Bern 2022 a") - wb.active = wb["Test Bern 2022 a"] + self.assertEqual(wb.sheetnames[0], self.default_sheet_name) + wb.active = wb[self.default_sheet_name] data = self._generate_expected_data( [ @@ -120,33 +151,64 @@ class PersonsExportTestCase(ExportBaseTestCase): self.test_trainer1_row, ] ) + self._check_export(wb, data, 5, 6) - self._check_export(wb, data, 4, 6) - - wb = self._generate_workbook(self.test_trainer2, [self.course_session_zh.id]) + export_course_session_user_ids = [ + self.test_student2_csu_zh.id, + self.test_trainer2_csu_zh.id, + ] + wb = self._generate_workbook(self.test_trainer2, export_course_session_user_ids) self.assertEqual(len(wb.sheetnames), 1) - self.assertEqual(wb.sheetnames[0], "Test Zürich 2022 a") - wb.active = wb["Test Zürich 2022 a"] + self.assertEqual(wb.sheetnames[0], self.default_sheet_name) + wb.active = wb[self.default_sheet_name] data = self._generate_expected_data( [self.test_student2_row, self.test_trainer2_row] ) self._check_export(wb, data, 3, 6) - def test_cannot_export_other_session(self): - wb = self._generate_workbook(self.test_trainer1, [self.course_session_zh.id]) + def test_can_only_export_with_role(self): + csu = [ + self.test_student1_csu_be.id, + self.test_student2_csu_be.id, + self.test_student3_csu_be.id, + self.test_student2_csu_zh.id, + ] + wb = self._generate_workbook(self.test_trainer2, csu) self.assertEqual(len(wb.sheetnames), 1) - self.assertEqual(wb.sheetnames[0], "Test Zürich 2022 a") - wb.active = wb["Test Zürich 2022 a"] + self.assertEqual(wb.sheetnames[0], self.default_sheet_name) + wb.active = wb[self.default_sheet_name] - self._check_export(wb, [[None] * 6], 1, 6) + data = self._generate_expected_data([self.test_student2_row]) + self._check_export(wb, data, 1, 6) + + def test_can_only_export_with_agent_participant_relation(self): + csu = [ + self.test_student1_csu_be.id, + self.test_student2_csu_be.id, + self.test_student3_csu_be.id, + self.test_student2_csu_zh.id, + ] + wb = self._generate_workbook(self.test_ausbildungsverantwortlicher1, csu) + self.assertEqual(len(wb.sheetnames), 1) + self.assertEqual(wb.sheetnames[0], self.default_sheet_name) + wb.active = wb[self.default_sheet_name] + + data = self._generate_expected_data([self.test_student2_row]) + self._check_export(wb, data, 1, 6) def test_export_in_fr(self): activate("fr") - wb = self._generate_workbook(self.test_trainer1, [self.course_session_be.id]) + export_course_session_user_ids = [ + self.test_student1_csu_be.id, + self.test_student2_csu_be.id, + self.test_student3_csu_be.id, + self.test_trainer1_csu_be.id, + ] + wb = self._generate_workbook(self.test_trainer1, export_course_session_user_ids) self.assertEqual(len(wb.sheetnames), 1) - self.assertEqual(wb.sheetnames[0], "Test Bern 2022 a") - wb.active = wb["Test Bern 2022 a"] + self.assertEqual(wb.sheetnames[0], self.default_sheet_name) + wb.active = wb[self.default_sheet_name] header = [ "Prénom", @@ -165,10 +227,16 @@ class PersonsExportTestCase(ExportBaseTestCase): def test_export_in_it(self): activate("it") - wb = self._generate_workbook(self.test_trainer1, [self.course_session_be.id]) + export_course_session_user_ids = [ + self.test_student1_csu_be.id, + self.test_student2_csu_be.id, + self.test_student3_csu_be.id, + self.test_trainer1_csu_be.id, + ] + wb = self._generate_workbook(self.test_trainer1, export_course_session_user_ids) self.assertEqual(len(wb.sheetnames), 1) - self.assertEqual(wb.sheetnames[0], "Test Bern 2022 a") - wb.active = wb["Test Bern 2022 a"] + self.assertEqual(wb.sheetnames[0], self.default_sheet_name) + wb.active = wb[self.default_sheet_name] header = [ "Nome",