From 0b4c2c04f90d3b09bd3cba359fb07fd1973f5c0c Mon Sep 17 00:00:00 2001
From: Jean-Michel Vedrine
Date: Thu, 4 Apr 2013 18:32:59 +0200
Subject: [PATCH 1/1] MDL-38880 Imported Cloze questions lose embedded images
or other media
---
question/format/xml/format.php | 36 ++++---
.../format/xml/tests/fixtures/multianswer.xml | 27 ++++++
.../sample_questions_with_old_image_tag.xml | 96 +++++++++++++++++++
3 files changed, 144 insertions(+), 15 deletions(-)
create mode 100644 question/format/xml/tests/fixtures/multianswer.xml
create mode 100644 question/format/xml/tests/fixtures/sample_questions_with_old_image_tag.xml
diff --git a/question/format/xml/format.php b/question/format/xml/format.php
index 21b201d1a50..9c8304c6a1f 100644
--- a/question/format/xml/format.php
+++ b/question/format/xml/format.php
@@ -448,37 +448,43 @@ class qformat_xml extends qformat_default {
* @return object question object
*/
public function import_multianswer($question) {
+ global $USER;
question_bank::get_qtype('multianswer');
- $questiontext['text'] = $this->import_text($question['#']['questiontext'][0]['#']['text']);
- $questiontext['format'] = FORMAT_HTML;
- $questiontext['itemid'] = '';
+ $questiontext = $this->import_text_with_files($question,
+ array('#', 'questiontext', 0));
$qo = qtype_multianswer_extract_question($questiontext);
// 'header' parts particular to multianswer
$qo->qtype = 'multianswer';
$qo->course = $this->course;
- $qo->generalfeedback = '';
$qo->name = $this->clean_question_name($this->import_text($question['#']['name'][0]['#']['text']));
$qo->questiontextformat = $questiontext['format'];
$qo->questiontext = $qo->questiontext['text'];
- $itemid = $this->import_files($this->getpath($question,
- array('#', 'questiontext', 0, '#', 'file'), array(), false));
- if (!empty($itemid)) {
- $qo->questiontextitemid = $itemid;
+ if (!empty($questiontext['itemid'])) {
+ $qo->questiontextitemid = $questiontext['itemid'];
}
+
// Backwards compatibility, deal with the old image tag.
$filedata = $this->getpath($question, array('#', 'image_base64', '0', '#'), null, false);
$filename = $this->getpath($question, array('#', 'image', '0', '#'), null, false);
if ($filedata && $filename) {
- $data = new stdClass();
- $data->content = $filedata;
- $data->encoding = 'base64';
- // Question file areas don't support subdirs, so convert path to filename if necessary.
- $data->name = clean_param(str_replace('/', '_', $filename), PARAM_FILE);
- $qo->questiontextfiles[] = $data;
- $qo->questiontext .= '
';
+ $fs = get_file_storage();
+ if (empty($qo->questiontextitemid)) {
+ $qo->questiontextitemid = file_get_unused_draft_itemid();
+ }
+ $filename = clean_param(str_replace('/', '_', $filename), PARAM_FILE);
+ $filerecord = array(
+ 'contextid' => context_user::instance($USER->id)->id,
+ 'component' => 'user',
+ 'filearea' => 'draft',
+ 'itemid' => $qo->questiontextitemid,
+ 'filepath' => '/',
+ 'filename' => $filename,
+ );
+ $fs->create_file_from_string($filerecord, base64_decode($filedata));
+ $qo->questiontext .= '
';
}
// restore files in generalfeedback
diff --git a/question/format/xml/tests/fixtures/multianswer.xml b/question/format/xml/tests/fixtures/multianswer.xml
new file mode 100644
index 00000000000..5a3cc3422a6
--- /dev/null
+++ b/question/format/xml/tests/fixtures/multianswer.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+ $course$/Default for Test images in backup
+
+
+
+
+
+
+
+ cloze with images
+
+
+ Match the following cities with the correct state,
+California
or Arizona 
* San Francisco: {1:MULTICHOICE:=California#OK~Arizona#Wrong}
* Tucson: {1:MULTICHOICE:California#Wrong~%100%Arizona#OK}
* Los Angeles: {1:MULTICHOICE:=California#OK~Arizona#Wrong}
* Phoenix: {1:MULTICHOICE:%0%California#Wrong~=Arizona#OK}
The capital of France is {1:SHORTANSWER:%100%Paris#Congratulations!
~%50%Marseille#No, that is the second largest city in France (after
Paris).~*#Wrong answer. The capital of France is Paris, of course.}.
]]>
+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
+
+ This is a Moodle question
]]>
+iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHzSURBVDhPxZFbSJNhGIDXERsVGbKawWJaoyAYGeqNYgdl6zenrhhUlB0I6iJEbUl0WF1UUK2DYhDkGghu7Z+HraisPLAsu+0ygi66kCioqwg2t6f///YhzAVBXfTc/HzP9/J8L/wG/pG8QDw+TE+Xn/O+dva07MW5vZayys3yNp/ZwPPRBPuOHqGisordDc00Ki42bqhAjQ3Jid8jAvoL9vIt4qs463G73VRtrcFiseDvuSYG+TwB7y/zfdzHpzeDWachAjeuXyWkPqZ21zZ2Nrioa/JQarOjlK8jes7Eh/s18GwHRMxkgka+3lvEi1ubcgM63Zea6W5v5ESLB4fDwRVvNam+eRBey3TAxqObNl76rXwLFvAlsIyhC2W5gZ+JJmYixQS9q8RZZzpghwEr/R2LpYGPIYWZqJnYSWNugCkPPDDx1JddTyeZqCetasMdS6WB9OQB7Xet5kmbITeQntoP/YWEfSZxFoy5SA2YCXeukAJ+vD5MMl7Cw9YF2UAkGhIXmYSbZLgI9WKxOOukx52kVAvq6eXS6HOHyAyuRz0lN5hlwg19hcTOWqXQ0FxaXZPnGC4V7s+BsToRUM8YpdA2eHswG/DO2eDV7WpGWg30dpZIA5Nddkba5nP3+Epp4F2vwqh3CXeOLZyzwV/wvwPwC58bSNEdAkhaAAAAAElFTkSuQmCC
+ 0.3333333
+ 0
+
+
+
\ No newline at end of file
diff --git a/question/format/xml/tests/fixtures/sample_questions_with_old_image_tag.xml b/question/format/xml/tests/fixtures/sample_questions_with_old_image_tag.xml
new file mode 100644
index 00000000000..852e5bc1979
--- /dev/null
+++ b/question/format/xml/tests/fixtures/sample_questions_with_old_image_tag.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+ $course$/Default for Test images in backup
+
+
+
+
+
+
+
+
+ cloze question with image
+
+
+Match the following cities with the correct state:
* San Francisco: {1:MULTICHOICE:=California#OK~Arizona#Wrong}
* Tucson: {1:MULTICHOICE:California#Wrong~%100%Arizona#OK}
* Los Angeles: {1:MULTICHOICE:=California#OK~Arizona#Wrong}
* Phoenix: {1:MULTICHOICE:%0%California#Wrong~=Arizona#OK}
The capital of France is {1:SHORTANSWER:%100%Paris#Congratulations!
~%50%Marseille#No, that is the second largest city in France (after
Paris).~*#Wrong answer. The capital of France is Paris, of course.}.
]]>
+
+moodle.png
+
+iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHzSURBVDhPxZFbSJNhGIDXERsVGbKawWJaoyAYGeqNYgdl6zenrhhUlB0I6iJEbUl0WF1UUK2DYhDkGghu7Z+HraisPLAsu+0ygi66kCioqwg2t6f///YhzAVBXfTc/HzP9/J8L/wG/pG8QDw+TE+Xn/O+dva07MW5vZayys3yNp/ZwPPRBPuOHqGisordDc00Ki42bqhAjQ3Jid8jAvoL9vIt4qs463G73VRtrcFiseDvuSYG+TwB7y/zfdzHpzeDWachAjeuXyWkPqZ21zZ2Nrioa/JQarOjlK8jes7Eh/s18GwHRMxkgka+3lvEi1ubcgM63Zea6W5v5ESLB4fDwRVvNam+eRBey3TAxqObNl76rXwLFvAlsIyhC2W5gZ+JJmYixQS9q8RZZzpghwEr/R2LpYGPIYWZqJnYSWNugCkPPDDx1JddTyeZqCetasMdS6WB9OQB7Xet5kmbITeQntoP/YWEfSZxFoy5SA2YCXeukAJ+vD5MMl7Cw9YF2UAkGhIXmYSbZLgI9WKxOOukx52kVAvq6eXS6HOHyAyuRz0lN5hlwg19hcTOWqXQ0FxaXZPnGC4V7s+BsToRUM8YpdA2eHswG/DO2eDV7WpGWg30dpZIA5Nddkba5nP3+Epp4F2vwqh3CXeOLZyzwV/wvwPwC58bSNEdAkhaAAAAAElFTkSuQmCC
+
+
+
+
+
+ 0
+
+
+
+
+
+
+ mcq with image
+
+
+
+
+ moodle.png
+
+iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAHzSURBVDhPxZFbSJNhGIDXERsVGbKawWJaoyAYGeqNYgdl6zenrhhUlB0I6iJEbUl0WF1UUK2DYhDkGghu7Z+HraisPLAsu+0ygi66kCioqwg2t6f///YhzAVBXfTc/HzP9/J8L/wG/pG8QDw+TE+Xn/O+dva07MW5vZayys3yNp/ZwPPRBPuOHqGisordDc00Ki42bqhAjQ3Jid8jAvoL9vIt4qs463G73VRtrcFiseDvuSYG+TwB7y/zfdzHpzeDWachAjeuXyWkPqZ21zZ2Nrioa/JQarOjlK8jes7Eh/s18GwHRMxkgka+3lvEi1ubcgM63Zea6W5v5ESLB4fDwRVvNam+eRBey3TAxqObNl76rXwLFvAlsIyhC2W5gZ+JJmYixQS9q8RZZzpghwEr/R2LpYGPIYWZqJnYSWNugCkPPDDx1JddTyeZqCetasMdS6WB9OQB7Xet5kmbITeQntoP/YWEfSZxFoy5SA2YCXeukAJ+vD5MMl7Cw9YF2UAkGhIXmYSbZLgI9WKxOOukx52kVAvq6eXS6HOHyAyuRz0lN5hlwg19hcTOWqXQ0FxaXZPnGC4V7s+BsToRUM8YpdA2eHswG/DO2eDV7WpGWg30dpZIA5Nddkba5nP3+Epp4F2vwqh3CXeOLZyzwV/wvwPwC58bSNEdAkhaAAAAAElFTkSuQmCC
+
+
+
+
+
+ 1
+ 0.1
+ 0
+ 1
+ true
+ true
+
+
+
+
+
+
+ abc
+
+
+wrong answer
+
+
+
+
+
+
+
+
+
+another wrong answer
+
+
+
+
+
+
+
+
+
+right answer
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
--
2.43.0