diff --git a/server/vbv_lernwelt/importer/services.py b/server/vbv_lernwelt/importer/services.py index 37090dca..f4594a24 100644 --- a/server/vbv_lernwelt/importer/services.py +++ b/server/vbv_lernwelt/importer/services.py @@ -48,7 +48,7 @@ LP_DATA = { "slug": "lancement", "presence_course": "lancement-lc-cours-de-présence-lancement", "assignments": [ - "lancement-lc-mission-de-préparation", + "lancement-lc-mandat-de-préparation", "lancement-lc-déclaration-de-probité", "lancement-lc-réflexion", ], @@ -83,7 +83,7 @@ LP_DATA = { "slug": "base", "presence_course": "base-lc-cours-de-présence-base", "assignments": [ - "base-lc-mission-de-préparation", + "base-lc-mandat-de-préparation", ], "edoniq_tests": ["base-lc-questions-de-connaissances-et-de-compréhension"], }, @@ -103,7 +103,7 @@ LP_DATA = { "slug": "fahrzeug", "presence_course": "fahrzeug-lc-präsenzkurs-fahrzeug", "assignments": [ - "fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice", + "fahrzeug-lc-geleitete-fallarbeit-überprüfen-einer-versicherungspolice", "fahrzeug-lc-fahrzeug-mein-erstes-auto", ], "edoniq_tests": [], @@ -113,8 +113,8 @@ LP_DATA = { "slug": "véhicule", "presence_course": "véhicule-lc-cours-de-présence-véhicule", "assignments": [ - "véhicule-lc-vérification-dune-police-dassurance-de-véhicule-à-moteur", - "véhicule-lc-véhicule-à-moteur-ma-première-voiture", + "véhicule-lc-mandat-de-préparation", + "véhicule-lc-étude-de-cas-dirigée-vérification-dune-police-dassurance", ], "edoniq_tests": [], }, @@ -123,8 +123,8 @@ LP_DATA = { "slug": "veicolo", "presence_course": "veicolo-lc-corso-di-presenza", "assignments": [ - "veicolo-lc-verifica-di-una-polizza-di-assicurazione-veicoli-a-motore", - "veicolo-lc-veicolo-la-mia-prima-auto", + "veicolo-lc-caso-di-studio-guidato-verifica-di-una-polizza-di-assicurazione", + "veicolo-lc-incarico-di-preparazione", ], "edoniq_tests": [], }, @@ -192,7 +192,7 @@ LP_DATA = { "de": { "title": "Reisen & Rechtsstreitigkeiten", "slug": "reisen-rechtsstreitigkeiten", - "presence_course": "reisen-rechtsstreitigkeiten-lc-präsenzkurs-reisen-rechtsstreiti", + "presence_course": "reisen-rechtsstreitigkeiten-lc-präsenzkurs-reisen-rechtsstreitigkeiten", "assignments": [ "reisen-rechtsstreitigkeiten-lc-vorbereitungsauftrag", ], @@ -203,7 +203,7 @@ LP_DATA = { "fr": { "title": "Voyages / Litiges juridiques", "slug": "voyages-litiges-juridiques", - "presence_course": "voyages--litiges-juridiques-lc-cours-de-présence", + "presence_course": "voyages-litiges-juridiques-lc-cours-de-présence-voyages-litiges-juridiques", "assignments": [ "voyages-litiges-juridiques-lc-mandat-de-préparation", ], @@ -214,7 +214,7 @@ LP_DATA = { "it": { "title": "Viaggi e controversie giuridiche", "slug": "viaggi-e-controversie-giuridiche", - "presence_course": "viaggi-e-controversie-giuridiche-lc-corso-di-presenza", + "presence_course": "viaggi-e-controversie-giuridiche-lc-corso-di-presenza-viaggi-e-controversie-giuridiche", "assignments": [ "viaggi-e-controversie-giuridiche-lc-incarico-di-preparazione", ], @@ -237,7 +237,7 @@ LP_DATA = { "fr": { "title": "Propriété du logement", "slug": "propriété-du-logement", - "presence_course": "propriété-du-logement-lc-cours-de-présence", + "presence_course": "propriété-du-logement-lc-cours-de-présence-propriété-du-logement", "assignments": [ "propriété-du-logement-lc-mandat-de-préparation", "propriété-du-logement-lc-etude-de-cas-dirigée", @@ -247,7 +247,7 @@ LP_DATA = { "it": { "title": "Casa di proprietà", "slug": "casa-di-proprietà", - "presence_course": "casa-di-proprietà-lc-corso-di-presenza", + "presence_course": "casa-di-proprietà-lc-corso-di-presenza-casa-di-proprietà", "assignments": [ "casa-di-proprietà-lc-incarico-di-preparazione", "casa-di-proprietà-lc-caso-di-studio-guidato-dal-cantiere-alla-propria-casa", @@ -268,7 +268,7 @@ LP_DATA = { "fr": { "title": "PME, Partie 1", "slug": "pme-partie-1", - "presence_course": "pme-partie-1-lc-cours-de-présence", + "presence_course": "pme-partie-1-lc-cours-de-présence-pme-partie-1", "assignments": [ "pme-partie-1-lc-mandat-de-préparation", ], @@ -279,7 +279,7 @@ LP_DATA = { "it": { "title": "PMI parte 1", "slug": "PMI parte 1", - "presence_course": "pmi-parte-1-lc-corso-di-presenza", + "presence_course": "pmi-parte-1-lc-corso-di-presenza-pmi-parte-1", "assignments": [ "pmi-parte-1-lc-incarico-di-preparazione", ], @@ -300,7 +300,7 @@ LP_DATA = { "fr": { "title": "PME, Partie 2", "slug": "pme-partie-2", - "presence_course": "pme-partie-2-lc-cours-de-présence", + "presence_course": "pme-partie-2-lc-cours-de-présence-pme-partie-2", "assignments": [ "pme-partie-2-lc-mandat-de-préparation", "pme-partie-2-lc-etude-de-cas-dirigée", @@ -310,10 +310,10 @@ LP_DATA = { "it": { "title": "PMI parte 2", "slug": "PMI parte 2", - "presence_course": "pmi-parte-2-lc-corso-di-presenza", + "presence_course": "pmi-parte-2-lc-corso-di-presenza-pmi-parte-2", "assignments": [ "pmi-parte-2-lc-incarico-di-preparazione", - "pmi-parte-2-lc-caso-di-studio-guidato", + "pmi-parte-2-lc-caso-di-studio-guidato-visitare-unazienda-pmi", ], "edoniq_tests": [], }, @@ -322,16 +322,16 @@ LP_DATA = { "de": { "title": "3-säulenkonzept", "slug": "3-säulenkonzept", - "presence_course": "3-säulenkonzept-lc-präsenzkurs-3-säulenkonzept", + "presence_course": "3-säulensystem-lc-präsenzkurs-3-säulenkonzept", "assignments": [ - "3-säulenkonzept-lc-vorbereitungsauftrag", + "3-säulensystem-lc-vorbereitungsauftrag", ], - "edoniq_tests": ["3-säulenkonzept-lc-wissens-und-verständnisfragen"], + "edoniq_tests": ["3-säulensystem-lc-wissens-und-verständnisfragen"], }, "fr": { "title": "Concept des 3 piliers", "slug": "concept-des-3-piliers", - "presence_course": "", + "presence_course": "concept-des-3-piliers-lc-cours-de-présence-concept-des-3-piliers", "assignments": [ "concept-des-3-piliers-lc-mandat-de-préparation", ], @@ -342,7 +342,7 @@ LP_DATA = { "it": { "title": "Concetto dei 3 pilastri", "slug": "concetto-dei-3-pilastri", - "presence_course": "concetto-dei-3-pilastri-lc-corso-di-presenza", + "presence_course": "concetto-dei-3-pilastri-lc-corso-di-presenza-concetto-dei-3-pilastri", "assignments": [ "concetto-dei-3-pilastri-lc-incarico-di-preparazione", ], @@ -366,7 +366,7 @@ LP_DATA = { "fr": { "title": "Garantie des revenus, Partie 1", "slug": "garantie-des-revenus-partie-1", - "presence_course": "garantie-des-revenus-partie-1-lc-cours-de-présence", + "presence_course": "garantie-des-revenus-partie-1-lc-cours-de-présence-garantie-des-revenus-partie-1", "assignments": [ "garantie-des-revenus-partie-1-lc-mandat-de-préparation", ], @@ -377,7 +377,7 @@ LP_DATA = { "it": { "title": "Protezione del reddito parte 1", "slug": "protezione-del-reddito-parte-1", - "presence_course": "protezione-del-reddito-parte-1-lc-corso-di-presenza", + "presence_course": "protezione-del-reddito-parte-1-lc-corso-di-presenza-protezione-del-reddito-parte-1", "assignments": [ "protezione-del-reddito-parte-1-lc-incarico-di-preparazione", ], @@ -390,7 +390,7 @@ LP_DATA = { "de": { "title": "Einkommenssicherung (Todesfall)", "slug": "einkommenssicherung-todesfall", - "presence_course": "einkommenssicherung-invalidität-lc-präsenzkurs-einkommenssicherung-invalidität", + "presence_course": "einkommenssicherung-todesfall-lc-präsenzkurs-einkommenssicherung-todesfall", "assignments": [ "einkommenssicherung-todesfall-lc-vorbereitungsauftrag", ], @@ -401,7 +401,7 @@ LP_DATA = { "fr": { "title": "Garantie des revenus, Partie 2", "slug": "garantie-des-revenus-partie-2", - "presence_course": "garantie-des-revenus-partie-2-lc-cours-de-présence", + "presence_course": "garantie-des-revenus-partie-2-lc-cours-de-présence-garantie-des-revenus-partie-2", "assignments": [ "garantie-des-revenus-partie-2-lc-mandat-de-préparation", ], @@ -410,14 +410,15 @@ LP_DATA = { ], }, "it": { - "title": "Casa di proprietà", - "slug": "casa-di-proprietà", - "presence_course": "", + "title": "Protezione del reddito parte 2", + "slug": "protezione-del-reddito-parte-2", + "presence_course": "protezione-del-reddito-parte-2-lc-corso-di-presenza-protezione-del-reddito-parte-2", "assignments": [ - "", - "", + "protezione-del-reddito-parte-2-lc-incarico-di-preparazione", + ], + "edoniq_tests": [ + "protezione-del-reddito-parte-2-lc-domande-di-conoscenza-e-di-comprensione" ], - "edoniq_tests": [], }, }, "Pensionierung": { @@ -427,14 +428,14 @@ LP_DATA = { "presence_course": "pensionierung-lc-präsenzkurs-pensionierung", "assignments": [ "pensionierung-lc-vorbereitungsauftrag", - "pensionierung-lc-geleitete-fallarbeit-geleitete-fallarbeit", + "pensionierung-lc-geleitete-fallarbeit", ], "edoniq_tests": [], }, "fr": { "title": "Retraite", "slug": "retraite", - "presence_course": "retraite-lc-cours-de-présence", + "presence_course": "retraite-lc-cours-de-présence-retraite", "assignments": [ "retraite-lc-mandat-de-préparation", "retraite-lc-etude-de-cas-dirigée", @@ -444,7 +445,7 @@ LP_DATA = { "it": { "title": "Pensionamento", "slug": "pensionamento", - "presence_course": "pensionamento-lc-corso-di-presenza", + "presence_course": "pensionamento-lc-corso-di-presenza-pensionamento", "assignments": [ "pensionamento-lc-incarico-di-preparazione", "pensionamento-lc-caso-di-studio-guidato", @@ -648,7 +649,8 @@ def create_or_update_course_session( presence_day_end = try_parse_datetime( data[f"{circle} {TRANSLATIONS[language]['ende']}"] )[1] - except KeyError: + except KeyError as e: + logger.debug("import", type="presence_data", key_error=e) continue if attendance_course_lc: @@ -662,6 +664,14 @@ def create_or_update_course_session( presence_day_end, ) + else: + logger.debug( + "import", + type="course_session_attendance", + slug=f"{course.slug}-lp-circle-{circle_data['presence_course']}", + error="Does not exist", + ) + for assignment_slug in circle_data["assignments"]: create_or_update_course_session_assignment( cs, course.slug, assignment_slug, presence_day_start @@ -758,6 +768,13 @@ def create_or_update_course_session_assignment( ) + timezone.timedelta(days=45) csa.evaluation_deadline.end = None csa.evaluation_deadline.save() + else: + logger.debug( + "import", + type="course_session_assignment", + slug=f"{course_slug}-lp-circle-{assignment_slug}", + error="Does not exist", + ) def create_or_update_course_session_edoniq_test( @@ -779,6 +796,13 @@ def create_or_update_course_session_edoniq_test( ) cset.deadline.end = None cset.deadline.save() + else: + logger.debug( + "import", + type="course_session_edoniq_test", + slug=f"{course_slug}-lp-circle-{test_slug}", + error="Does not exist", + ) def validate_row_data(data: Dict[str, any], required_headers: List[str]): 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 c887ea4f..bda1ac8b 100644 --- a/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py +++ b/server/vbv_lernwelt/importer/tests/test_import_course_sessions.py @@ -26,7 +26,7 @@ from vbv_lernwelt.importer.utils import ( calc_header_tuple_list_from_pyxl_sheet, try_parse_datetime, ) -from vbv_lernwelt.learnpath.models import Circle +from vbv_lernwelt.learnpath.models import Circle, LearningContentAssignment test_dir = os.path.dirname(os.path.abspath(__file__)) @@ -54,6 +54,15 @@ class CreateOrUpdateCourseSessionTestCase(TestCase): def setUp(self): create_default_users() self.course = create_test_course(include_vv=False) + # update slug to reflect the real data + assignment_slug = ( + "fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice" + ) + casework = LearningContentAssignment.objects.filter( + slug=f"{self.course.slug}-lp-circle-{assignment_slug}" + ).first() + casework.title = "Geleitete Fallarbeit: Überprüfen einer Versicherungspolice" + casework.save() def test_create_course_session(self): row = [