From 3c239a6a11c698a619a553a3a9493cf40da1c297 Mon Sep 17 00:00:00 2001 From: Tom Dickman Date: Tue, 16 Jul 2019 09:03:54 +1000 Subject: [PATCH] MDL-66137 mod_assign: fixed marking workflow incorrect grade display Aligned logic between quick grading changes and set marking workflow state changes to accurately finalise or remove final grade from the gradebook, depending on the marking workflow state if being used. --- mod/assign/locallib.php | 16 +++++------ mod/assign/tests/events_test.php | 46 +++++++++++++++++++------------- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index f1d2d9b84db..5c2100559c7 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -8064,14 +8064,14 @@ class assign { // Will not apply update if user does not have permission to assign this workflow state. if (!$gradingdisabled && $this->update_user_flags($flags)) { - if ($state == ASSIGN_MARKING_WORKFLOW_STATE_RELEASED) { - // Update Gradebook. - $assign = clone $this->get_instance(); - $assign->cmidnumber = $this->get_course_module()->idnumber; - // Set assign gradebook feedback plugin status. - $assign->gradefeedbackenabled = $this->is_gradebook_feedback_enabled(); - assign_update_grades($assign, $userid); - } + // Update Gradebook. + $grade = $this->get_user_grade($userid, true); + $this->update_grade($grade); + $assign = clone $this->get_instance(); + $assign->cmidnumber = $this->get_course_module()->idnumber; + // Set assign gradebook feedback plugin status. + $assign->gradefeedbackenabled = $this->is_gradebook_feedback_enabled(); + assign_update_grades($assign, $userid); $user = $DB->get_record('user', array('id' => $userid), '*', MUST_EXIST); \mod_assign\event\workflow_state_updated::create_from_user($this, $user, $state)->trigger(); diff --git a/mod/assign/tests/events_test.php b/mod/assign/tests/events_test.php index 9b6eb99fdb3..305763947f7 100644 --- a/mod/assign/tests/events_test.php +++ b/mod/assign/tests/events_test.php @@ -426,24 +426,34 @@ class assign_events_testcase extends advanced_testcase { $assign->testable_process_set_batch_marking_workflow_state($student->id, ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW); $events = $sink->get_events(); - $this->assertCount(1, $events); - $event = reset($events); - $this->assertInstanceOf('\mod_assign\event\workflow_state_updated', $event); - $this->assertEquals($assign->get_context(), $event->get_context()); - $this->assertEquals($assign->get_instance()->id, $event->objectid); - $this->assertEquals($student->id, $event->relateduserid); - $this->assertEquals($teacher->id, $event->userid); - $this->assertEquals(ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW, $event->other['newstate']); - $expected = array( - $assign->get_course()->id, - 'assign', - 'set marking workflow state', - 'view.php?id=' . $assign->get_course_module()->id, - get_string('setmarkingworkflowstateforlog', 'assign', array('id' => $student->id, - 'fullname' => fullname($student), 'state' => ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW)), - $assign->get_course_module()->id - ); - $this->assertEventLegacyLogData($expected, $event); + $eventcount = 0; + foreach ($events as $event) { + if ($event instanceof \mod_assign\event\submission_graded) { + $eventcount++; + $this->assertInstanceOf('\mod_assign\event\submission_graded', $event); + $this->assertEquals($assign->get_context(), $event->get_context()); + } + if ($event instanceof \mod_assign\event\workflow_state_updated) { + $eventcount++; + $this->assertInstanceOf('\mod_assign\event\workflow_state_updated', $event); + $this->assertEquals($assign->get_context(), $event->get_context()); + $this->assertEquals($assign->get_instance()->id, $event->objectid); + $this->assertEquals($student->id, $event->relateduserid); + $this->assertEquals($teacher->id, $event->userid); + $this->assertEquals(ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW, $event->other['newstate']); + $expected = array( + $assign->get_course()->id, + 'assign', + 'set marking workflow state', + 'view.php?id=' . $assign->get_course_module()->id, + get_string('setmarkingworkflowstateforlog', 'assign', array('id' => $student->id, + 'fullname' => fullname($student), 'state' => ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW)), + $assign->get_course_module()->id + ); + $this->assertEventLegacyLogData($expected, $event); + } + } + $this->assertEquals(2, $eventcount); $sink->close(); // Test setting workflow state in apply_grade_to_user.