From d0e64247dc914eca3cecd54f5326da262557a5c7 Mon Sep 17 00:00:00 2001 From: Jan Maximilian Michal <j.michal@stud.uni-goettingen.de> Date: Sat, 5 Nov 2016 11:47:44 +0000 Subject: [PATCH] Started gap support --- hallgrim/IliasXMLCreator/gap.py | 73 ++++++++++++++++++- hallgrim/IliasXMLCreator/xmlBuildingBlocks.py | 32 +++++++- 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/hallgrim/IliasXMLCreator/gap.py b/hallgrim/IliasXMLCreator/gap.py index 2c8e83e..6e794cb 100644 --- a/hallgrim/IliasXMLCreator/gap.py +++ b/hallgrim/IliasXMLCreator/gap.py @@ -2,14 +2,83 @@ import xml.etree.ElementTree as et from hallgrim.IliasXMLCreator.xmlBuildingBlocks import * + +### +# Solution 1 +# ['text', 'text', 'text'] +# [('gap_solution', points, length), ..., (['one', 'two', 'three'], points, length)] +# +# str : str_gap +# list : choice_gap +# tuple : num_gap (x, min, max) +# +# Solution 2 +# ['text', ('gap_solution', points, length), ('gap_solution', points, length), 'text', ...] +# +### + class GapQuestion: """docstring for GapQuestion""" - def __init__(self, type, description, question_text, author, title, questions, feedback, gapLength): + def __init__(self, type, description, gap_list, author, title, questions, feedback, gapLength): self.type = type self.description = description - self.question_text = question_text + self.gap_list = gap_list self.author = author self.title = title self.questions = questions self.feedback = feedback self.gapLength = gapLength + + self.itemmetadata = self.itemmetadata(feedback_setting=1) + self.presentation = self.presentation() + self.resprocessing = self.resprocessing() + self.xml_representation = self.create_item() + + def __call__(self): + return self.xml_representation + + def itemmetadata(self, feedback_setting=1): + subroot = et.Element('qtimetadata') + subroot.append(qtimetadatafield('ILIAS_VERSION', '5.1.8 2016-08-03')) + subroot.append(qtimetadatafield('QUESTIONTYPE', self.type)) + subroot.append(qtimetadatafield('AUTHOR', self.author)) + subroot.append(qtimetadatafield('additional_cont_edit_mode', 'default')) + subroot.append(qtimetadatafield('externalId', '99.99')) + subroot.append(qtimetadatafield('textgaprating', 'ci')) + subroot.append(qtimetadatafield('fixedTextLength', str(self.gapLength))) + subroot.append(qtimetadatafield('identicalScoring', '1')) + subroot.append(qtimetadatafield('combinations', 'W10=')) + root = et.Element('itemmetadata') + root.append(subroot) + return root + + ############################################################################ + def presentation(self): + root = et.Element('presentation', attrib={'label': self.title}) + flow = et.Element('flow') + root.append(flow) + gap_ident = 0 + for item in self.gap_list: + if type(item) == str: + f = material(item) + if type(item) == tuple: + if type(item[0] == list): + f = response_choice(gap_ident, item[0]) + if type(item[0] == str): + f = response_str(gap_ident, self.gapLength) + if type(item[0] == tuple): + f = response_num(gap_ident, self.gapLength, item[1], item[2]): + gap_ident += 1 + flow.append(f) + return root + + ############################################################################ + def resprocessing(self): + root = et.Element('resprocessing') + outcomes = et.Element('outcomes') + outcomes.append(simple_elemet('decvar')) + root.append(outcomes) + for i, (_, correct, points) in enumerate(self.questions): + root.append(respcondition(points if correct else 0, i, True)) + root.append(respcondition(points if not correct else 0, i, False)) + return root diff --git a/hallgrim/IliasXMLCreator/xmlBuildingBlocks.py b/hallgrim/IliasXMLCreator/xmlBuildingBlocks.py index a42b6c4..3fa2aa0 100644 --- a/hallgrim/IliasXMLCreator/xmlBuildingBlocks.py +++ b/hallgrim/IliasXMLCreator/xmlBuildingBlocks.py @@ -8,6 +8,7 @@ import xml.etree.ElementTree as et # ########################################################################## +########################################################################## def simple_elemet(name, text=None, attrib={}): if not text: @@ -81,4 +82,33 @@ def itemfeedback(ident, content='NONE'): flow_mat = et.Element('flow_mat') flow_mat.append(material(content)) root.append(flow_mat) - return root \ No newline at end of file + return root + +### gap specific ######################################################### +def material_raw(content): + material = et.Element('material') + material.append(simple_elemet( + 'mattext', + text=content + )) + return material + +def response_str(ident, columns): + response_str = et.Element('response_str', attrib={'ident': indent, 'rcardinality': 'Single'}) + render_fib = et.Element('render_fib', attrib={'columns': str(columns), 'fibtype': "String", 'prompt': "Box"}) + response_str.append(render_fib) + return response_str + +def response_choice(ident, answers) + response_str = et.Element('response_str', attrib={'ident': indent, 'rcardinality': 'Single'}) + render_choice = et.Element('render_choice', attrib={'shuffle': 'Yes'}) + for i, answer in enumerate(answers): + response_label = et.Element('response_label', attrib={'ident': str(i)}) + response_label.append(material_raw(answer)) + return response_str + +def response_num(ident, columns, _min, _max, numtype='Decimal'): + response_num = et.Element('response_num', attrib={'ident': ident, 'numtype': numtype, 'rcardinality': 'Single'}) + render_fib = et.Element('render_fib', attrib={'columns': columns, 'fibtype': numtype, 'maxnumber': _min, 'minnumber': _max, 'prompt': "Box"}) + response_num.append(render_fib) + return response_num \ No newline at end of file -- GitLab