VBV-544: Import edoniq data via "Kursfreigaben ID"/edoniq_course_release_id
This commit is contained in:
parent
86cf8f44d3
commit
919d3267c7
|
|
@ -476,10 +476,10 @@ damit du erfolgreich mit deinem Lernpfad (durch-)starten kannst.
|
||||||
),
|
),
|
||||||
checkbox_text="Hiermit bestätige ich, dass ich die Anweisungen verstanden und die Redlichkeitserklärung akzeptiert habe.",
|
checkbox_text="Hiermit bestätige ich, dass ich die Anweisungen verstanden und die Redlichkeitserklärung akzeptiert habe.",
|
||||||
test_url="https://exam.vbv-afa.ch/e-tutor/v4/user/course/pre_course_object?aid=1689096897473,2147466097",
|
test_url="https://exam.vbv-afa.ch/e-tutor/v4/user/course/pre_course_object?aid=1689096897473,2147466097",
|
||||||
edoniq_course_release_id="1689096897473",
|
edoniq_course_release_id="1689096523730",
|
||||||
edoniq_sequence_id="1688059890497",
|
edoniq_sequence_id="1688059890497",
|
||||||
extended_time_test_url="https://exam2.vbv-afa.ch/e-tutor/v4/user/course/pre_course_object?aid=1689096897473,2147466097",
|
extended_time_test_url="https://exam2.vbv-afa.ch/e-tutor/v4/user/course/pre_course_object?aid=1689096897473,2147466097",
|
||||||
edoniq_extended_course_release_id="1689096897473",
|
edoniq_extended_course_release_id="1691157696911",
|
||||||
edoniq_extended_sequence_id="1691151920116",
|
edoniq_extended_sequence_id="1691151920116",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,9 @@ if __name__ == "__main__":
|
||||||
csv_data = load_edoniq_test_results_csv_data()
|
csv_data = load_edoniq_test_results_csv_data()
|
||||||
csv_reader = csv.reader(StringIO(csv_data), delimiter=";")
|
csv_reader = csv.reader(StringIO(csv_data), delimiter=";")
|
||||||
for i, row in enumerate(csv_reader):
|
for i, row in enumerate(csv_reader):
|
||||||
# if len(row) > 4 and row[4] == "AG 2023 A" and row[5] == "de_üK1_BA_KN":
|
# if len(row) > 4 and row[4] == "AG 2023 A" and row[5] == "de_üK1_KO_Testlauf":
|
||||||
# print(row)
|
# print(row)
|
||||||
if i < 10:
|
if len(row) > 4 and row[6] == "1691151920116":
|
||||||
print(row)
|
print(row)
|
||||||
|
# if i < 10:
|
||||||
|
# print(row)
|
||||||
|
|
|
||||||
|
|
@ -14,25 +14,28 @@ from vbv_lernwelt.learnpath.models import LearningContentEdoniqTest
|
||||||
logger = structlog.get_logger(__name__)
|
logger = structlog.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def get_distinct_sequence_ids():
|
def get_distinct_course_release_ids():
|
||||||
distinct_sequence_ids = LearningContentEdoniqTest.objects.values_list(
|
distinct_course_release_ids = LearningContentEdoniqTest.objects.values_list(
|
||||||
"edoniq_sequence_id", flat=True
|
"edoniq_course_release_id", flat=True
|
||||||
).distinct()
|
).distinct()
|
||||||
|
|
||||||
distinct_sequence_extended_ids = LearningContentEdoniqTest.objects.values_list(
|
distinct_course_release_extended_ids = (
|
||||||
"edoniq_extended_sequence_id", flat=True
|
LearningContentEdoniqTest.objects.values_list(
|
||||||
).distinct()
|
"edoniq_extended_course_release_id", flat=True
|
||||||
|
).distinct()
|
||||||
|
)
|
||||||
|
|
||||||
# filter out empty values
|
# filter out empty values
|
||||||
return {
|
return {
|
||||||
seq_id
|
seq_id
|
||||||
for seq_id in list(distinct_sequence_ids) + list(distinct_sequence_extended_ids)
|
for seq_id in list(distinct_course_release_ids)
|
||||||
|
+ list(distinct_course_release_extended_ids)
|
||||||
if seq_id
|
if seq_id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def filter_relevant_rows(csv_data):
|
def filter_relevant_rows(csv_data):
|
||||||
sequence_ids = get_distinct_sequence_ids()
|
release_ids = get_distinct_course_release_ids()
|
||||||
csv_reader = csv.reader(StringIO(csv_data), delimiter=";")
|
csv_reader = csv.reader(StringIO(csv_data), delimiter=";")
|
||||||
|
|
||||||
# read headers
|
# read headers
|
||||||
|
|
@ -46,7 +49,9 @@ def filter_relevant_rows(csv_data):
|
||||||
row = [item.strip() for item in row]
|
row = [item.strip() for item in row]
|
||||||
records.append(dict(zip(headers, row)))
|
records.append(dict(zip(headers, row)))
|
||||||
|
|
||||||
relevant_rows = [row for row in records if row.get("Sequenz ID") in sequence_ids]
|
relevant_rows = [
|
||||||
|
row for row in records if row.get("Kursfreigaben ID") in release_ids
|
||||||
|
]
|
||||||
|
|
||||||
return relevant_rows
|
return relevant_rows
|
||||||
|
|
||||||
|
|
@ -57,7 +62,7 @@ class EdoniqCsvTestResult:
|
||||||
user_points: float
|
user_points: float
|
||||||
max_points: float
|
max_points: float
|
||||||
passed: bool
|
passed: bool
|
||||||
edoniq_sequence_id: str
|
edoniq_course_release_id: str
|
||||||
unfinished: bool = False
|
unfinished: bool = False
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -67,14 +72,14 @@ def create_edoniq_csv_test_result(edoniq_csv_row_dict) -> EdoniqCsvTestResult:
|
||||||
max_points = float(edoniq_csv_row_dict["erreichbares Punktetotal absolut"])
|
max_points = float(edoniq_csv_row_dict["erreichbares Punktetotal absolut"])
|
||||||
passed = edoniq_csv_row_dict["Bestanden-/Nicht-Bestanden Status"] == "Bestanden"
|
passed = edoniq_csv_row_dict["Bestanden-/Nicht-Bestanden Status"] == "Bestanden"
|
||||||
unfinished = edoniq_csv_row_dict["Bestanden-/Nicht-Bestanden Status"] == "Begonnen"
|
unfinished = edoniq_csv_row_dict["Bestanden-/Nicht-Bestanden Status"] == "Begonnen"
|
||||||
edoniq_sequence_id = edoniq_csv_row_dict["Sequenz ID"]
|
edoniq_course_release_id = edoniq_csv_row_dict["Kursfreigaben ID"]
|
||||||
|
|
||||||
return EdoniqCsvTestResult(
|
return EdoniqCsvTestResult(
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
user_points=user_points,
|
user_points=user_points,
|
||||||
max_points=max_points,
|
max_points=max_points,
|
||||||
passed=passed,
|
passed=passed,
|
||||||
edoniq_sequence_id=edoniq_sequence_id,
|
edoniq_course_release_id=edoniq_course_release_id,
|
||||||
unfinished=unfinished,
|
unfinished=unfinished,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -88,8 +93,10 @@ def upsert_edoniq_test_result(
|
||||||
# because the same edoniq test is used in multiple languages,
|
# because the same edoniq test is used in multiple languages,
|
||||||
# we have to consider multiple learning contents
|
# we have to consider multiple learning contents
|
||||||
learning_content_qs = LearningContentEdoniqTest.objects.filter(
|
learning_content_qs = LearningContentEdoniqTest.objects.filter(
|
||||||
Q(edoniq_sequence_id=edoniq_csv_test_result.edoniq_sequence_id)
|
Q(edoniq_course_release_id=edoniq_csv_test_result.edoniq_course_release_id)
|
||||||
| Q(edoniq_extended_sequence_id=edoniq_csv_test_result.edoniq_sequence_id)
|
| Q(
|
||||||
|
edoniq_extended_course_release_id=edoniq_csv_test_result.edoniq_course_release_id
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
user_course_session_ids = set(
|
user_course_session_ids = set(
|
||||||
|
|
@ -127,7 +134,7 @@ def upsert_edoniq_test_result(
|
||||||
evaluation_passed=edoniq_csv_test_result.passed,
|
evaluation_passed=edoniq_csv_test_result.passed,
|
||||||
evaluation_max_points=edoniq_csv_test_result.max_points,
|
evaluation_max_points=edoniq_csv_test_result.max_points,
|
||||||
additional_json_data={
|
additional_json_data={
|
||||||
"edoniq_sequence_id": edoniq_csv_test_result.edoniq_sequence_id,
|
"edoniq_course_release_id": edoniq_csv_test_result.edoniq_course_release_id,
|
||||||
},
|
},
|
||||||
validate_submission_update=False,
|
validate_submission_update=False,
|
||||||
)
|
)
|
||||||
|
|
@ -138,7 +145,7 @@ def upsert_edoniq_test_result(
|
||||||
label="edoniq_import_results",
|
label="edoniq_import_results",
|
||||||
error="user or learning_content not found",
|
error="user or learning_content not found",
|
||||||
user_id=edoniq_csv_test_result.user_id,
|
user_id=edoniq_csv_test_result.user_id,
|
||||||
sequence_id=edoniq_csv_test_result.edoniq_sequence_id,
|
edoniq_course_release_id=edoniq_csv_test_result.edoniq_course_release_id,
|
||||||
exc_info=True,
|
exc_info=True,
|
||||||
)
|
)
|
||||||
if not fail_silently:
|
if not fail_silently:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
Benutzer Login;Benutzer Name;Benutzer Vorname;Korrespondenzsprache;OE;Sequenztitel;Sequenz ID;letztes Datum der Durchführung des Kandidaten;Zeitstempel Beginn;Bearbeitungsdauer;erreichte Punkte absolut ; erreichbares Punktetotal absolut;erreichte Punkte;Bestehensgrenze prozentual;Bestanden-/Nicht-Bestanden Status;Note;prozentualer Durchschnitt der Versuche dieses Kandidaten;prozentualer Durchschnitt aller Kandidaten
|
Benutzer Login;Benutzer Name;Benutzer Vorname;Korrespondenzsprache;OE;Sequenztitel;Sequenz ID;letztes Datum der Durchführung des Kandidaten;Zeitstempel Beginn;Bearbeitungsdauer;erreichte Punkte absolut ; erreichbares Punktetotal absolut;erreichte Punkte;Bestehensgrenze prozentual;Bestanden-/Nicht-Bestanden Status;Note;prozentualer Durchschnitt der Versuche dieses Kandidaten;prozentualer Durchschnitt aller Kandidaten;Kursfreigaben ID
|
||||||
;
|
;
|
||||||
65c73ad0-6d53-43a9-a4a4-64143f27b03a;Student1;Test;de;Test Bern 2022 a;de_üK1_BA_KN;1688059890497;06.09.2023;06.09.2023 18:48;00:17:10.4650;21.25 ; 29;73.28;60;Bestanden;;73.28;65.91
|
65c73ad0-6d53-43a9-a4a4-64143f27b03a;Student1;Test;de;Test Bern 2022 a;de_üK1_BA_KN;1688059890497;06.09.2023;06.09.2023 18:48;00:17:10.4650;21.25 ; 29;73.28;60;Bestanden;;73.28;65.91;1689096523730
|
||||||
19c40d94-15cc-4198-aaad-ef707c4b0900;Student2;Test;de;Test Bern 2022 a;de_üK1_BA_KN;1688059890497;07.09.2023;07.09.2023 19:00;00:17:49.8550;12.23 ; 29;42.16;60;Nicht bestanden;;42.16;65.91
|
19c40d94-15cc-4198-aaad-ef707c4b0900;Student2;Test;de;Test Bern 2022 a;de_üK1_BA_KN;1688059890497;07.09.2023;07.09.2023 19:00;00:17:49.8550;12.23 ; 29;42.16;60;Nicht bestanden;;42.16;65.91;1689096523730
|
||||||
bcf94dba-53bc-474b-a22d-e4af39aa042b;Student3;Test;de;Test Bern 2022 a;de_üK1_BA_KN;1691151920116;10.09.2023;10.09.2023 10:48;00:18:22.9710;0.00 ; 29;60.76;60;Begonnen;;60.76;65.91
|
bcf94dba-53bc-474b-a22d-e4af39aa042b;Student3;Test;de;Test Bern 2022 a;de_üK1_BA_KN;1691151920116;10.09.2023;10.09.2023 10:48;00:18:22.9710;0.00 ; 29;60.76;60;Begonnen;;60.76;65.91;1689096523730
|
||||||
bcf94dba-53bc-474b-a22d-e4af39aa042b;Student3;Test;de;Test Bern 2022 a;AG 2023 A;de_üK1_KO_Testlauf;1686325621487;10.09.2023;10.09.2023 16:32;00:00:00.0000;0.00 ; 15;0.00;60;Begonnen;;38.11;55.30
|
bcf94dba-53bc-474b-a22d-e4af39aa042b;Student3;Test;de;Test Bern 2022 a;AG 2023 A;de_üK1_KO_Testlauf;1686325621487;10.09.2023;10.09.2023 16:32;00:00:00.0000;0.00 ; 15;0.00;60;Begonnen;;38.11;55.30;1689096897473
|
||||||
|
|
|
@ -14,8 +14,8 @@ from vbv_lernwelt.edoniq_test.result_import.services import (
|
||||||
create_edoniq_csv_test_result,
|
create_edoniq_csv_test_result,
|
||||||
EdoniqCsvTestResult,
|
EdoniqCsvTestResult,
|
||||||
filter_relevant_rows,
|
filter_relevant_rows,
|
||||||
get_distinct_sequence_ids,
|
|
||||||
upsert_edoniq_test_result,
|
upsert_edoniq_test_result,
|
||||||
|
get_distinct_course_release_ids,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -24,10 +24,10 @@ class EdoniqResultImportTestCase(TestCase):
|
||||||
create_default_users()
|
create_default_users()
|
||||||
create_test_course(with_sessions=True)
|
create_test_course(with_sessions=True)
|
||||||
|
|
||||||
def test_get_distinct_sequence_ids(self):
|
def test_get_distinct_release_ids(self):
|
||||||
sequence_ids = get_distinct_sequence_ids()
|
release_ids = get_distinct_course_release_ids()
|
||||||
self.assertEqual(len(sequence_ids), 2)
|
self.assertEqual(len(release_ids), 2)
|
||||||
self.assertSetEqual(sequence_ids, {"1691151920116", "1688059890497"})
|
self.assertSetEqual(release_ids, {"1689096523730", "1691157696911"})
|
||||||
|
|
||||||
def test_filter_relevant_rows(self):
|
def test_filter_relevant_rows(self):
|
||||||
csv_file_path = os.path.dirname(__file__) + "/edoniq_pruefung_resultate.csv"
|
csv_file_path = os.path.dirname(__file__) + "/edoniq_pruefung_resultate.csv"
|
||||||
|
|
@ -64,12 +64,14 @@ class EdoniqResultImportTestCase(TestCase):
|
||||||
self.assertEqual(edoniq_test_result_row.user_points, 21.25)
|
self.assertEqual(edoniq_test_result_row.user_points, 21.25)
|
||||||
self.assertEqual(edoniq_test_result_row.max_points, 29)
|
self.assertEqual(edoniq_test_result_row.max_points, 29)
|
||||||
self.assertEqual(edoniq_test_result_row.passed, True)
|
self.assertEqual(edoniq_test_result_row.passed, True)
|
||||||
self.assertEqual(edoniq_test_result_row.edoniq_sequence_id, "1688059890497")
|
self.assertEqual(
|
||||||
|
edoniq_test_result_row.edoniq_course_release_id, "1689096523730"
|
||||||
|
)
|
||||||
|
|
||||||
def test_upsert_edoniq_test_results(self):
|
def test_upsert_edoniq_test_results(self):
|
||||||
row = EdoniqCsvTestResult(
|
row = EdoniqCsvTestResult(
|
||||||
user_id=TEST_STUDENT1_USER_ID,
|
user_id=TEST_STUDENT1_USER_ID,
|
||||||
edoniq_sequence_id="1688059890497",
|
edoniq_course_release_id="1689096523730",
|
||||||
user_points=21.25,
|
user_points=21.25,
|
||||||
max_points=29,
|
max_points=29,
|
||||||
passed=True,
|
passed=True,
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,6 @@ from django.db import migrations
|
||||||
|
|
||||||
def update_edoniq_ids(apps, schema_editor):
|
def update_edoniq_ids(apps, schema_editor):
|
||||||
LearningContentEdoniqTest = apps.get_model("learnpath", "LearningContentEdoniqTest")
|
LearningContentEdoniqTest = apps.get_model("learnpath", "LearningContentEdoniqTest")
|
||||||
LearningContentEdoniqTest.objects.filter(
|
|
||||||
test_url__icontains="1689096523730"
|
|
||||||
).update(edoniq_sequence_id="1688059890497")
|
|
||||||
LearningContentEdoniqTest.objects.filter(
|
LearningContentEdoniqTest.objects.filter(
|
||||||
test_url__icontains="1689096523730"
|
test_url__icontains="1689096523730"
|
||||||
).update(
|
).update(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue