mirror of
https://github.com/moodle/moodle.git
synced 2025-03-14 12:40:01 +01:00
1. database upgrade to merge instructions into the questiontext field, and remove the UNITDISPLAY option. 2. Changes to the validation in deferred feedback mode, so students are warned about incomplete answers. 3. Using this to wark students if they enter an answer that is not recognised as a number.
125 lines
4.4 KiB
PHP
125 lines
4.4 KiB
PHP
<?php
|
|
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/**
|
|
* Question behaviour for the case when the student's answer is just
|
|
* saved until they submit the whole attempt, and then it is graded.
|
|
*
|
|
* @package qbehaviour
|
|
* @subpackage deferredfeedback
|
|
* @copyright 2009 The Open University
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
|
|
defined('MOODLE_INTERNAL') || die();
|
|
|
|
|
|
/**
|
|
* Question behaviour for deferred feedback.
|
|
*
|
|
* The student enters their response during the attempt, and it is saved. Later,
|
|
* when the whole attempt is finished, their answer is graded.
|
|
*
|
|
* @copyright 2009 The Open University
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
class qbehaviour_deferredfeedback extends question_behaviour_with_save {
|
|
const IS_ARCHETYPAL = true;
|
|
|
|
public function required_question_definition_type() {
|
|
return 'question_automatically_gradable';
|
|
}
|
|
|
|
public static function get_unused_display_options() {
|
|
return array('correctness', 'marks', 'specificfeedback', 'generalfeedback',
|
|
'rightanswer');
|
|
}
|
|
|
|
public function get_min_fraction() {
|
|
return $this->question->get_min_fraction();
|
|
}
|
|
|
|
public function get_right_answer_summary() {
|
|
return $this->question->get_right_answer_summary();
|
|
}
|
|
|
|
public function process_action(question_attempt_pending_step $pendingstep) {
|
|
if ($pendingstep->has_behaviour_var('comment')) {
|
|
return $this->process_comment($pendingstep);
|
|
} else if ($pendingstep->has_behaviour_var('finish')) {
|
|
return $this->process_finish($pendingstep);
|
|
} else {
|
|
return $this->process_save($pendingstep);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Like the parent method, except that when a respones is gradable, but not
|
|
* completely, we move it to the invalid state.
|
|
*
|
|
* TODO refactor, to remove the duplication.
|
|
*/
|
|
public function process_save(question_attempt_pending_step $pendingstep) {
|
|
if ($this->qa->get_state()->is_finished()) {
|
|
return question_attempt::DISCARD;
|
|
} else if (!$this->qa->get_state()->is_active()) {
|
|
throw new coding_exception('Question is not active, cannot process_actions.');
|
|
}
|
|
|
|
if ($this->is_same_response($pendingstep)) {
|
|
return question_attempt::DISCARD;
|
|
}
|
|
|
|
if ($this->is_complete_response($pendingstep)) {
|
|
$pendingstep->set_state(question_state::$complete);
|
|
} else if ($this->question->is_gradable_response($pendingstep->get_qt_data())) {
|
|
$pendingstep->set_state(question_state::$invalid);
|
|
} else {
|
|
$pendingstep->set_state(question_state::$todo);
|
|
}
|
|
return question_attempt::KEEP;
|
|
}
|
|
|
|
public function summarise_action(question_attempt_step $step) {
|
|
if ($step->has_behaviour_var('comment')) {
|
|
return $this->summarise_manual_comment($step);
|
|
} else if ($step->has_behaviour_var('finish')) {
|
|
return $this->summarise_finish($step);
|
|
} else {
|
|
return $this->summarise_save($step);
|
|
}
|
|
}
|
|
|
|
public function process_finish(question_attempt_pending_step $pendingstep) {
|
|
if ($this->qa->get_state()->is_finished()) {
|
|
return question_attempt::DISCARD;
|
|
}
|
|
|
|
$response = $this->qa->get_last_step()->get_qt_data();
|
|
if (!$this->question->is_gradable_response($response)) {
|
|
$pendingstep->set_state(question_state::$gaveup);
|
|
} else {
|
|
list($fraction, $state) = $this->question->grade_response($response);
|
|
$pendingstep->set_fraction($fraction);
|
|
$pendingstep->set_state($state);
|
|
}
|
|
$pendingstep->set_new_response_summary($this->question->summarise_response($response));
|
|
return question_attempt::KEEP;
|
|
}
|
|
}
|