MDL-28618 question combined feedback: inconsistency in file areas.

The (partially|in)?correct feedback fields acutally store their files in a file area with component 'question'. Some code, however, was written as if they were stored in the qtype_whatever area.
This commit is contained in:
Tim Hunt 2011-08-05 16:45:17 +01:00
parent 3fdc622697
commit a23bda41e4
5 changed files with 52 additions and 37 deletions

View File

@ -2637,6 +2637,12 @@ class restore_create_question_files extends restore_execution_step {
$oldctxid, $this->task->get_userid(), 'question_answer', null, $newctxid, true); $oldctxid, $this->task->get_userid(), 'question_answer', null, $newctxid, true);
restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'hint', restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'hint',
$oldctxid, $this->task->get_userid(), 'question_hint', null, $newctxid, true); $oldctxid, $this->task->get_userid(), 'question_hint', null, $newctxid, true);
restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'correctfeedback',
$oldctxid, $this->task->get_userid(), 'question_created', $question->itemid, $newctxid, true);
restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'partiallycorrectfeedback',
$oldctxid, $this->task->get_userid(), 'question_created', $question->itemid, $newctxid, true);
restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'incorrectfeedback',
$oldctxid, $this->task->get_userid(), 'question_created', $question->itemid, $newctxid, true);
// Add qtype dependent files // Add qtype dependent files
$components = backup_qtype_plugin::get_components_and_fileareas($question->qtype); $components = backup_qtype_plugin::get_components_and_fileareas($question->qtype);
foreach ($components as $component => $fileareas) { foreach ($components as $component => $fileareas) {

View File

@ -206,6 +206,8 @@ class qtype_match extends question_type {
$fs->move_area_files_to_new_context($oldcontextid, $fs->move_area_files_to_new_context($oldcontextid,
$newcontextid, 'qtype_match', 'subquestion', $subquestionid); $newcontextid, 'qtype_match', 'subquestion', $subquestionid);
} }
$this->move_files_in_combined_feedback($questionid, $oldcontextid, $newcontextid);
} }
protected function delete_files($questionid, $contextid) { protected function delete_files($questionid, $contextid) {
@ -220,11 +222,6 @@ class qtype_match extends question_type {
$fs->delete_area_files($contextid, 'qtype_match', 'subquestion', $subquestionid); $fs->delete_area_files($contextid, 'qtype_match', 'subquestion', $subquestionid);
} }
$fs->delete_area_files($contextid, 'qtype_multichoice', $this->delete_files_in_combined_feedback($questionid, $contextid);
'correctfeedback', $questionid);
$fs->delete_area_files($contextid, 'qtype_multichoice',
'partiallycorrectfeedback', $questionid);
$fs->delete_area_files($contextid, 'qtype_multichoice',
'incorrectfeedback', $questionid);
} }
} }

View File

@ -69,17 +69,4 @@ class backup_qtype_multichoice_plugin extends backup_qtype_plugin {
return $plugin; return $plugin;
} }
/**
* Returns one array with filearea => mappingname elements for the qtype
*
* Used by {@link get_components_and_fileareas} to know about all the qtype
* files to be processed both in backup and restore.
*/
public static function get_qtype_fileareas() {
return array(
'correctfeedback' => 'question_created',
'partiallycorrectfeedback' => 'question_created',
'incorrectfeedback' => 'question_created');
}
} }

View File

@ -231,30 +231,14 @@ class qtype_multichoice extends question_type {
} }
public function move_files($questionid, $oldcontextid, $newcontextid) { public function move_files($questionid, $oldcontextid, $newcontextid) {
$fs = get_file_storage();
parent::move_files($questionid, $oldcontextid, $newcontextid); parent::move_files($questionid, $oldcontextid, $newcontextid);
$this->move_files_in_answers($questionid, $oldcontextid, $newcontextid, true); $this->move_files_in_answers($questionid, $oldcontextid, $newcontextid, true);
$this->move_files_in_combined_feedback($questionid, $oldcontextid, $newcontextid);
$fs->move_area_files_to_new_context($oldcontextid,
$newcontextid, 'qtype_multichoice', 'correctfeedback', $questionid);
$fs->move_area_files_to_new_context($oldcontextid,
$newcontextid, 'qtype_multichoice', 'partiallycorrectfeedback', $questionid);
$fs->move_area_files_to_new_context($oldcontextid,
$newcontextid, 'qtype_multichoice', 'incorrectfeedback', $questionid);
} }
protected function delete_files($questionid, $contextid) { protected function delete_files($questionid, $contextid) {
$fs = get_file_storage();
parent::delete_files($questionid, $contextid); parent::delete_files($questionid, $contextid);
$this->delete_files_in_answers($questionid, $contextid, true); $this->delete_files_in_answers($questionid, $contextid, true);
$this->delete_files_in_combined_feedback($questionid, $contextid);
$fs->delete_area_files($contextid,
'qtype_multichoice', 'correctfeedback', $questionid);
$fs->delete_area_files($contextid,
'qtype_multichoice', 'partiallycorrectfeedback', $questionid);
$fs->delete_area_files($contextid,
'qtype_multichoice', 'incorrectfeedback', $questionid);
} }
} }

View File

@ -1107,6 +1107,28 @@ class question_type {
} }
} }
/**
* Move all the files belonging to this question's answers when the question
* is moved from one context to another.
* @param int $questionid the question being moved.
* @param int $oldcontextid the context it is moving from.
* @param int $newcontextid the context it is moving to.
* @param bool $answerstoo whether there is an 'answer' question area,
* as well as an 'answerfeedback' one. Default false.
*/
protected function move_files_in_combined_feedback($questionid, $oldcontextid,
$newcontextid) {
global $DB;
$fs = get_file_storage();
$fs->move_area_files_to_new_context($oldcontextid,
$newcontextid, 'question', 'correctfeedback', $questionid);
$fs->move_area_files_to_new_context($oldcontextid,
$newcontextid, 'question', 'partiallycorrectfeedback', $questionid);
$fs->move_area_files_to_new_context($oldcontextid,
$newcontextid, 'question', 'incorrectfeedback', $questionid);
}
/** /**
* Delete all the files belonging to this question. * Delete all the files belonging to this question.
* @param int $questionid the question being deleted. * @param int $questionid the question being deleted.
@ -1139,6 +1161,25 @@ class question_type {
} }
} }
/**
* Delete all the files belonging to this question's answers.
* @param int $questionid the question being deleted.
* @param int $contextid the context the question is in.
* @param bool $answerstoo whether there is an 'answer' question area,
* as well as an 'answerfeedback' one. Default false.
*/
protected function delete_files_in_combined_feedback($questionid, $contextid) {
global $DB;
$fs = get_file_storage();
$fs->delete_area_files($contextid,
'question', 'correctfeedback', $questionid);
$fs->delete_area_files($contextid,
'question', 'partiallycorrectfeedback', $questionid);
$fs->delete_area_files($contextid,
'question', 'incorrectfeedback', $questionid);
}
public function import_file($context, $component, $filearea, $itemid, $file) { public function import_file($context, $component, $filearea, $itemid, $file) {
$fs = get_file_storage(); $fs = get_file_storage();
$record = new stdClass(); $record = new stdClass();