From 8c65ae3295b16edd55a6756b68f105893b609d98 Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Tue, 13 Jun 2023 18:18:21 +0200 Subject: [PATCH] Make import work with different language courses --- .../commands/create_default_courses.py | 26 ++++----- server/vbv_lernwelt/importer/services.py | 54 ++++++++++++------- .../tests/test_import_course_sessions.py | 4 +- .../importer/tests/test_import_students.py | 4 +- 4 files changed, 53 insertions(+), 35 deletions(-) diff --git a/server/vbv_lernwelt/course/management/commands/create_default_courses.py b/server/vbv_lernwelt/course/management/commands/create_default_courses.py index 32ec7da1..f6dfdce8 100644 --- a/server/vbv_lernwelt/course/management/commands/create_default_courses.py +++ b/server/vbv_lernwelt/course/management/commands/create_default_courses.py @@ -486,18 +486,17 @@ def create_course_training_de(): current_dir = os.path.dirname(os.path.realpath(__file__)) print(current_dir) course = Course.objects.get(id=COURSE_UK_TRAINING) - # import_course_sessions_from_excel( - # course, - # f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", - # ) - # import_trainers_from_excel( - # course, - # f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", - # ) - # import_students_from_excel( - # course, - # f"{current_dir}/../../../importer/tests/Schulungen_Teilnehmende.xlsx", - # ) + import_course_sessions_from_excel( + course, + f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", + ) + import_trainers_from_excel( + course, + f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", + ) + import_students_from_excel( + f"{current_dir}/../../../importer/tests/Schulungen_Teilnehmende.xlsx", + ) for cs in CourseSession.objects.filter(course_id=COURSE_UK_TRAINING): cs.assignment_details_list = [ @@ -572,13 +571,14 @@ def create_course_training_fr(): import_course_sessions_from_excel( course, f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", + language="fr", ) import_trainers_from_excel( course, f"{current_dir}/../../../importer/tests/Schulungen_Durchfuehrung_Trainer.xlsx", + language="fr", ) import_students_from_excel( - course, f"{current_dir}/../../../importer/tests/Schulungen_Teilnehmende.xlsx", ) diff --git a/server/vbv_lernwelt/importer/services.py b/server/vbv_lernwelt/importer/services.py index f2b39779..498583bf 100644 --- a/server/vbv_lernwelt/importer/services.py +++ b/server/vbv_lernwelt/importer/services.py @@ -52,16 +52,20 @@ def create_or_update_user( return user -def import_course_sessions_from_excel(course: Course, filename: str): +def import_course_sessions_from_excel(course: Course, filename: str, language="de"): workbook = load_workbook(filename=filename) sheet = workbook["Schulungen Durchführung"] tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet) for row in tuple_list: - create_or_update_course_session(course, dict(row), circles=["Fahrzeug"]) + create_or_update_course_session( + course, dict(row), language=language, circles=["Fahrzeug"] + ) -def create_or_update_course_session(course: Course, data: Dict[str, Any], circles=None): +def create_or_update_course_session( + course: Course, data: Dict[str, Any], language="de", circles=None +): """ :param data: the following keys are required to process the data: Generation, Region, Klasse :return: @@ -86,6 +90,10 @@ def create_or_update_course_session(course: Course, data: Dict[str, Any], circle title = f"{region} {generation} {group}" + if not import_id.lower().startswith(language.lower()): + # FIXME: language check depends on import_id format for now... + return None + cs, _created = CourseSession.objects.get_or_create( import_id=import_id, group=group, course=course ) @@ -120,19 +128,18 @@ def create_or_update_course_session(course: Course, data: Dict[str, Any], circle return cs -def import_trainers_from_excel(course: Course, filename: str): +def import_trainers_from_excel(course: Course, filename: str, language="de"): workbook = load_workbook(filename=filename) sheet = workbook["Schulungen Trainer"] tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet) for row in tuple_list: - create_or_update_trainer(course, dict(row)) + create_or_update_trainer(course, dict(row), language=language) -def create_or_update_trainer(course: Course, data: Dict[str, Any]): +def create_or_update_trainer(course: Course, data: Dict[str, Any], language="de"): logger.debug( "create_or_update_trainer", - course=course.title, data=data, label="import", ) @@ -143,15 +150,14 @@ def create_or_update_trainer(course: Course, data: Dict[str, Any]): last_name=data["Name"], ) - # TODO: handle language - groups = [g.strip() for g in data["Klasse"].strip().split(",")] # general expert handling for group in groups: import_id = f"{data['Generation'].strip()} {group}" course_session = CourseSession.objects.filter( - import_id=import_id, group=group, course=course + import_id=import_id, + group=group, ).first() if course_session: csu, _created = CourseSessionUser.objects.get_or_create( @@ -159,19 +165,34 @@ def create_or_update_trainer(course: Course, data: Dict[str, Any]): ) csu.role = CourseSessionUser.Role.EXPERT csu.save() + else: + logger.warning( + "create_or_update_trainer: course_session not found", + import_id=import_id, + group=group, + label="import", + ) + + if not course: + return # circle expert handling circle_data = parse_circle_group_string(data["Circles"]) for circle_string in circle_data: parts = circle_string.split("(", 1) circle_name = parts[0].strip() + groups = [g.strip() for g in parts[1].rstrip(")").strip().split(",")] + # FIXME: hardcoded translation + if language == "fr" and circle_name == "Fahrzeug": + circle_name = "Véhicule" + # print(circle_name, groups) for group in groups: import_id = f"{data['Generation'].strip()} {group}" course_session = CourseSession.objects.filter( - import_id=import_id, group=group, course=course + import_id=import_id, group=group ).first() circle = Circle.objects.filter( slug=f"{course.slug}-lp-circle-{circle_name.lower()}" @@ -186,19 +207,18 @@ def create_or_update_trainer(course: Course, data: Dict[str, Any]): csu.save() -def import_students_from_excel(course: Course, filename: str): +def import_students_from_excel(filename: str): workbook = load_workbook(filename=filename) sheet = workbook.active tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet) for row in tuple_list: - create_or_update_student(course, dict(row)) + create_or_update_student(dict(row)) -def create_or_update_student(course: Course, data: Dict[str, Any]): +def create_or_update_student(data: Dict[str, Any]): logger.debug( "create_or_update_student", - course=course.title, data=data, label="import", ) @@ -214,9 +234,7 @@ def create_or_update_student(course: Course, data: Dict[str, Any]): # general expert handling import_ids = [i.strip() for i in data["Durchführungen"].split(",")] for import_id in import_ids: - course_session = CourseSession.objects.filter( - import_id=import_id, course=course - ).first() + course_session = CourseSession.objects.filter(import_id=import_id).first() if course_session: csu, _created = CourseSessionUser.objects.get_or_create( course_session_id=course_session.id, user_id=user.id diff --git a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py index adf1c715..cb63de9f 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py +++ b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py @@ -25,10 +25,10 @@ class ImportCourseSessionTestCase(TestCase): for row in tuple_list: print(row) create_or_update_course_session( - self.course, dict(row), circles=["Fahrzeug"] + self.course, dict(row), language="de", circles=["Fahrzeug"] ) - self.assertEqual(CourseSession.objects.count(), 6) + self.assertEqual(CourseSession.objects.count(), 3) class CreateOrUpdateCourseSessionTestCase(TestCase): diff --git a/server/vbv_lernwelt/importer/tests/test_import_students.py b/server/vbv_lernwelt/importer/tests/test_import_students.py index 6e2186e2..98de80b2 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_students.py +++ b/server/vbv_lernwelt/importer/tests/test_import_students.py @@ -29,7 +29,7 @@ class ImportStudentsTestCase(TestCase): tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet) for row in tuple_list: print(row) - create_or_update_student(self.course, dict(row)) + create_or_update_student(dict(row)) self.assertEqual(CourseSessionUser.objects.count(), 14) @@ -59,7 +59,7 @@ class CreateOrUpdateStudentTestCase(TestCase): (None, None), ] - create_or_update_student(self.course, dict(row)) + create_or_update_student(dict(row)) self.assertEqual( CourseSessionUser.objects.filter(