Skip to content
Snippets Groups Projects
Commit 499e6ebd authored by Jan Maximilian Michal's avatar Jan Maximilian Michal
Browse files

Added support for feedback. Choice questions should now be feature complete

parent f9a604d5
No related branches found
No related tags found
No related merge requests found
......@@ -52,6 +52,7 @@ def main():
'maxattempts': '0',
'shuffle': True,
'questions': choice_parser(script.choices, script.meta['points']),
'feedback': markdown(script.feedback),
}
output = os.path.join(
......
......@@ -4,7 +4,7 @@ from hallgrim.IliasXMLCreator.xmlBuildingBlocks import *
class MultipleChoiceQuestion:
"""docstring for MultipleChoiceQuestion"""
def __init__(self, type, description, question_text, author, title, maxattempts, questions, shuffle=True):
def __init__(self, type, description, question_text, author, title, maxattempts, questions, feedback, shuffle=True):
self.type = type
self.description = description
self.question_text = question_text
......@@ -13,6 +13,7 @@ class MultipleChoiceQuestion:
self.maxattempts = maxattempts
self.shuffle = shuffle
self.questions = questions
self.feedback = feedback
self.itemmetadata = self.itemmetadata(feedback_setting=1)
self.presentation = self.presentation()
......@@ -68,18 +69,6 @@ class MultipleChoiceQuestion:
root.append(respcondition(points if not correct else 0, i, False))
return root
############################################################################
@staticmethod
def itemfeedback(count):
root = et.Element(
'itemfeedback',
attrib={'ident': 'response_{}'.format(count), 'view': 'All'}
)
flow_mat = et.Element('flow_mat')
flow_mat.append(material('NONE'))
root.append(flow_mat)
return root
### returns the final object ###############################################
def create_item(self):
""" This method stacks all the previously created structures together"""
......@@ -94,6 +83,6 @@ class MultipleChoiceQuestion:
item.append(self.itemmetadata)
item.append(self.presentation)
item.append(self.resprocessing)
for i, _ in enumerate(self.questions):
item.append(self.itemfeedback(i))
item.append(itemfeedback('response_allcorrect', self.feedback))
item.append(itemfeedback('response_onenotcorrect', self.feedback))
return item
import xml.etree.ElementTree as et
### static methods #############################################################
### xmlBuildingBlocks ####################################################
#
# This file cointains all the static blocks of xml code that is needed in
# all classes. These are usually just snippets to have cleaner code in other
# files.
#
##########################################################################
def simple_elemet(name, text=None, attrib={}):
if not text:
return et.Element(name, attrib=attrib)
......@@ -15,6 +23,7 @@ def qtimetadatafield(label, entry):
root.append(simple_elemet('fieldentry', text=entry))
return root
def material(content):
material = et.Element('material')
material.append(simple_elemet(
......@@ -24,11 +33,13 @@ def material(content):
))
return material
def response_label(content, count):
response_label = et.Element('response_label', attrib={'ident': str(count)})
response_label.append(material(content))
return response_label
def respcondition(points, count, correct=True):
root = et.Element('respcondition', attrib={'continue': 'Yes'})
conditionvar = et.Element('conditionvar')
......@@ -61,3 +72,13 @@ def respcondition(points, count, correct=True):
'linkrefid': 'response_{}'.format(count)})
root.append(displayfeedback)
return root
def itemfeedback(ident, content='NONE'):
root = et.Element(
'itemfeedback',
attrib={'ident': ident, 'view': 'All'}
)
flow_mat = et.Element('flow_mat')
flow_mat.append(material(content))
root.append(flow_mat)
return root
\ No newline at end of file
......@@ -9,12 +9,28 @@ except ImportError as err:
print("\t pip install mistune")
def box(content, color):
return '<div style="background-color: #ffedc9; border: 1px solid {}; padding: 10px; font-size: smaller;">{}</div>'.format(color, content)
def yellow_box(content):
return box(content, '#FFB12E')
def blue_box(content):
return box(content, '#9999ff')
class LaTeXRenderer(Renderer):
def latex(self, formula):
return '<span class="latex">{}</span>'.format(formula)
class LaTeXInlineLexer(InlineLexer):
""" Classes are inspired by the lexer example in the mistune readme """
def enable_latex(self):
# add latex rules
self.rules.latex = re.compile(
......@@ -28,6 +44,7 @@ class LaTeXInlineLexer(InlineLexer):
formula = m.group(1)
return self.renderer.latex(formula)
def get_custom_markdown():
renderer = LaTeXRenderer()
inline = LaTeXInlineLexer(renderer)
......@@ -43,8 +60,8 @@ def choice_parser(raw_choices, points):
array of arbitrary size """
lines = raw_choices.strip().split('\n')
parse = [re.match('\[(X| )\] (.*)', line).groups() for line in lines]
final = [(markdown(text), True if mark == 'X' else False, points) for mark, text in parse]
final = [(markdown(text), True if mark == 'X' else False, points)
for mark, text in parse]
return final
markdown = get_custom_markdown()
......@@ -23,18 +23,18 @@ sortiert auszugeben (also erst große, dann kleinere Punktzahlen)? """
choices = """
[ ] `sort --reverse --k 5 --numeric-sort punkte.csv`
[X] `sort --r --field-separator=, -k 5 --n punkte.csv`
[ ] `sort --r --field-separator=, -k 5 --n punkte.csv`
[ ] `sort -r -t="," -k 5 --n punkte.csv`
[X] `sort --reverse -t "," -k 5 -n punkte.csv`
[ ] `sort -r --field-separator "," -k 4 -numeric punkte.csv`
[ ] `sort -r --field-separator "," -k 4 punkte.csv`
"""
explanations = """
[ ] sort --reverse --k 5 --numeric-sort punkte.csv falsch (u.a.: ungültiges Argument --k)
[ ] sort --r --field-separator=, -k 5 --n punkte.csv falsch (u.a.: bei kurzem Argument -k darf kein = stehen)
[ ] sort -r -t="," -k 5 --n punkte.csv falsch (siehe oben)
[X] sort --reverse -t "," -k 5 -n punkte.csv richtig
[ ] sort -r --field-separator "," -k 4 -numeric punkte.csv falsch (u.a.: Punkte stehen in Spalte 5)
[ ] sort -r --field-separator "," -k 4 punkte.csv falsch (u.a.: keine numerische Sortierung)
feedback = """
* [ ] `sort --reverse --k 5 --numeric-sort punkte.csv` falsch (u.a.: ungültiges Argument --k)
* [ ] `sort --r --field-separator=, -k 5 --n punkte.csv` falsch (u.a.: bei kurzem Argument -k darf kein = stehen)
* [ ] `sort -r -t="," -k 5 --n punkte.csv` falsch (siehe oben)
* [X] `sort --reverse -t "," -k 5 -n punkte.csv` richtig
* [ ] `sort -r --field-separator "," -k 4 -numeric punkte.csv` falsch (u.a.: Punkte stehen in Spalte 5)
* [ ] `sort -r --field-separator "," -k 4 punkte.csv` falsch (u.a.: keine numerische Sortierung)
"""
\ No newline at end of file
......@@ -29,7 +29,7 @@ choices = """
[ ] `sort -r --field-separator "," -k 4 punkte.csv`
"""
explanations = """
feedback = """
[ ] sort --reverse --k 5 --numeric-sort punkte.csv falsch (u.a.: ungültiges Argument --k)
[ ] sort --r --field-separator=, -k 5 --n punkte.csv falsch (u.a.: bei kurzem Argument -k darf kein = stehen)
[ ] sort -r -t="," -k 5 --n punkte.csv falsch (siehe oben)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment