From 9f880baffd47f676de05e390b845642c25f217ae Mon Sep 17 00:00:00 2001 From: Christian Cueni Date: Tue, 16 Jul 2024 09:56:19 +0200 Subject: [PATCH] wip: Fix export, add test --- .../vbv_lernwelt/dashboard/person_export.py | 34 +-- .../dashboard/tests/test_export.py | 225 ++++++++++++++++++ server/vbv_lernwelt/dashboard/utils.py | 13 +- 3 files changed, 256 insertions(+), 16 deletions(-) create mode 100644 server/vbv_lernwelt/dashboard/tests/test_export.py diff --git a/server/vbv_lernwelt/dashboard/person_export.py b/server/vbv_lernwelt/dashboard/person_export.py index e2167ca9..0c7e5eae 100644 --- a/server/vbv_lernwelt/dashboard/person_export.py +++ b/server/vbv_lernwelt/dashboard/person_export.py @@ -7,7 +7,6 @@ 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_export_data, add_user_headers, make_export_filename, sanitize_sheet_name, @@ -82,20 +81,27 @@ def _add_rows( 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 cs.get("course_id") == cs_id), None) + return next((cs for cs in user_cs if int(cs.get("id")) == cs_id), None) - col_idx = add_user_export_data(sheet, user, row_idx) + 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=col_idx, - value=user.user.additional_json_data.get("phone", ""), + column=5, + value=user.get("phone", ""), ) - sheet.cell( - row=row_idx, - column=col_idx + 1, - value=get_user_cs_by_id(user.course_sessions, course_session_id).get( - "user_role" - ), - ) - - col_idx += 2 + sheet.cell(row=row_idx, column=6, value=user_role[0]) diff --git a/server/vbv_lernwelt/dashboard/tests/test_export.py b/server/vbv_lernwelt/dashboard/tests/test_export.py new file mode 100644 index 00000000..083e7f60 --- /dev/null +++ b/server/vbv_lernwelt/dashboard/tests/test_export.py @@ -0,0 +1,225 @@ +import io + +from openpyxl import load_workbook + +from vbv_lernwelt.core.constants import ( + TEST_STUDENT1_USER_ID, + TEST_STUDENT2_USER_ID, + TEST_STUDENT3_USER_ID, + TEST_TRAINER1_USER_ID, + TEST_TRAINER2_USER_ID, +) +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_session.tests.test_attendance_export import ExportBaseTestCase +from vbv_lernwelt.dashboard.person_export import export_persons +from vbv_lernwelt.learnpath.models import Circle + + +class PersonsExportTestCase(ExportBaseTestCase): + def setUp(self): + super().setUp() + + create_default_users() + create_test_course(include_vv=False, with_sessions=True) + + 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") + + self.circle_fahrzeug = Circle.objects.get( + slug="test-lehrgang-lp-circle-fahrzeug" + ) + self.circle_reisen = Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug") + + self.test_trainer1 = User.objects.get(id=TEST_TRAINER1_USER_ID) + self.test_trainer2 = User.objects.get(id=TEST_TRAINER2_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_row = [ + self.test_student1.first_name, + self.test_student1.last_name, + self.test_student1.email, + None, + None, + "MEMBER", + ] + self.test_student2_row = [ + self.test_student2.first_name, + self.test_student2.last_name, + self.test_student2.email, + None, + None, + "MEMBER", + ] + self.test_student3_row = [ + self.test_student3.first_name, + self.test_student3.last_name, + self.test_student3.email, + None, + None, + "MEMBER", + ] + self.test_trainer1_row = [ + self.test_trainer1.first_name, + self.test_trainer1.last_name, + self.test_trainer1.email, + None, + None, + "EXPERT", + ] + self.test_trainer2_row = [ + self.test_trainer2.first_name, + self.test_trainer2.last_name, + self.test_trainer2.email, + None, + None, + "EXPERT", + ] + + def _generate_expected_data(self, rows): + expected_data = [ + self._make_header(), + ] + for r in rows: + expected_data.append(r) + + 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) + ) + return load_workbook(export_data) + + def _make_header(self): + return [ + "Vorname", + "Nachname", + "Email", + "Lehrvertragsnummer", + "Telefon", + "Rolle", + ] + + def test_export_persons(self): + wb = self._generate_workbook(self.test_trainer1, [self.course_session_be.id]) + self.assertEqual(len(wb.sheetnames), 1) + self.assertEqual(wb.sheetnames[0], "Test Bern 2022 a") + wb.active = wb["Test Bern 2022 a"] + + data = self._generate_expected_data( + [ + self.test_student1_row, + self.test_student2_row, + self.test_student3_row, + self.test_trainer1_row, + ] + ) + + self._check_export(wb, data, 4, 6) + + wb = self._generate_workbook(self.test_trainer2, [self.course_session_zh.id]) + self.assertEqual(len(wb.sheetnames), 1) + self.assertEqual(wb.sheetnames[0], "Test Zürich 2022 a") + wb.active = wb["Test Zürich 2022 a"] + + data = self._generate_expected_data( + [self.test_student2_row, self.test_trainer2_row] + ) + self._check_export(wb, data, 3, 6) + + # def test_export_feedback_with_cs_circle_pairs(self): + # cs_circle_pairs = [ + # ( + # self.course_session_be.id, + # [self.circle_fahrzeug.id, self.circle_reisen.id], + # ), + # ( + # self.course_session_zh.id, + # [self.circle_reisen.id, self.circle_fahrzeug.id], + # ), + # ] + # export_data = io.BytesIO( + # export_feedback_with_circle_restriction(cs_circle_pairs, save_as_file=False) + # ) + # wb = load_workbook(export_data) + # self.assertEqual(len(wb.sheetnames), 2) + # self.assertEqual(wb.sheetnames[0], "Fahrzeug") + # self.assertEqual(wb.sheetnames[1], "Reisen") + # + # self._check_export(wb, self.expected_data_fahrzeug, 3, 12) + # + # wb.active = wb["Reisen"] + # self._check_export(wb, self.expected_data_reisen, 2, 12) + + # def test_does_not_include_unsubmitted_feedback(self): + # feedback = FeedbackResponse.objects.get( + # circle=self.circle_reisen, + # course_session=self.course_session_zh, + # feedback_user=self.test_student2, + # ) + # + # feedback.submitted = False + # feedback.save() + # + # wb = self._generate_workbook( + # [self.course_session_be.id, self.course_session_zh.id] + # ) + # self.assertEqual(len(wb.sheetnames), 1) + # self.assertEqual(wb.sheetnames[0], "Fahrzeug") + # + # self._check_export(wb, self.expected_data_fahrzeug, 3, 12) + # + # def test_french_export(self): + # activate("fr") + # wb = self._generate_workbook( + # [self.course_session_be.id, self.course_session_zh.id] + # ) + # + # header = [ + # "Opérations", + # "Date", + # "Degré de satisfaction au global", + # "Degré de réalisation des objectifs", + # "As-tu l’impression de bien maîtriser les sujets qui ont été abordés pendant le cours ?", + # "Les travaux préparatoires étaient-ils clairs et compréhensibles ?", + # "Que penses-tu des compétences techniques de la personne chargée du cours et de sa maîtrise du sujet ?", + # "Les questions et les suggestions des participants ont-elles été prises au sérieux et traitées correctement ?", + # "Souhaites-tu ajouter quelque chose à l’intention de la personne chargée du cours ?", + # "Est-ce que tu recommandes ce cours ?", + # "Qu’est-ce qui t’a particulièrement plu ?", + # "À ton avis, quels sont les points qui pourraient être améliorés ?", + # ] + # + # self.expected_data_fahrzeug[0] = header + # + # self._check_export(wb, self.expected_data_fahrzeug, 3, 12) + # + # def test_italian_export(self): + # activate("it") + # wb = self._generate_workbook( + # [self.course_session_be.id, self.course_session_zh.id] + # ) + # + # header = [ + # "Svolgimenti", + # "Data", + # "Soddisfazione complessiva", + # "Raggiungimento complessivo degli obiettivi", + # "Come valuti il tuo livello di preparazione sui temi dopo il corso?", + # "Gli incarichi di preparazione erano chiari e comprensibili?", + # "Come valuti il livello di preparazione sui temi e le competenze specialistiche dell’istruttore/istruttrice del corso?", + # "Le domande e i suggerimenti dei/delle partecipanti al corso sono stati accolti e presi sul serio?", + # "Cos’altro vorresti ancora dire all’istruttore/istruttrice del corso?", + # "Raccomanderesti il corso?", + # "Cos’hai apprezzato particolarmente?", + # "Dove vedi un potenziale di miglioramento?", + # ] + # + # self.expected_data_fahrzeug[0] = header + # + # self._check_export(wb, self.expected_data_fahrzeug, 3, 12) diff --git a/server/vbv_lernwelt/dashboard/utils.py b/server/vbv_lernwelt/dashboard/utils.py index 0002004c..8967eb90 100644 --- a/server/vbv_lernwelt/dashboard/utils.py +++ b/server/vbv_lernwelt/dashboard/utils.py @@ -92,9 +92,11 @@ def create_course_session_dict(course_session_object, my_role, user_role): } -def create_person_list_with_roles(user, course_session_ids=None): +def create_person_list_with_roles( + user, course_session_ids=None, include_private_data=False +): def create_user_dict(user_object): - return { + user_data = { "user_id": user_object.id, "first_name": user_object.first_name, "last_name": user_object.last_name, @@ -103,6 +105,13 @@ def create_person_list_with_roles(user, course_session_ids=None): "avatar_url": user_object.avatar_url, "course_sessions": [], } + if include_private_data: + user_data["phone"] = user_object.additional_json_data.get("phone", "") + user_data["Lehrvertragsnummer"] = user_object.additional_json_data.get( + "Lehrvertragsnummer", "" + ) + + return user_data course_sessions = get_course_sessions_with_roles_for_user(user)