diff --git a/common/lib/capa/capa/capa_problem.py b/common/lib/capa/capa/capa_problem.py index d868e66ec5..7e1caa416b 100644 --- a/common/lib/capa/capa/capa_problem.py +++ b/common/lib/capa/capa/capa_problem.py @@ -57,7 +57,8 @@ entry_types = ['textline', 'filesubmission', 'javascriptinput', 'crystallography', - 'chemicalequationinput',] + 'chemicalequationinput', + 'vsepr_input'] # extra things displayed after "show answers" is pressed solution_types = ['solution'] diff --git a/common/lib/capa/capa/inputtypes.py b/common/lib/capa/capa/inputtypes.py index 0e993c1366..16b36960c9 100644 --- a/common/lib/capa/capa/inputtypes.py +++ b/common/lib/capa/capa/inputtypes.py @@ -707,7 +707,7 @@ def imageinput(element, value, status, render_template, msg=''): _reg(imageinput) -#----------------------------------------------------------------------------- + def crystallography(element, value, status, render_template, msg=''): eid = element.get('id') if eid is None: @@ -740,18 +740,64 @@ def crystallography(element, value, status, render_template, msg=''): } html = render_template("crystallography.html", context) + try: xhtml = etree.XML(html) except Exception as err: # TODO: needs to be self.system.DEBUG - but can't access system if True: - log.debug('[inputtypes.textline] failed to parse XML for:\n%s' % html) + log.debug('[inputtypes.crystallography] failed to parse XML for:\n%s' % html) raise return xhtml _reg(crystallography) +def vsepr_input(element, value, status, render_template, msg=''): + eid = element.get('id') + if eid is None: + msg = 'cryst has no id: it probably appears outside of a known response type' + msg += "\nSee problem XML source line %s" % getattr(element, 'sourceline', '') + raise Exception(msg) + height = element.get('height') + width = element.get('width') + display_file = element.get('display_file') + + count = int(eid.split('_')[-2]) - 1 # HACK + size = element.get('size') + # if specified, then textline is hidden and id is stored in div of name given by hidden + hidden = element.get('hidden', '') + # Escape answers with quotes, so they don't crash the system! + escapedict = {'"': '"'} + value = saxutils.escape(value, escapedict) + + context = {'id': eid, + 'value': value, + 'state': status, + 'count': count, + 'size': size, + 'msg': msg, + 'hidden': hidden, + 'inline': element.get('inline', ''), + 'width': width, + 'height': height, + 'display_file': display_file, + } + + html = render_template("vsepr_input.html", context) + + try: + xhtml = etree.XML(html) + except Exception as err: + # TODO: needs to be self.system.DEBUG - but can't access system + if True: + log.debug('[inputtypes.vsepr_input] failed to parse XML for:\n%s' % html) + raise + return xhtml + +_reg(vsepr_input) + + #-------------------------------------------------------------------------------- diff --git a/common/lib/capa/capa/responsetypes.py b/common/lib/capa/capa/responsetypes.py index 269b4a5e79..a47b7f11fc 100644 --- a/common/lib/capa/capa/responsetypes.py +++ b/common/lib/capa/capa/responsetypes.py @@ -867,7 +867,8 @@ def sympy_check2(): """}] response_tag = 'customresponse' - allowed_inputfields = ['textline', 'textbox', 'crystallography', 'chemicalequationinput'] + + allowed_inputfields = ['textline', 'textbox', 'crystallography', 'chemicalequationinput, vsepr_input'] def setup_response(self): xml = self.xml diff --git a/common/lib/capa/capa/templates/vsepr_input.html b/common/lib/capa/capa/templates/vsepr_input.html new file mode 100644 index 0000000000..4003d0952a --- /dev/null +++ b/common/lib/capa/capa/templates/vsepr_input.html @@ -0,0 +1,60 @@ +<% doinline = "inline" if inline else "" %> + +
+
+
+ + +
+
+ + +
+ +
+ + + % if state == 'unsubmitted': +
+ % elif state == 'correct': +
+ % elif state == 'incorrect': +
+ % elif state == 'incomplete': +
+ % endif + % if hidden: +
+ % endif + + + +

+ % if state == 'unsubmitted': + unanswered + % elif state == 'correct': + correct + % elif state == 'incorrect': + incorrect + % elif state == 'incomplete': + incomplete + % endif +

+ +

+ + % if msg: + ${msg|n} + % endif +% if state in ['unsubmitted', 'correct', 'incorrect', 'incomplete'] or hidden: +
+% endif +
\ No newline at end of file