from django.test import TestCase from django.utils import timezone from vbv_lernwelt.assignment.models import AssignmentType 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, CourseSessionUser from vbv_lernwelt.course_session.models import ( CourseSessionAssignment, CourseSessionAttendanceCourse, ) from vbv_lernwelt.duedate.models import DueDate from vbv_lernwelt.importer.services import ( create_or_update_course_session, create_or_update_trainer, ) from vbv_lernwelt.learnpath.models import ( Circle, LearningContentAssignment, LearningContentAttendanceCourse, ) TEST_SESSION = { "ID": "AG 2023 A", "Generation": "2023", "Region": "Aargau", "Sprache": "de", "Klasse": "A", "Kickoff Start": "30.08.2023, 09:15", "Kickoff Ende": "30.08.2023, 17:00", "Kickoff Raum": "E34", "Kickoff Standort": "HKV Aarau", "Kickoff Adresse": "Bahnhofstrasse 46, 5000, Aarau", "Basis Start": "06.09.2023, 09:15", "Basis Ende": "06.09.2023, 17:00", "Basis Raum": "E34", "Basis Standort": "HKV Aarau", "Basis Adresse": "Bahnhofstrasse 46, 5000, Aarau", "Fahrzeug Start": "08.11.2023, 09:15", "Fahrzeug Ende": "08.11.2023, 17:00", "Fahrzeug Raum": "E34", "Fahrzeug Standort": "HKV Aarau", "Fahrzeug Adresse": "Bahnhofstrasse 46, 5000, Aarau", "Haushalt Teil 1 Start": "17.01.2024, 09:15", "Hauhalt Teil 1 Ende": "17.01.2024, 17:00", "Haushalt Teil 1 Raum": "E34", "Haushalt Teil 1 Standort": "HKV Aarau", "Haushalt Teil 1 Adresse": "Bahnhofstrasse 46, 5000, Aarau", "Haushalt Teil 2 Start": "20.03.2024, 09:15", "Haushalt Teil 2 Ende": "20.03.2024, 17:00", "Haushalt Teil 2 Raum": "E34", "Haushalt Teil 2 Standort": "HKV Aarau", "Haushalt Teil 2 Adresse": "Bahnhofstrasse 46, 5000, Aarau", } TEST_CIRCLES = ["Fahrzeug"] LP_DATA = { "Fahrzeug": { "de": { "title": "Fahrzeug", "slug": "fahrzeug", "presence_course": "fahrzeug-lc-präsenzkurs-fahrzeug", "assignments": [ "fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice", "fahrzeug-lc-fahrzeug-mein-erstes-auto", ], }, }, } TEST_TRAINER = { "Name": "Muster", "Vorname": "Hans", "Email": "Hans.muster@eiger-versicherung.ch", "Sprache": "de", "Generation": "AG 2023", "Klasse": "A", "Circles": "Fahrzeug", "Anrede": "Herr", "Tel. Geschäft": "031 321 32 32", "Tel. Mobil": "079 321 32 32", "Strasse": "Thunstrasse 1", "PLZ": "3014", "Wohnort": "Bern", } class EdoniqSessionImportTestCase(TestCase): def setUp(self) -> None: create_default_users() self.course = create_test_course(with_sessions=False) def test_session_import(self): create_or_update_course_session( self.course, TEST_SESSION, "de", circle_keys=TEST_CIRCLES ) cs = CourseSession.objects.get(import_id="AG 2023 A") self.assertEqual(cs.course, self.course) for circle_name in TEST_CIRCLES: self._check_attendance(circle_name, cs, TEST_SESSION) self._check_assignments(circle_name, cs, TEST_SESSION) self.assertEqual(4, DueDate.objects.count()) def test_update_session_import(self): create_or_update_course_session( self.course, TEST_SESSION, "de", circle_keys=TEST_CIRCLES ) cs = CourseSession.objects.get(import_id="AG 2023 A") trainer1 = User.objects.get(email="test-trainer1@example.com") csu = CourseSessionUser.objects.create( course_session=cs, user=trainer1, role=CourseSessionUser.Role.EXPERT, ) csu.expert.add(Circle.objects.get(slug="test-lehrgang-lp-circle-fahrzeug")) UPDATE_SESSION = { "ID": "AG 2023 A", "Generation": "2023", "Region": "Aargau", "Sprache": "de", "Klasse": "A", "Fahrzeug Start": "09.11.2023, 10:15", "Fahrzeug Ende": "09.11.2023, 16:00", "Fahrzeug Raum": "E35", "Fahrzeug Standort": "HKV Aarau2", "Fahrzeug Adresse": "Bahnhofstrasse 460, 5001, Aarau2", } create_or_update_course_session( self.course, UPDATE_SESSION, "de", circle_keys=TEST_CIRCLES ) for circle_name in TEST_CIRCLES: self._check_attendance( circle_name, cs, UPDATE_SESSION, trainer_name=f"{trainer1.first_name} {trainer1.last_name}", ) self._check_assignments(circle_name, cs, UPDATE_SESSION) self.assertEqual(4, DueDate.objects.count()) def _check_attendance( self, circle_name: str, cs: CourseSession, session_data: dict, trainer_name: str = "", ): attendance = LearningContentAttendanceCourse.objects.filter( slug=f"{self.course.slug}-lp-circle-{LP_DATA[circle_name]['de']['presence_course']}", ) self.assertEqual(attendance.count(), 1) # only one attendance per circle csac = CourseSessionAttendanceCourse.objects.get( course_session=cs, learning_content=attendance.first() ) self.assertEqual( f"{session_data[f'{circle_name} Raum']}, {session_data[f'{circle_name} Standort']}, {session_data[f'{circle_name} Adresse']}", csac.location, ) self.assertEqual( f"{session_data[f'{circle_name} Start']}", timezone.localtime(csac.due_date.start).strftime("%d.%m.%Y, %H:%M"), ) self.assertEqual( f"{session_data[f'{circle_name} Ende']}", timezone.localtime(csac.due_date.end).strftime("%d.%m.%Y, %H:%M"), ) self.assertEqual(trainer_name, csac.trainer) def _check_assignments( self, circle_name: str, cs: CourseSession, session_data: dict ): for assignment_slug in LP_DATA[circle_name]["de"]["assignments"]: csa = CourseSessionAssignment.objects.get( course_session=cs, learning_content=LearningContentAssignment.objects.get( slug=f"{self.course.slug}-lp-circle-{assignment_slug}" ), ) if ( csa.learning_content.assignment_type == AssignmentType.PREP_ASSIGNMENT.value ): self.assertEqual( f"{session_data[f'{circle_name} Start']}", timezone.localtime(csa.submission_deadline.end).strftime( "%d.%m.%Y, %H:%M" ), ) class EdoniqTrainerImportTestCase(TestCase): def setUp(self) -> None: create_default_users() self.course = create_test_course(with_sessions=False) def test_trainer_import(self): create_or_update_course_session( self.course, TEST_SESSION, "de", circle_keys=TEST_CIRCLES ) cs = CourseSession.objects.get(import_id="AG 2023 A") create_or_update_trainer(self.course, TEST_TRAINER) csu = CourseSessionUser.objects.filter( course_session=cs, role=CourseSessionUser.Role.EXPERT, ).first() self.assertEqual(csu.user.first_name, TEST_TRAINER["Vorname"]) self.assertEqual(csu.expert.first().slug, "test-lehrgang-lp-circle-fahrzeug") def test_update_trainer_import(self): create_or_update_course_session( self.course, TEST_SESSION, "de", circle_keys=TEST_CIRCLES ) cs = CourseSession.objects.get(import_id="AG 2023 A") create_or_update_trainer(self.course, TEST_TRAINER) UPDATE_TRAINER = { "Name": "Hansmeier", "Vorname": "Hans", "Email": "Hans.muster@eiger-versicherung.ch", "Sprache": "de", "Generation": "AG 2023", "Klasse": "A", "Circles": "Fahrzeug", "Anrede": "Herr", "Tel. Geschäft": "031 321 32 32", "Tel. Mobil": "079 321 32 32", "Strasse": "Thunstrasse 1", "PLZ": "3014", "Wohnort": "Bern", } csu = CourseSessionUser.objects.filter( course_session=cs, role=CourseSessionUser.Role.EXPERT, ).first() create_or_update_trainer(self.course, UPDATE_TRAINER) self.assertEqual(csu.user.first_name, UPDATE_TRAINER["Vorname"]) self.assertEqual(csu.expert.first().slug, "test-lehrgang-lp-circle-fahrzeug")