wip: Fix export, add test
This commit is contained in:
parent
fd2cbb96bc
commit
9f880baffd
|
|
@ -7,7 +7,6 @@ from openpyxl import Workbook
|
||||||
from vbv_lernwelt.core.models import User
|
from vbv_lernwelt.core.models import User
|
||||||
from vbv_lernwelt.course.models import CourseSession
|
from vbv_lernwelt.course.models import CourseSession
|
||||||
from vbv_lernwelt.course_session.services.export_attendance import (
|
from vbv_lernwelt.course_session.services.export_attendance import (
|
||||||
add_user_export_data,
|
|
||||||
add_user_headers,
|
add_user_headers,
|
||||||
make_export_filename,
|
make_export_filename,
|
||||||
sanitize_sheet_name,
|
sanitize_sheet_name,
|
||||||
|
|
@ -82,20 +81,27 @@ def _add_rows(
|
||||||
for row_idx, user in enumerate(users, start=2):
|
for row_idx, user in enumerate(users, start=2):
|
||||||
|
|
||||||
def get_user_cs_by_id(user_cs, cs_id):
|
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(
|
sheet.cell(
|
||||||
row=row_idx,
|
row=row_idx,
|
||||||
column=col_idx,
|
column=5,
|
||||||
value=user.user.additional_json_data.get("phone", ""),
|
value=user.get("phone", ""),
|
||||||
)
|
)
|
||||||
sheet.cell(
|
sheet.cell(row=row_idx, column=6, value=user_role[0])
|
||||||
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
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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):
|
def create_user_dict(user_object):
|
||||||
return {
|
user_data = {
|
||||||
"user_id": user_object.id,
|
"user_id": user_object.id,
|
||||||
"first_name": user_object.first_name,
|
"first_name": user_object.first_name,
|
||||||
"last_name": user_object.last_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,
|
"avatar_url": user_object.avatar_url,
|
||||||
"course_sessions": [],
|
"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)
|
course_sessions = get_course_sessions_with_roles_for_user(user)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue