From 842b0b4334db580db0da51641fcfcd0d5711cb8d Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Fri, 21 Jul 2023 10:24:52 +0200 Subject: [PATCH] Update not delete `CourseSessionAttendanceCourse` --- server/vbv_lernwelt/importer/services.py | 24 ++++----- .../tests/test_import_course_sessions.py | 51 +++++++++++++++++++ 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/server/vbv_lernwelt/importer/services.py b/server/vbv_lernwelt/importer/services.py index 9e83290d..b773b221 100644 --- a/server/vbv_lernwelt/importer/services.py +++ b/server/vbv_lernwelt/importer/services.py @@ -150,25 +150,20 @@ def create_or_update_course_session( for circle in circle_keys: circle_name = CIRCLE_NAMES[circle][language] - attendance_course_lp_qs = LearningContentAttendanceCourse.objects.filter( + attendance_course_lc = LearningContentAttendanceCourse.objects.filter( slug=f"{course.slug}-lp-circle-{circle_name.lower()}-lc-präsenzkurs-{circle_name.lower()}" - ) + ).first() - if attendance_course_lp_qs and attendance_course_lp_qs.exists(): - # reset existing data - # TODO: Is this save? stuff shouldn't get lost - CourseSessionAttendanceCourse.objects.filter( - course_session=cs, learning_content=attendance_course_lp_qs.first() - ).delete() + if attendance_course_lc: + # update existing data + csa, _created = CourseSessionAttendanceCourse.objects.get_or_create( + course_session=cs, learning_content=attendance_course_lc + ) location = f"{data[f'{circle} Raum']}, {data[f'{circle} Standort']}, {data[f'{circle} Adresse']}" + csa.location = location - csa = CourseSessionAttendanceCourse.objects.create( - course_session=cs, - learning_content=attendance_course_lp_qs.first(), - location=location, - trainer="", - ) + csa.trainer = "" csa.due_date.start = try_parse_datetime(data[f"{circle} Start"])[1] csa.due_date.end = try_parse_datetime(data[f"{circle} Ende"])[1] csa.due_date.save() @@ -269,7 +264,6 @@ def create_or_update_trainer(course: Course, data: Dict[str, Any], language="de" # circle expert handling circle_data = parse_circle_group_string(data["Circles"]) for circle_key in circle_data: - circle_name = CIRCLE_NAMES[circle_key][language] # print(circle_name, groups) 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 1d517d6d..49c2b0da 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py +++ b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py @@ -123,6 +123,57 @@ class CreateOrUpdateCourseSessionTestCase(TestCase): attendance_course.due_date.end.isoformat(), "2023-06-06T13:00:00+00:00" ) + def test_import_course_session_twice(self): + """ + importing the course session twice should create the + `CourseSessionAttendanceCourse` only once + """ + row = [ + ("ID", "DE 2023 A"), + ("Generation", 2023), + ("Region", "Deutschschweiz"), + ("Sprache", "de"), + ("Klasse", "A"), + ("Fahrzeug Start", "06.06.2023, 13:30"), + ("Fahrzeug Ende", "06.06.2023, 15:00"), + ( + "Fahrzeug Raum", + "https://teams.microsoft.com/l/meetup-join/19%3ameeting_N2I5YzViZTQtYTM2Ny00OTYwLTgzNzAtYWI4OTQzODcxNTlj%40thread.v2/0?context=%7b%22Tid%22%3a%22fedd03c8-a756-4803-8f27-0db8f7c488f2%22%2c%22Oid%22%3a%22f92e6382-3884-4e71-a2fd-b305a75d9812%22%7d", + ), + ("Fahrzeug Standort", None), + ("Fahrzeug Adresse", None), + ] + + data = dict(row) + + cs1 = create_or_update_course_session( + self.course, data, language="de", circle_keys=["Fahrzeug"] + ) + attendance_course1 = CourseSessionAttendanceCourse.objects.first() + self.assertEqual( + attendance_course1.due_date.start.isoformat(), "2023-06-06T11:30:00+00:00" + ) + self.assertEqual( + attendance_course1.due_date.end.isoformat(), "2023-06-06T13:00:00+00:00" + ) + + # import a second time + data["Fahrzeug Start"] = "06.06.2023, 13:15" + data["Fahrzeug Ende"] = "06.06.2023, 14:45" + cs2 = create_or_update_course_session( + self.course, data, language="de", circle_keys=["Fahrzeug"] + ) + + self.assertEqual(cs1.id, cs2.id) + attendance_course2 = CourseSessionAttendanceCourse.objects.first() + self.assertEqual( + attendance_course2.due_date.start.isoformat(), "2023-06-06T11:15:00+00:00" + ) + self.assertEqual( + attendance_course2.due_date.end.isoformat(), "2023-06-06T12:45:00+00:00" + ) + self.assertEqual(attendance_course1.id, attendance_course2.id) + def test_raise_exception_if_header_is_missing(self): data = [ ("ID", "DE 2023"),