From 74804b57a4e7c8b88039ba6da33b09f4831488f8 Mon Sep 17 00:00:00 2001 From: Juan Leyva Date: Tue, 26 Apr 2016 12:13:14 +0200 Subject: [PATCH] MDL-53870 mod_quiz: Return sequence and time information for questions --- mod/quiz/classes/external.php | 10 ++++++++- mod/quiz/tests/external_test.php | 36 ++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/mod/quiz/classes/external.php b/mod/quiz/classes/external.php index 0465a430565..03b1bdf2591 100644 --- a/mod/quiz/classes/external.php +++ b/mod/quiz/classes/external.php @@ -877,6 +877,11 @@ class mod_quiz_external extends external_api { 'type' => new external_value(PARAM_ALPHANUMEXT, 'question type, i.e: multichoice'), 'page' => new external_value(PARAM_INT, 'page of the quiz this question appears on'), 'html' => new external_value(PARAM_RAW, 'the question rendered'), + 'sequencecheck' => new external_value(PARAM_INT, 'the number of real steps in this attempt', VALUE_OPTIONAL), + 'lastactiontime' => new external_value(PARAM_INT, 'the timestamp of the most recent step in this question attempt', + VALUE_OPTIONAL), + 'hasautosavedstep' => new external_value(PARAM_BOOL, 'whether this question attempt has autosaved data', + VALUE_OPTIONAL), 'flagged' => new external_value(PARAM_BOOL, 'whether the question is flagged or not'), 'number' => new external_value(PARAM_INT, 'question ordering number in the quiz', VALUE_OPTIONAL), 'state' => new external_value(PARAM_ALPHA, 'the state where the question is in', VALUE_OPTIONAL), @@ -912,7 +917,10 @@ class mod_quiz_external extends external_api { 'type' => $attemptobj->get_question_type_name($slot), 'page' => $attemptobj->get_question_page($slot), 'flagged' => $attemptobj->is_question_flagged($slot), - 'html' => $attemptobj->render_question($slot, $review, $renderer) . $PAGE->requires->get_end_code() + 'html' => $attemptobj->render_question($slot, $review, $renderer) . $PAGE->requires->get_end_code(), + 'sequencecheck' => $attemptobj->get_question_attempt($slot)->get_sequence_check_count(), + 'lastactiontime' => $attemptobj->get_question_attempt($slot)->get_last_step()->get_timecreated(), + 'hasautosavedstep' => $attemptobj->get_question_attempt($slot)->has_autosaved_step() ); if ($attemptobj->is_real_question($slot)) { diff --git a/mod/quiz/tests/external_test.php b/mod/quiz/tests/external_test.php index 9b3472ae930..97f51e72512 100644 --- a/mod/quiz/tests/external_test.php +++ b/mod/quiz/tests/external_test.php @@ -851,6 +851,7 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { public function test_get_attempt_data() { global $DB; + $timenow = time(); // Create a new quiz with one attempt started. list($quiz, $context, $quizobj, $attempt, $attemptobj) = $this->create_quiz_with_questions(true); @@ -878,6 +879,9 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { $this->assertEquals(0, $result['questions'][0]['page']); $this->assertEmpty($result['questions'][0]['mark']); $this->assertEquals(1, $result['questions'][0]['maxmark']); + $this->assertEquals(1, $result['questions'][0]['sequencecheck']); + $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']); + $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']); // Now try the last page. $result = mod_quiz_external::get_attempt_data($attempt->id, 1); @@ -894,6 +898,9 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { $this->assertEquals(get_string('notyetanswered', 'question'), $result['questions'][0]['status']); $this->assertFalse($result['questions'][0]['flagged']); $this->assertEquals(1, $result['questions'][0]['page']); + $this->assertEquals(1, $result['questions'][0]['sequencecheck']); + $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']); + $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']); // Finish previous attempt. $attemptobj->process_finish(time(), false); @@ -982,6 +989,7 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { */ public function test_get_attempt_summary() { + $timenow = time(); // Create a new quiz with one attempt started. list($quiz, $context, $quizobj, $attempt, $attemptobj) = $this->create_quiz_with_questions(true); @@ -998,6 +1006,12 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { $this->assertFalse($result['questions'][1]['flagged']); $this->assertEmpty($result['questions'][0]['mark']); $this->assertEmpty($result['questions'][1]['mark']); + $this->assertEquals(1, $result['questions'][0]['sequencecheck']); + $this->assertEquals(1, $result['questions'][1]['sequencecheck']); + $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']); + $this->assertGreaterThanOrEqual($timenow, $result['questions'][1]['lastactiontime']); + $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']); + $this->assertEquals(false, $result['questions'][1]['hasautosavedstep']); // Submit a response for the first question. $tosubmit = array(1 => array('answer' => '3.14')); @@ -1014,6 +1028,12 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { $this->assertFalse($result['questions'][1]['flagged']); $this->assertEmpty($result['questions'][0]['mark']); $this->assertEmpty($result['questions'][1]['mark']); + $this->assertEquals(2, $result['questions'][0]['sequencecheck']); + $this->assertEquals(1, $result['questions'][1]['sequencecheck']); + $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']); + $this->assertGreaterThanOrEqual($timenow, $result['questions'][1]['lastactiontime']); + $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']); + $this->assertEquals(false, $result['questions'][1]['hasautosavedstep']); } @@ -1022,6 +1042,7 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { */ public function test_save_attempt() { + $timenow = time(); // Create a new quiz with one attempt started. list($quiz, $context, $quizobj, $attempt, $attemptobj, $quba) = $this->create_quiz_with_questions(true); @@ -1053,6 +1074,12 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { $this->assertFalse($result['questions'][1]['flagged']); $this->assertEmpty($result['questions'][0]['mark']); $this->assertEmpty($result['questions'][1]['mark']); + $this->assertEquals(1, $result['questions'][0]['sequencecheck']); + $this->assertEquals(1, $result['questions'][1]['sequencecheck']); + $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']); + $this->assertGreaterThanOrEqual($timenow, $result['questions'][1]['lastactiontime']); + $this->assertEquals(true, $result['questions'][0]['hasautosavedstep']); + $this->assertEquals(false, $result['questions'][1]['hasautosavedstep']); // Now, second slot. $prefix = $quba->get_field_prefix(2); @@ -1073,7 +1100,9 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { // Check it's marked as completed only the first one. $this->assertEquals('complete', $result['questions'][0]['state']); + $this->assertEquals(1, $result['questions'][0]['sequencecheck']); $this->assertEquals('complete', $result['questions'][1]['state']); + $this->assertEquals(1, $result['questions'][1]['sequencecheck']); } @@ -1083,6 +1112,7 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { public function test_process_attempt() { global $DB; + $timenow = time(); // Create a new quiz with two questions and one attempt started. list($quiz, $context, $quizobj, $attempt, $attemptobj, $quba) = $this->create_quiz_with_questions(true); @@ -1114,6 +1144,12 @@ class mod_quiz_external_testcase extends externallib_advanced_testcase { $this->assertFalse($result['questions'][1]['flagged']); $this->assertEmpty($result['questions'][0]['mark']); $this->assertEmpty($result['questions'][1]['mark']); + $this->assertEquals(2, $result['questions'][0]['sequencecheck']); + $this->assertEquals(2, $result['questions'][0]['sequencecheck']); + $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']); + $this->assertGreaterThanOrEqual($timenow, $result['questions'][0]['lastactiontime']); + $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']); + $this->assertEquals(false, $result['questions'][0]['hasautosavedstep']); // Now, second slot. $prefix = $quba->get_field_prefix(2);