MDL-53870 mod_quiz: Return sequence and time information for questions

This commit is contained in:
Juan Leyva
2016-09-28 09:25:19 +01:00
parent 5635ead8e6
commit 74804b57a4
2 changed files with 45 additions and 1 deletions
+9 -1
View File
@@ -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)) {
+36
View File
@@ -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);