Commit e3bc9f83 by Victor Shnayder

Refactor textbox.

- tests
- rename it codeinput, with textbox still supported too
parent 4bffcdb8
......@@ -489,66 +489,61 @@ register_input_class(FileSubmission)
#-----------------------------------------------------------------------------
## TODO: Make a wrapper for <codeinput>
def textbox(element, value, status, render_template, msg=''):
'''
The textbox is used for code input. The message is the return HTML string from
evaluating the code, eg error messages, and output from the code tests.
'''
eid = element.get('id')
count = int(eid.split('_')[-2]) - 1 # HACK
size = element.get('size')
rows = element.get('rows') or '30'
cols = element.get('cols') or '80'
class CodeInput(InputTypeBase):
"""
A text area input for code--uses codemirror, does syntax highlighting, special tab handling,
etc.
"""
template = "codeinput.html"
tags = ['codeinput',
'textbox', # Old name for this. Still supported, but deprecated.
]
def __init__(self, system, xml, state):
super(CodeInput, self).__init__(system, xml, state)
self.rows = xml.get('rows') or '30'
self.cols = xml.get('cols') or '80'
# if specified, then textline is hidden and id is stored in div of name given by hidden
hidden = element.get('hidden', '')
self.hidden = xml.get('hidden', '')
# if no student input yet, then use the default input given by the problem
if not value:
value = element.text
if not self.value:
self.value = xml.text
# Check if problem has been queued
queue_len = 0
self.queue_len = 0
# Flag indicating that the problem has been queued, 'msg' is length of queue
if status == 'incomplete':
status = 'queued'
queue_len = msg
msg = 'Submitted to grader.'
if self.status == 'incomplete':
self.status = 'queued'
self.queue_len = self.msg
self.msg = 'Submitted to grader.'
# For CodeMirror
mode = element.get('mode','python')
linenumbers = element.get('linenumbers','true')
tabsize = element.get('tabsize','4')
tabsize = int(tabsize)
self.mode = xml.get('mode', 'python')
self.linenumbers = xml.get('linenumbers', 'true')
self.tabsize = int(xml.get('tabsize', '4'))
context = {'id': eid,
'value': value,
'state': status,
'count': count,
'size': size,
'msg': msg,
'mode': mode,
'linenumbers': linenumbers,
'rows': rows,
'cols': cols,
'hidden': hidden,
'tabsize': tabsize,
'queue_len': queue_len,
def _get_render_context(self):
context = {'id': self.id,
'value': self.value,
'state': self.status,
'msg': self.msg,
'mode': self.mode,
'linenumbers': self.linenumbers,
'rows': self.rows,
'cols': self.cols,
'hidden': self.hidden,
'tabsize': self.tabsize,
'queue_len': self.queue_len,
}
html = render_template("textbox.html", context)
try:
xhtml = etree.XML(html)
except Exception as err:
newmsg = 'error %s in rendering message' % (str(err).replace('<', '&lt;'))
newmsg += '<br/>Original message: %s' % msg.replace('<', '&lt;')
context['msg'] = newmsg
html = render_template("textbox.html", context)
xhtml = etree.XML(html)
return xhtml
return context
register_input_class(CodeInput)
_reg(textbox)
#-----------------------------------------------------------------------------
def schematic(element, value, status, render_template, msg=''):
......
......@@ -269,3 +269,52 @@ class FileSubmissionTest(unittest.TestCase):
self.assertEqual(context, expected)
class CodeInputTest(unittest.TestCase):
'''
Check that codeinput inputs work
'''
def test_rendering(self):
mode = "parrot"
linenumbers = 'false'
rows = '37'
cols = '11'
tabsize = '7'
xml_str = """<codeinput id="prob_1_2"
mode="{m}"
cols="{c}"
rows="{r}"
linenumbers="{ln}"
tabsize="{ts}"
/>""".format(m=mode, c=cols, r=rows, ln=linenumbers, ts=tabsize)
element = etree.fromstring(xml_str)
escapedict = {'"': '&quot;'}
esc = lambda s: saxutils.escape(s, escapedict)
state = {'value': 'print "good evening"',
'status': 'incomplete',
'feedback' : {'message': '3'}, }
the_input = inputtypes.get_class_for_tag('codeinput')(system, element, state)
context = the_input._get_render_context()
expected = {'id': 'prob_1_2',
'value': 'print "good evening"',
'state': 'queued',
'msg': 'Submitted to grader.',
'mode': mode,
'linenumbers': linenumbers,
'rows': rows,
'cols': cols,
'hidden': '',
'tabsize': int(tabsize),
'queue_len': '3',
}
self.assertEqual(context, expected)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment