From 162ecfd05377d99a2b802d71209d012ab4600db3 Mon Sep 17 00:00:00 2001 From: Wolfgang Wiedermann Date: Thu, 26 Jan 2023 14:40:32 +0100 Subject: [PATCH] =?UTF-8?q?Readme=20nachgebessert,=20Fehler=20im=20Umgang?= =?UTF-8?q?=20mit=20leeren=20und=20fehlerhaften=20Eintr=C3=A4gen=20korrigi?= =?UTF-8?q?ert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 35 ++++++++++++++++++++++++++++++++--- database.db | Bin 12288 -> 12288 bytes excel_file_1.xlsx | Bin 4873 -> 5212 bytes merge_sample.py | 7 ++++--- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 1eacb59..2c4cf90 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ mehrerer sequenziell ausgeführter Uploads von Excel-Dateien mit Noten zu einer Das Verfahren soll sicherstellen, dass auch dann, wenn mehrere Prüfer einer gemeinsamen Prüfung unabhängig voneinander Leistungen via Excel-Import bereitstellen, keine bereits eingetragenen Noten gelöscht werden. -Der Hintergrund ist, dass insb. bei großen Prüfungsgruppen die Korrekturarbeit zwischen mehreren Prüfern aufgeteilt werden soll, ohne dass die Studierenden vorher bereits in Gruppen, die dem Prüfer eindeutig zugeordnet sind, aufgeteilt werden sollen. +Hintergrund der Anforderung ist, dass insb. bei großen Prüfungen einem Prüfungsorganisationssatz mehrere Prüfer\*innen zugewiesen werden. Bei Prüfungsanmeldung melden sich Studierende also für einen Prüfungsorganisationssatz mit mehreren Prüfer\*innen an. Erst im Nachgang (also nach Prüfungsanmeldung) wird die Korrektur der Prüfung unter den Prüfer\*innen aufgeteilt. Eine eindeutige Zuordnung Studierender für einen einzelnen Prüfer\*in ist somit bei Prüfungsanmeldung noch nicht möglich. Jeder Prüfer*in einer Prüfergruppe soll also unabhängig die Noten seiner Prüflinge per Excel-Datei pro Prüfungsorganisationssatz uploaden können. Derzeit muss zwingend die Noteneingabemaske verwendet werden, denn ein Upload eines Prüfers überschreibt den vorigen Upload des anderen Prüfers. Es "zählt" der letzte Upload bevor die Noteneingabe abgeschlossen werden kann. Somit läuft die Hochschule Gefahr Prüfungsleistungen unvollständig oder falsch abzubilden. Jeder der Prüfer soll jedoch trotzdem zur Noteneintragung selbständig und unabhängig von seinen KollegInnen mit dem Excel-Upload arbeiten können. @@ -39,6 +39,35 @@ für alle Zeilen im Tabellenblatt: nein: Eintrag in Fehlerliste (die angezeigt wird!) erzeugen nein: - Wert setzen - ggf. in GUI sichtbarer Protokolleintrag + wenn Note gültig + ja: + Wert setzen + ggf. in GUI sichtbarer Protokolleintrag + nein: + Wert nicht setzen + ggf. in GUI sichtbarer Protokolleintrag +``` + +### Output eines Durchlaufs mit den gegebenen Testdaten + +``` +$ python3 merge_sample.py + +Importiere aus excel_file_1.xlsx - Tabelle1 +Mtknr: 1 Note: 1.0 hinzufügen +Mtknr: 2 Note: 1.3 hinzufügen +Mtknr: 3 Note: 1.0 hinzufügen +Mtknr: 4 Note: 3.0 hinzufügen +Mtknr: 5 Note: 2.3 hinzufügen +Fehlender oder ungültiger Notenwert für Mtknr 6 + +Importiere aus excel_file_2.xlsx - Tabelle1 +Wollen Sie die Note zu 1 auf 1.3 aktualisieren? (j/n) +n +unverändert +Mtknr: 7 Note: 1.3 hinzufügen +Mtknr: 8 Note: 1.0 hinzufügen +Mtknr: 9 Note: 3.0 hinzufügen +Note zu 2 wird nicht geändert, Zeile leer oder ungültig +Note zu 3 wird nicht geändert, Zeile leer oder ungültig ``` \ No newline at end of file diff --git a/database.db b/database.db index f87283086101c5f20cbe5869ec365ecbc842c68f..97c8cdd4958ea62326b7abdc4e3fc2241087daa8 100644 GIT binary patch delta 492 zcmYL_Jxjwt7{|HXT`n2&f9l}SrcIN+8c>RYqf{tv1s4YghfGcm_7k+DVav+oE)W-;35dcQM}wyeU{%ncmEf-NjAx*Aqy|70~XG*YvL)QT$Pd?oYOX?6jKRb z_`m{Jc)FeXMmG92R&ee}>pG#lLqW0eZVnDn{3p%1?F(A88@^_P#uJfUND zx$m5sQEg)o+-(^HN7D$Ll_6LY%vXH1s<_Y#T~IId!b4Q(g)JE9hM-&+#L9r0dH*l0 zngCrGngEW95&RYAizp#C(U$>tWkZMgGB4Ga`fKL7iZ{EGPUwh+bU=HwOIy^Y8m&`+ zAAI8z?|8#2o-v<|&M;O*ne?T*jo}aB_kk#Gp6sK)1ptfx9|iyb diff --git a/excel_file_1.xlsx b/excel_file_1.xlsx index 32fc02578d4faebd343fa4a9961539860fefe0d3..eb2468e2cc22c9440868a4977208ad1e2f9d687c 100644 GIT binary patch delta 3438 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 diff --git a/merge_sample.py b/merge_sample.py index f473ed1..79f8adf 100644 --- a/merge_sample.py +++ b/merge_sample.py @@ -19,7 +19,7 @@ connection = sqlite3.connect(SQLITE_FILE) # Hier als Konstante, da in der Praxis wahrscheinlich aus Kontext # in Webanwendung abgeleitet -PRUEFUNG_ID = 3 +PRUEFUNG_ID = 5 def read_file(filename): # alle Validierungsschritte zugunsten eines übersichtlichen Beispiels eingespart @@ -81,12 +81,13 @@ def merge_data(pruefung_id, new_data): print(f"Note zu {mtknr} wird nicht geändert, Notenwert unverändert") else: print(f"Note zu {mtknr} wird nicht geändert, Zeile leer oder ungültig") - else: + elif is_valid_value(pruefung_id, note): print(f"Mtknr: {mtknr} Note: {note} hinzufügen") # im Falle von HISinOne wegen bereits bestehendem Anmeldesatz auch Update, so aber # einfacher im Beispiel darzustellen... connection.execute(insert_sql, (pruefung_id, mtknr, note)) - + else: + print(f"Fehlender oder ungültiger Notenwert für Mtknr {mtknr}") f1 = read_file("excel_file_1.xlsx")