Skip to content

Commit 497c79a

Browse files
authored
Merge pull request #5392 from rtibbles/input_questions_qti
Fix input question related publish issues
2 parents 8a9f7a9 + 9ee1671 commit 497c79a

File tree

2 files changed

+65
-7
lines changed

2 files changed

+65
-7
lines changed

contentcuration/contentcuration/tests/utils/test_exercise_creation.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,3 +1918,57 @@ def test_manifest_structure_single_item(self):
19181918
self._normalize_xml(expected_manifest_xml),
19191919
self._normalize_xml(actual_manifest_xml),
19201920
)
1921+
1922+
def test_input_question(self):
1923+
assessment_id = "fedcba0987654321fedcba0987654321"
1924+
item = self._create_assessment_item(
1925+
exercises.INPUT_QUESTION,
1926+
"What positive integers are less than 3?",
1927+
[
1928+
{"answer": 1, "correct": True, "order": 1},
1929+
{"answer": 2, "correct": True, "order": 2},
1930+
],
1931+
assessment_id=assessment_id,
1932+
)
1933+
1934+
exercise_data = {
1935+
"mastery_model": exercises.M_OF_N,
1936+
"randomize": True,
1937+
"n": 1,
1938+
"m": 1,
1939+
"all_assessment_items": [item.assessment_id],
1940+
"assessment_mapping": {item.assessment_id: exercises.INPUT_QUESTION},
1941+
}
1942+
1943+
self._create_qti_zip(exercise_data)
1944+
exercise_file = self.exercise_node.files.get(preset_id=format_presets.QTI_ZIP)
1945+
zip_file = self._validate_qti_zip_structure(exercise_file)
1946+
1947+
# Check the QTI XML for text entry specifics
1948+
expected_item_file = "items/K_ty6CYdlQyH-3LoJh2VDIQ.xml"
1949+
actual_item_xml = zip_file.read(expected_item_file).decode("utf-8")
1950+
1951+
# Expected QTI item XML content for text entry
1952+
expected_item_xml = """<?xml version="1.0" encoding="UTF-8"?>
1953+
<qti-assessment-item xmlns="http://www.imsglobal.org/xsd/imsqtiasi_v3p0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqtiasi_v3p0 https://purl.imsglobal.org/spec/qti/v3p0/schema/xsd/imsqti_asiv3p0p1_v1p0.xsd" identifier="K_ty6CYdlQyH-3LoJh2VDIQ" title="Test QTI Exercise 1" adaptive="false" time-dependent="false" language="en-US" tool-name="kolibri" tool-version="0.1">
1954+
<qti-response-declaration identifier="RESPONSE" cardinality="multiple" base-type="float">
1955+
<qti-correct-response>
1956+
<qti-value>1</qti-value>
1957+
<qti-value>2</qti-value>
1958+
</qti-correct-response>
1959+
</qti-response-declaration>
1960+
<qti-outcome-declaration identifier="SCORE" cardinality="single" base-type="float" />
1961+
<qti-item-body>
1962+
<div>
1963+
<p>What positive integers are less than 3?</p>
1964+
<p><qti-text-entry-interaction response-identifier="RESPONSE" expected-length="50" placeholder-text="Enter your answer here" /></p>
1965+
</div>
1966+
</qti-item-body>
1967+
<qti-response-processing template="https://purl.imsglobal.org/spec/qti/v3p0/rptemplates/match_correct" />
1968+
</qti-assessment-item>"""
1969+
1970+
# Compare normalized XML
1971+
self.assertEqual(
1972+
self._normalize_xml(expected_item_xml),
1973+
self._normalize_xml(actual_item_xml),
1974+
)

contentcuration/contentcuration/utils/assessment/qti/archive.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,18 +154,22 @@ def _create_text_entry_interaction_and_response(
154154
prompt.append(interaction_element)
155155
interaction = Div(children=prompt)
156156

157-
correct_values = [
158-
Value(value=answer["answer"])
159-
for answer in processed_data["answers"]
160-
if answer["correct"]
161-
]
157+
float_answer = True
158+
correct_values = []
159+
for answer in processed_data["answers"]:
160+
if answer["correct"]:
161+
correct_values.append(Value(value=str(answer["answer"])))
162+
try:
163+
float(answer["answer"])
164+
except ValueError:
165+
float_answer = False
162166

163167
response_declaration = ResponseDeclaration(
164168
identifier="RESPONSE",
165169
cardinality=Cardinality.MULTIPLE
166-
if processed_data["multiple_select"]
170+
if len(correct_values) > 1
167171
else Cardinality.SINGLE,
168-
base_type=BaseType.STRING,
172+
base_type=BaseType.FLOAT if float_answer else BaseType.STRING,
169173
correct_response=CorrectResponse(value=correct_values)
170174
if correct_values
171175
else None,

0 commit comments

Comments
 (0)