Skip to content

[BUG] Nachbewertung, Regrading, Löschung und Wiederöffnung von Quizversuchen werden nicht synchronisiert #498

Description

@ralferlebach

Problem

Änderungen an bereits abgegebenen Moodle-Quizversuchen werden nicht vollständig mit dem Lernpfadstatus synchronisiert.

Nicht beobachtet werden insbesondere:

\mod_quiz\event\attempt_manual_grading_completed
\mod_quiz\event\attempt_regraded
\mod_quiz\event\attempt_deleted
\mod_quiz\event\attempt_reopened

Diese Events enthalten den Eigentümer des betroffenen Versuchs in relateduserid.

Ursache

Die Eventregistrierung deckt derzeit nur einen vermeintlichen Abschlussfall und das rein lesende Event attempt_reviewed ab.

Der Lernpfad wird deshalb nicht neu ausgewertet, wenn:

  • Freitextfragen nachträglich manuell bewertet werden,
  • Fragen oder Versuche neu bewertet werden,
  • ein bestandener Versuch gelöscht wird,
  • ein abgeschlossener Versuch wieder geöffnet wird,
  • eine Bewertung nachträglich unter oder über einen Schwellenwert fällt.

Dadurch kann eine Node sowohl fälschlich unvollständig als auch fälschlich abgeschlossen bleiben.

Lösung

Alle Events, die das fachliche Ergebnis eines Quiz verändern können, müssen dieselbe zentrale Recompute-Methode aufrufen.

private static function recompute_quiz_paths(
    int $userid,
    int $quizid
): void {
    // Aktuellen Moodle-Zustand vollständig neu bewerten.
}

Beispielhafte Observer:

public static function quiz_attempt_regraded(
    \mod_quiz\event\attempt_regraded $event
): void {
    learning_path_update::recompute_quiz_paths(
        (int) $event->relateduserid,
        (int) $event->other['quizid']
    );
}

Für Lösch- und Reopen-Ereignisse darf nicht lediglich ein positiver Status ergänzt werden. Der aktuelle Zustand muss vollständig neu berechnet werden, damit ein Abschluss auch zurückgenommen werden kann.

Manuelles Testverfahren

Vorbereitung

  1. Ein Moodle-Quiz mit mindestens einer Freitextfrage anlegen.
  2. Quiz-Maximalnote und Adele-Mindestwert so konfigurieren, dass die manuelle Bewertung über Bestehen oder Nichtbestehen entscheidet.
  3. Das Quiz als Abschlussbedingung einer Node konfigurieren.
  4. Einen Studierenden dem Lernpfad zuordnen.

Testschritte

  1. Als Studierender den Versuch abgeben.
  2. Als Lehrender die Freitextfrage so bewerten, dass der Mindestwert überschritten wird.
  3. Den Lernpfaddatensatz kontrollieren, ohne dass der Studierende den Hostkurs erneut öffnet.
  4. Anschließend den Hostkurs als Studierender öffnen und erneut kontrollieren.
  5. Als Lehrender den Versuch auf einen Wert unterhalb der Mindestpunktzahl nachbewerten.
  6. Den Lernpfaddatensatz erneut kontrollieren.
  7. Den Versuch löschen oder wieder öffnen.
  8. Den Lernpfaddatensatz erneut kontrollieren.
  9. Abschließend den Hostkurs öffnen und prüfen, ob dadurch eine verspätete Neuberechnung erfolgt.

Aktuelles Ist-Verhalten

  • Die manuelle Bewertung aktualisiert die Node nicht unmittelbar.
  • Eine Nachbewertung unterhalb des Mindestwerts nimmt einen gespeicherten Abschluss nicht zurück.
  • Löschung und Wiederöffnung werden nicht synchronisiert.
  • Erst ein anderer Trigger wie course_viewed kann den Zustand verspätet korrigieren.

Erwartetes Soll-Verhalten

Jede fachlich relevante Änderung eines Quizversuchs führt unmittelbar zu einer vollständigen Neuberechnung. Positive und negative Statusänderungen werden gleichermaßen übernommen.

Automatisierte Tests

  • Manuelle Bewertung: unvollständig → abgeschlossen.
  • Regrading: abgeschlossen → unvollständig.
  • Versuchslöschung: Abschluss wird zurückgenommen, sofern kein anderer gültiger Versuch existiert.
  • Wiederöffnung: Zustand wird neu bewertet.
  • Mehrere Versuche: Der nach Moodle-Grading-Methode gültige Gesamtwert wird verwendet.
  • Unterschiedliche Werte für userid und relateduserid.

Akzeptanzkriterien

  • Manuelle Abschlussbewertung löst eine Aktualisierung aus.
  • Regrading löst eine Aktualisierung aus.
  • Versuchslöschung löst eine Aktualisierung aus.
  • Wiederöffnung löst eine Aktualisierung aus.
  • Sowohl positive als auch negative Statusänderungen werden gespeichert.
  • attempt_reviewed wird nicht als Ersatz für fachliche Änderungsereignisse verwendet.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions