Skip to content

Commit

Permalink
MDL-28618 question combined feedback: inconsistency in file areas.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
timhunt committed Aug 5, 2011
1 parent 3fdc622 commit a23bda4
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 37 deletions.
6 changes: 6 additions & 0 deletions backup/moodle2/restore_stepslib.php
Expand Up @@ -2637,6 +2637,12 @@ protected function define_execution() {
$oldctxid, $this->task->get_userid(), 'question_answer', null, $newctxid, true);
restore_dbops::send_files_to_pool($this->get_basepath(), $this->get_restoreid(), 'question', 'hint',
$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
$components = backup_qtype_plugin::get_components_and_fileareas($question->qtype);
foreach ($components as $component => $fileareas) {
Expand Down
9 changes: 3 additions & 6 deletions question/type/match/questiontype.php
Expand Up @@ -206,6 +206,8 @@ public function move_files($questionid, $oldcontextid, $newcontextid) {
$fs->move_area_files_to_new_context($oldcontextid,
$newcontextid, 'qtype_match', 'subquestion', $subquestionid);
}

$this->move_files_in_combined_feedback($questionid, $oldcontextid, $newcontextid);
}

protected function delete_files($questionid, $contextid) {
Expand All @@ -220,11 +222,6 @@ protected function delete_files($questionid, $contextid) {
$fs->delete_area_files($contextid, 'qtype_match', 'subquestion', $subquestionid);
}

$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);
$this->delete_files_in_combined_feedback($questionid, $contextid);
}
}
Expand Up @@ -69,17 +69,4 @@ protected function define_question_plugin_structure() {

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');
}
}
20 changes: 2 additions & 18 deletions question/type/multichoice/questiontype.php
Expand Up @@ -231,30 +231,14 @@ public static function get_numbering_styles() {
}

public function move_files($questionid, $oldcontextid, $newcontextid) {
$fs = get_file_storage();

parent::move_files($questionid, $oldcontextid, $newcontextid);
$this->move_files_in_answers($questionid, $oldcontextid, $newcontextid, true);

$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);
$this->move_files_in_combined_feedback($questionid, $oldcontextid, $newcontextid);
}

protected function delete_files($questionid, $contextid) {
$fs = get_file_storage();

parent::delete_files($questionid, $contextid);
$this->delete_files_in_answers($questionid, $contextid, true);

$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);
$this->delete_files_in_combined_feedback($questionid, $contextid);
}
}
41 changes: 41 additions & 0 deletions question/type/questiontypebase.php
Expand Up @@ -1107,6 +1107,28 @@ protected function move_files_in_answers($questionid, $oldcontextid,
}
}

/**
* 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.
* @param int $questionid the question being deleted.
Expand Down Expand Up @@ -1139,6 +1161,25 @@ protected function delete_files_in_answers($questionid, $contextid, $answerstoo
}
}

/**
* 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) {
$fs = get_file_storage();
$record = new stdClass();
Expand Down

0 comments on commit a23bda4

Please sign in to comment.