Merged in fix/uk-importer (pull request #356)

Fix import urls
This commit is contained in:
Christian Cueni 2024-07-22 07:10:25 +00:00
commit 2d3234c7ce
2 changed files with 70 additions and 37 deletions

View File

@ -48,7 +48,7 @@ LP_DATA = {
"slug": "lancement", "slug": "lancement",
"presence_course": "lancement-lc-cours-de-présence-lancement", "presence_course": "lancement-lc-cours-de-présence-lancement",
"assignments": [ "assignments": [
"lancement-lc-mission-de-préparation", "lancement-lc-mandat-de-préparation",
"lancement-lc-déclaration-de-probité", "lancement-lc-déclaration-de-probité",
"lancement-lc-réflexion", "lancement-lc-réflexion",
], ],
@ -83,7 +83,7 @@ LP_DATA = {
"slug": "base", "slug": "base",
"presence_course": "base-lc-cours-de-présence-base", "presence_course": "base-lc-cours-de-présence-base",
"assignments": [ "assignments": [
"base-lc-mission-de-préparation", "base-lc-mandat-de-préparation",
], ],
"edoniq_tests": ["base-lc-questions-de-connaissances-et-de-compréhension"], "edoniq_tests": ["base-lc-questions-de-connaissances-et-de-compréhension"],
}, },
@ -103,7 +103,7 @@ LP_DATA = {
"slug": "fahrzeug", "slug": "fahrzeug",
"presence_course": "fahrzeug-lc-präsenzkurs-fahrzeug", "presence_course": "fahrzeug-lc-präsenzkurs-fahrzeug",
"assignments": [ "assignments": [
"fahrzeug-lc-überprüfen-einer-motorfahrzeug-versicherungspolice", "fahrzeug-lc-geleitete-fallarbeit-überprüfen-einer-versicherungspolice",
"fahrzeug-lc-fahrzeug-mein-erstes-auto", "fahrzeug-lc-fahrzeug-mein-erstes-auto",
], ],
"edoniq_tests": [], "edoniq_tests": [],
@ -113,8 +113,8 @@ LP_DATA = {
"slug": "véhicule", "slug": "véhicule",
"presence_course": "véhicule-lc-cours-de-présence-véhicule", "presence_course": "véhicule-lc-cours-de-présence-véhicule",
"assignments": [ "assignments": [
"véhicule-lc-vérification-dune-police-dassurance-de-véhicule-à-moteur", "véhicule-lc-mandat-de-préparation",
"véhicule-lc-véhicule-à-moteur-ma-première-voiture", "véhicule-lc-étude-de-cas-dirigée-vérification-dune-police-dassurance",
], ],
"edoniq_tests": [], "edoniq_tests": [],
}, },
@ -123,8 +123,8 @@ LP_DATA = {
"slug": "veicolo", "slug": "veicolo",
"presence_course": "veicolo-lc-corso-di-presenza", "presence_course": "veicolo-lc-corso-di-presenza",
"assignments": [ "assignments": [
"veicolo-lc-verifica-di-una-polizza-di-assicurazione-veicoli-a-motore", "veicolo-lc-caso-di-studio-guidato-verifica-di-una-polizza-di-assicurazione",
"veicolo-lc-veicolo-la-mia-prima-auto", "veicolo-lc-incarico-di-preparazione",
], ],
"edoniq_tests": [], "edoniq_tests": [],
}, },
@ -192,7 +192,7 @@ LP_DATA = {
"de": { "de": {
"title": "Reisen & Rechtsstreitigkeiten", "title": "Reisen & Rechtsstreitigkeiten",
"slug": "reisen-rechtsstreitigkeiten", "slug": "reisen-rechtsstreitigkeiten",
"presence_course": "reisen-rechtsstreitigkeiten-lc-präsenzkurs-reisen-rechtsstreiti", "presence_course": "reisen-rechtsstreitigkeiten-lc-präsenzkurs-reisen-rechtsstreitigkeiten",
"assignments": [ "assignments": [
"reisen-rechtsstreitigkeiten-lc-vorbereitungsauftrag", "reisen-rechtsstreitigkeiten-lc-vorbereitungsauftrag",
], ],
@ -203,7 +203,7 @@ LP_DATA = {
"fr": { "fr": {
"title": "Voyages / Litiges juridiques", "title": "Voyages / Litiges juridiques",
"slug": "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": [ "assignments": [
"voyages-litiges-juridiques-lc-mandat-de-préparation", "voyages-litiges-juridiques-lc-mandat-de-préparation",
], ],
@ -214,7 +214,7 @@ LP_DATA = {
"it": { "it": {
"title": "Viaggi e controversie giuridiche", "title": "Viaggi e controversie giuridiche",
"slug": "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": [ "assignments": [
"viaggi-e-controversie-giuridiche-lc-incarico-di-preparazione", "viaggi-e-controversie-giuridiche-lc-incarico-di-preparazione",
], ],
@ -237,7 +237,7 @@ LP_DATA = {
"fr": { "fr": {
"title": "Propriété du logement", "title": "Propriété du logement",
"slug": "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": [ "assignments": [
"propriété-du-logement-lc-mandat-de-préparation", "propriété-du-logement-lc-mandat-de-préparation",
"propriété-du-logement-lc-etude-de-cas-dirigée", "propriété-du-logement-lc-etude-de-cas-dirigée",
@ -247,7 +247,7 @@ LP_DATA = {
"it": { "it": {
"title": "Casa di proprietà", "title": "Casa di proprietà",
"slug": "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": [ "assignments": [
"casa-di-proprietà-lc-incarico-di-preparazione", "casa-di-proprietà-lc-incarico-di-preparazione",
"casa-di-proprietà-lc-caso-di-studio-guidato-dal-cantiere-alla-propria-casa", "casa-di-proprietà-lc-caso-di-studio-guidato-dal-cantiere-alla-propria-casa",
@ -268,7 +268,7 @@ LP_DATA = {
"fr": { "fr": {
"title": "PME, Partie 1", "title": "PME, Partie 1",
"slug": "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": [ "assignments": [
"pme-partie-1-lc-mandat-de-préparation", "pme-partie-1-lc-mandat-de-préparation",
], ],
@ -279,7 +279,7 @@ LP_DATA = {
"it": { "it": {
"title": "PMI parte 1", "title": "PMI parte 1",
"slug": "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": [ "assignments": [
"pmi-parte-1-lc-incarico-di-preparazione", "pmi-parte-1-lc-incarico-di-preparazione",
], ],
@ -300,7 +300,7 @@ LP_DATA = {
"fr": { "fr": {
"title": "PME, Partie 2", "title": "PME, Partie 2",
"slug": "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": [ "assignments": [
"pme-partie-2-lc-mandat-de-préparation", "pme-partie-2-lc-mandat-de-préparation",
"pme-partie-2-lc-etude-de-cas-dirigée", "pme-partie-2-lc-etude-de-cas-dirigée",
@ -310,10 +310,10 @@ LP_DATA = {
"it": { "it": {
"title": "PMI parte 2", "title": "PMI parte 2",
"slug": "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": [ "assignments": [
"pmi-parte-2-lc-incarico-di-preparazione", "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": [], "edoniq_tests": [],
}, },
@ -322,16 +322,16 @@ LP_DATA = {
"de": { "de": {
"title": "3-säulenkonzept", "title": "3-säulenkonzept",
"slug": "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": [ "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": { "fr": {
"title": "Concept des 3 piliers", "title": "Concept des 3 piliers",
"slug": "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": [ "assignments": [
"concept-des-3-piliers-lc-mandat-de-préparation", "concept-des-3-piliers-lc-mandat-de-préparation",
], ],
@ -342,7 +342,7 @@ LP_DATA = {
"it": { "it": {
"title": "Concetto dei 3 pilastri", "title": "Concetto dei 3 pilastri",
"slug": "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": [ "assignments": [
"concetto-dei-3-pilastri-lc-incarico-di-preparazione", "concetto-dei-3-pilastri-lc-incarico-di-preparazione",
], ],
@ -366,7 +366,7 @@ LP_DATA = {
"fr": { "fr": {
"title": "Garantie des revenus, Partie 1", "title": "Garantie des revenus, Partie 1",
"slug": "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": [ "assignments": [
"garantie-des-revenus-partie-1-lc-mandat-de-préparation", "garantie-des-revenus-partie-1-lc-mandat-de-préparation",
], ],
@ -377,7 +377,7 @@ LP_DATA = {
"it": { "it": {
"title": "Protezione del reddito parte 1", "title": "Protezione del reddito parte 1",
"slug": "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": [ "assignments": [
"protezione-del-reddito-parte-1-lc-incarico-di-preparazione", "protezione-del-reddito-parte-1-lc-incarico-di-preparazione",
], ],
@ -390,7 +390,7 @@ LP_DATA = {
"de": { "de": {
"title": "Einkommenssicherung (Todesfall)", "title": "Einkommenssicherung (Todesfall)",
"slug": "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": [ "assignments": [
"einkommenssicherung-todesfall-lc-vorbereitungsauftrag", "einkommenssicherung-todesfall-lc-vorbereitungsauftrag",
], ],
@ -401,7 +401,7 @@ LP_DATA = {
"fr": { "fr": {
"title": "Garantie des revenus, Partie 2", "title": "Garantie des revenus, Partie 2",
"slug": "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": [ "assignments": [
"garantie-des-revenus-partie-2-lc-mandat-de-préparation", "garantie-des-revenus-partie-2-lc-mandat-de-préparation",
], ],
@ -410,14 +410,15 @@ LP_DATA = {
], ],
}, },
"it": { "it": {
"title": "Casa di proprietà", "title": "Protezione del reddito parte 2",
"slug": "casa-di-proprietà", "slug": "protezione-del-reddito-parte-2",
"presence_course": "", "presence_course": "protezione-del-reddito-parte-2-lc-corso-di-presenza-protezione-del-reddito-parte-2",
"assignments": [ "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": { "Pensionierung": {
@ -427,14 +428,14 @@ LP_DATA = {
"presence_course": "pensionierung-lc-präsenzkurs-pensionierung", "presence_course": "pensionierung-lc-präsenzkurs-pensionierung",
"assignments": [ "assignments": [
"pensionierung-lc-vorbereitungsauftrag", "pensionierung-lc-vorbereitungsauftrag",
"pensionierung-lc-geleitete-fallarbeit-geleitete-fallarbeit", "pensionierung-lc-geleitete-fallarbeit",
], ],
"edoniq_tests": [], "edoniq_tests": [],
}, },
"fr": { "fr": {
"title": "Retraite", "title": "Retraite",
"slug": "retraite", "slug": "retraite",
"presence_course": "retraite-lc-cours-de-présence", "presence_course": "retraite-lc-cours-de-présence-retraite",
"assignments": [ "assignments": [
"retraite-lc-mandat-de-préparation", "retraite-lc-mandat-de-préparation",
"retraite-lc-etude-de-cas-dirigée", "retraite-lc-etude-de-cas-dirigée",
@ -444,7 +445,7 @@ LP_DATA = {
"it": { "it": {
"title": "Pensionamento", "title": "Pensionamento",
"slug": "pensionamento", "slug": "pensionamento",
"presence_course": "pensionamento-lc-corso-di-presenza", "presence_course": "pensionamento-lc-corso-di-presenza-pensionamento",
"assignments": [ "assignments": [
"pensionamento-lc-incarico-di-preparazione", "pensionamento-lc-incarico-di-preparazione",
"pensionamento-lc-caso-di-studio-guidato", "pensionamento-lc-caso-di-studio-guidato",
@ -648,7 +649,8 @@ def create_or_update_course_session(
presence_day_end = try_parse_datetime( presence_day_end = try_parse_datetime(
data[f"{circle} {TRANSLATIONS[language]['ende']}"] data[f"{circle} {TRANSLATIONS[language]['ende']}"]
)[1] )[1]
except KeyError: except KeyError as e:
logger.debug("import", type="presence_data", key_error=e)
continue continue
if attendance_course_lc: if attendance_course_lc:
@ -662,6 +664,14 @@ def create_or_update_course_session(
presence_day_end, 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"]: for assignment_slug in circle_data["assignments"]:
create_or_update_course_session_assignment( create_or_update_course_session_assignment(
cs, course.slug, assignment_slug, presence_day_start cs, course.slug, assignment_slug, presence_day_start
@ -758,6 +768,13 @@ def create_or_update_course_session_assignment(
) + timezone.timedelta(days=45) ) + timezone.timedelta(days=45)
csa.evaluation_deadline.end = None csa.evaluation_deadline.end = None
csa.evaluation_deadline.save() 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( 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.end = None
cset.deadline.save() 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]): def validate_row_data(data: Dict[str, any], required_headers: List[str]):

View File

@ -26,7 +26,7 @@ from vbv_lernwelt.importer.utils import (
calc_header_tuple_list_from_pyxl_sheet, calc_header_tuple_list_from_pyxl_sheet,
try_parse_datetime, 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__)) test_dir = os.path.dirname(os.path.abspath(__file__))
@ -54,6 +54,15 @@ class CreateOrUpdateCourseSessionTestCase(TestCase):
def setUp(self): def setUp(self):
create_default_users() create_default_users()
self.course = create_test_course(include_vv=False) 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): def test_create_course_session(self):
row = [ row = [