diff --git a/server/vbv_lernwelt/importer/services.py b/server/vbv_lernwelt/importer/services.py index 6d4f9174..f7aa9987 100644 --- a/server/vbv_lernwelt/importer/services.py +++ b/server/vbv_lernwelt/importer/services.py @@ -5,7 +5,11 @@ from openpyxl.reader.excel import load_workbook from vbv_lernwelt.core.models import User from vbv_lernwelt.course.models import Course, CourseSession, CourseSessionUser -from vbv_lernwelt.importer.utils import try_parse_datetime, parse_circle_group_string +from vbv_lernwelt.importer.utils import ( + try_parse_datetime, + parse_circle_group_string, + calc_header_tuple_list_from_pyxl_sheet, +) from vbv_lernwelt.learnpath.models import LearningContentAttendanceCourse, Circle logger = structlog.get_logger(__name__) @@ -52,13 +56,9 @@ def import_course_sessions_from_excel(course: Course, filename: str): workbook = load_workbook(filename=filename) sheet = workbook["Schulungen Durchführung"] - header = [cell.value for cell in sheet[1]] - - for row in sheet.iter_rows(min_row=2, values_only=True): - row_with_header = list(zip(header, row)) - cs = create_or_update_course_session( - course, dict(row_with_header), circles=["Fahrzeug"] - ) + 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"]) def create_or_update_course_session(course: Course, data: Dict[str, Any], circles=None): @@ -124,13 +124,9 @@ def import_trainers_from_excel(course: Course, filename: str): workbook = load_workbook(filename=filename) sheet = workbook["Schulungen Trainer"] - header = [cell.value for cell in sheet[1]] - - for row in sheet.iter_rows(min_row=2, values_only=True): - if all(cell_value is None for cell_value in row): - continue - row_with_header = list(zip(header, row)) - create_or_update_trainer(course, dict(row_with_header)) + tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet) + for row in tuple_list: + create_or_update_trainer(course, dict(row)) def create_or_update_trainer(course: Course, data: Dict[str, Any]): 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 59ced640..adf1c715 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py +++ b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py @@ -6,6 +6,7 @@ from openpyxl.reader.excel import load_workbook from vbv_lernwelt.course.creators.test_course import create_test_course from vbv_lernwelt.course.models import CourseSession from vbv_lernwelt.importer.services import create_or_update_course_session +from vbv_lernwelt.importer.utils import calc_header_tuple_list_from_pyxl_sheet test_dir = os.path.dirname(os.path.abspath(__file__)) @@ -20,15 +21,12 @@ class ImportCourseSessionTestCase(TestCase): ) sheet = workbook["Schulungen Durchführung"] - header = [cell.value for cell in sheet[1]] - - for row in sheet.iter_rows(min_row=2, values_only=True): - row_with_header = list(zip(header, row)) - print(row_with_header) - cs = create_or_update_course_session( - self.course, dict(row_with_header), circles=["Fahrzeug"] + tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet) + for row in tuple_list: + print(row) + create_or_update_course_session( + self.course, dict(row), circles=["Fahrzeug"] ) - print(cs.title) self.assertEqual(CourseSession.objects.count(), 6) diff --git a/server/vbv_lernwelt/importer/tests/test_import_students.py b/server/vbv_lernwelt/importer/tests/test_import_students.py index 8e026808..cc30ef20 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_students.py +++ b/server/vbv_lernwelt/importer/tests/test_import_students.py @@ -7,6 +7,7 @@ from openpyxl.reader.excel import load_workbook from vbv_lernwelt.course.creators.test_course import create_test_course from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.importer.services import create_or_update_trainer +from vbv_lernwelt.importer.utils import calc_header_tuple_list_from_pyxl_sheet test_dir = os.path.dirname(os.path.abspath(__file__)) @@ -19,13 +20,9 @@ class ImportStudentsTestCase(TestCase): workbook = load_workbook(filename=f"{test_dir}/Schulungen_Teilnehmende.xlsx") sheet = workbook.active - header = [cell.value for cell in sheet[1]] - - for row in sheet.iter_rows(min_row=2, values_only=True): - if all(cell_value is None for cell_value in row): - continue - row_with_header = list(zip(header, row)) - print(row_with_header) + tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet) + for row in tuple_list: + print(row) class CreateOrUpdateCourseSessionTestCase(TestCase): diff --git a/server/vbv_lernwelt/importer/tests/test_import_trainers.py b/server/vbv_lernwelt/importer/tests/test_import_trainers.py index aec5a2f7..2d7478be 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_trainers.py +++ b/server/vbv_lernwelt/importer/tests/test_import_trainers.py @@ -6,6 +6,7 @@ from openpyxl.reader.excel import load_workbook from vbv_lernwelt.course.creators.test_course import create_test_course from vbv_lernwelt.course.models import CourseSession, CourseSessionUser from vbv_lernwelt.importer.services import create_or_update_trainer +from vbv_lernwelt.importer.utils import calc_header_tuple_list_from_pyxl_sheet test_dir = os.path.dirname(os.path.abspath(__file__)) @@ -20,14 +21,10 @@ class ImportTrainerTestCase(TestCase): ) sheet = workbook["Schulungen Trainer"] - header = [cell.value for cell in sheet[1]] - - for row in sheet.iter_rows(min_row=2, values_only=True): - row_with_header = list(zip(header, row)) - if all(cell_value is None for cell_value in row): - continue - print(row_with_header) - create_or_update_trainer(self.course, dict(row_with_header)) + tuple_list = calc_header_tuple_list_from_pyxl_sheet(sheet) + for row in tuple_list: + print(row) + create_or_update_trainer(self.course, dict(row)) class CreateOrUpdateCourseSessionTestCase(TestCase): diff --git a/server/vbv_lernwelt/importer/tests/test_utils.py b/server/vbv_lernwelt/importer/tests/test_utils.py index 6f5259e1..69b9bdc6 100644 --- a/server/vbv_lernwelt/importer/tests/test_utils.py +++ b/server/vbv_lernwelt/importer/tests/test_utils.py @@ -183,7 +183,7 @@ class TryParseDateTimeTestCase(TestCase): self.assertEqual(datetime(2023, 6, 9, 13, 30, 0), value) -class ParceCircleGroupStringTestCase(TestCase): +class ParseCircleGroupStringTestCase(TestCase): def test_withMultipleCircles(self): value = "Fahrzeug (A, B), Reisen (A), KMU (B)" self.assertEqual( diff --git a/server/vbv_lernwelt/importer/utils.py b/server/vbv_lernwelt/importer/utils.py index 6700209e..a64841b0 100644 --- a/server/vbv_lernwelt/importer/utils.py +++ b/server/vbv_lernwelt/importer/utils.py @@ -96,3 +96,15 @@ def parse_circle_group_string(value: str) -> List[str]: # re.split() splits the string based on the pattern return [x.strip() for x in re.split(pattern, value)] + + +def calc_header_tuple_list_from_pyxl_sheet(sheet): + header = [cell.value for cell in sheet[1]] + + result = [] + for row in sheet.iter_rows(min_row=2, values_only=True): + if all(cell_value is None for cell_value in row): + continue + result.append(list(zip(header, row))) + + return result