MDL-53870 mod_quiz: Return sequence and time information for questions
This commit is contained in:
@@ -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)) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user