diff --git a/common/lib/capa/capa/inputtypes.py b/common/lib/capa/capa/inputtypes.py index 82b5e04843..2eb5bf45bc 100644 --- a/common/lib/capa/capa/inputtypes.py +++ b/common/lib/capa/capa/inputtypes.py @@ -448,36 +448,44 @@ class TextLine(InputTypeBase): register_input_class(TextLine) #----------------------------------------------------------------------------- -def filesubmission(element, value, status, render_template, msg=''): - ''' - Upload a single file (e.g. for programming assignments) - ''' - eid = element.get('id') - escapedict = {'"': '"'} - allowed_files = json.dumps(element.get('allowed_files', '').split()) - allowed_files = saxutils.escape(allowed_files, escapedict) - required_files = json.dumps(element.get('required_files', '').split()) - required_files = saxutils.escape(required_files, escapedict) - # Check if problem has been queued - 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.' +class FileSubmission(InputTypeBase): + """ + Upload some files (e.g. for programming assignments) + """ - context = { 'id': eid, - 'state': status, - 'msg': msg, - 'value': value, - 'queue_len': queue_len, - 'allowed_files': allowed_files, - 'required_files': required_files,} - html = render_template("filesubmission.html", context) - return etree.XML(html) + template = "filesubmission.html" + tags = ['filesubmission'] -_reg(filesubmission) + def __init__(self, system, xml, state): + super(FileSubmission, self).__init__(system, xml, state) + escapedict = {'"': '"'} + self.allowed_files = json.dumps(xml.get('allowed_files', '').split()) + self.allowed_files = saxutils.escape(self.allowed_files, escapedict) + self.required_files = json.dumps(xml.get('required_files', '').split()) + self.required_files = saxutils.escape(self.required_files, escapedict) + + # Check if problem has been queued + queue_len = 0 + # Flag indicating that the problem has been queued, 'msg' is length of queue + if self.status == 'incomplete': + self.status = 'queued' + self.queue_len = self.msg + self.msg = 'Submitted to grader.' + + + def _get_render_context(self): + + context = {'id': self.id, + 'state': self.status, + 'msg': self.msg, + 'value': self.value, + 'queue_len': self.queue_len, + 'allowed_files': self.allowed_files, + 'required_files': self.required_files,} + return context + +register_input_class(FileSubmission) #----------------------------------------------------------------------------- diff --git a/common/lib/capa/capa/tests/test_inputtypes.py b/common/lib/capa/capa/tests/test_inputtypes.py index 30a0ded1ee..759ec8bdfa 100644 --- a/common/lib/capa/capa/tests/test_inputtypes.py +++ b/common/lib/capa/capa/tests/test_inputtypes.py @@ -24,6 +24,9 @@ def tst_render_template(template, context): system = Mock(render_template=tst_render_template) +def quote_attr(s): + return saxutils.quoteattr(s)[1:-1] # don't want the outer quotes + class OptionInputTest(unittest.TestCase): ''' Make sure option inputs work @@ -150,7 +153,7 @@ class JavascriptInputTest(unittest.TestCase): xml_str = """""".format( params=params, - ps=saxutils.quoteattr(problem_state)[1:-1], # don't want the outer quotes + ps=quote_attr(problem_state), dc=display_class, df=display_file) element = etree.fromstring(xml_str) @@ -226,3 +229,43 @@ class TextLineTest(unittest.TestCase): 'preprocessor': {'class_name': preprocessorClass, 'script_src': script}} self.assertEqual(context, expected) + + +class FileSubmissionTest(unittest.TestCase): + ''' + Check that file submission inputs work + ''' + + def test_rendering(self): + allowed_files = "runme.py nooooo.rb ohai.java" + required_files = "cookies.py" + + xml_str = """""".format(af=allowed_files, + rf=required_files,) + + + element = etree.fromstring(xml_str) + + escapedict = {'"': '"'} + esc = lambda s: saxutils.escape(s, escapedict) + + state = {'value': 'BumbleBee.py', + 'status': 'incomplete', + 'feedback' : {'message': '3'}, } + the_input = inputtypes.get_class_for_tag('filesubmission')(system, element, state) + + context = the_input._get_render_context() + + expected = {'id': 'prob_1_2', + 'state': 'queued', + 'msg': 'Submitted to grader.', + 'value': 'BumbleBee.py', + 'queue_len': '3', + 'allowed_files': esc('["runme.py", "nooooo.rb", "ohai.java"]'), + 'required_files': esc('["cookies.py"]')} + + self.assertEqual(context, expected) +