diff --git a/common/lib/capa/capa/inputtypes.py b/common/lib/capa/capa/inputtypes.py
index 3f4ebc7a5e..813da3ca3e 100644
--- a/common/lib/capa/capa/inputtypes.py
+++ b/common/lib/capa/capa/inputtypes.py
@@ -45,8 +45,10 @@ import re
import shlex # for splitting quoted strings
import sys
import os
+import pyparsing
from registry import TagRegistry
+from capa.chem import chemcalc
log = logging.getLogger('mitx.' + __name__)
@@ -752,6 +754,45 @@ class ChemicalEquationInput(InputTypeBase):
"""
return {'previewer': '/static/js/capa/chemical_equation_preview.js', }
+ def handle_ajax(self, dispatch, get):
+ '''
+ Since we only have chemcalc preview this input, check to see if it
+ matches the corresponding dispatch and send it through if it does
+ '''
+ if dispatch == 'preview_chemcalc':
+ return self.preview_chemcalc(get)
+ return {}
+
+ def preview_chemcalc(self, get):
+ """
+ Render an html preview of a chemical formula or equation. get should
+ contain a key 'formula' and value 'some formula string'.
+
+ Returns a json dictionary:
+ {
+ 'preview' : 'the-preview-html' or ''
+ 'error' : 'the-error' or ''
+ }
+ """
+
+ result = {'preview': '',
+ 'error': ''}
+ formula = get['formula']
+ if formula is None:
+ result['error'] = "No formula specified."
+ return result
+
+ try:
+ result['preview'] = chemcalc.render_to_html(formula)
+ except pyparsing.ParseException as p:
+ result['error'] = "Couldn't parse formula: {0}".format(p)
+ except Exception:
+ # this is unexpected, so log
+ log.warning("Error while previewing chemical formula", exc_info=True)
+ result['error'] = "Error while rendering preview"
+
+ return result
+
registry.register(ChemicalEquationInput)
#-----------------------------------------------------------------------------
diff --git a/common/lib/capa/capa/templates/chemicalequationinput.html b/common/lib/capa/capa/templates/chemicalequationinput.html
index dd177dc920..17c84114e5 100644
--- a/common/lib/capa/capa/templates/chemicalequationinput.html
+++ b/common/lib/capa/capa/templates/chemicalequationinput.html
@@ -11,7 +11,7 @@
% endif
- """.format(size=size)
+ def setUp(self):
+ self.size = "42"
+ xml_str = """""".format(size=self.size)
element = etree.fromstring(xml_str)
state = {'value': 'H2OYeah', }
- the_input = lookup_tag('chemicalequationinput')(test_system, element, state)
+ self.the_input = lookup_tag('chemicalequationinput')(test_system, element, state)
- context = the_input._get_render_context()
+
+ def test_rendering(self):
+ ''' Verify that the render context matches the expected render context'''
+ context = self.the_input._get_render_context()
expected = {'id': 'prob_1_2',
'value': 'H2OYeah',
'status': 'unanswered',
'msg': '',
- 'size': size,
+ 'size': self.size,
'previewer': '/static/js/capa/chemical_equation_preview.js',
}
self.assertEqual(context, expected)
+
+ def test_chemcalc_ajax_sucess(self):
+ ''' Verify that using the correct dispatch and valid data produces a valid response'''
+
+ data = {'formula': "H"}
+ response = self.the_input.handle_ajax("preview_chemcalc", data)
+
+ self.assertTrue('preview' in response)
+ self.assertNotEqual(response['preview'], '')
+ self.assertEqual(response['error'], "")
+
+
+
+
class DragAndDropTest(unittest.TestCase):
'''
@@ -631,4 +647,4 @@ class AnnotationInputTest(unittest.TestCase):
}
self.maxDiff = None
- self.assertDictEqual(context, expected)
\ No newline at end of file
+ self.assertDictEqual(context, expected)
diff --git a/common/static/js/capa/chemical_equation_preview.js b/common/static/js/capa/chemical_equation_preview.js
index 90ce27ad11..10a6b54655 100644
--- a/common/static/js/capa/chemical_equation_preview.js
+++ b/common/static/js/capa/chemical_equation_preview.js
@@ -11,9 +11,14 @@
}
prev_id = "#" + this.id + "_preview";
- preview_div = $(prev_id)
+ preview_div = $(prev_id);
- $.get("/preview/chemcalc/", {"formula" : this.value}, create_handler(preview_div));
+ // find the closest parent problems-wrapper and use that url
+ url = $(this).closest('.problems-wrapper').data('url');
+ // grab the input id from the input
+ input_id = $(this).data('input-id')
+
+ Problem.inputAjax(url, input_id, 'preview_chemcalc', {"formula" : this.value}, create_handler(preview_div));
}
inputs = $('.chemicalequationinput input');
diff --git a/lms/djangoapps/courseware/module_render.py b/lms/djangoapps/courseware/module_render.py
index 7877c83bdc..23d27c72ac 100644
--- a/lms/djangoapps/courseware/module_render.py
+++ b/lms/djangoapps/courseware/module_render.py
@@ -16,7 +16,6 @@ from django.views.decorators.csrf import csrf_exempt
from requests.auth import HTTPBasicAuth
from capa.xqueue_interface import XQueueInterface
-from capa.chem import chemcalc
from courseware.access import has_access
from mitxmako.shortcuts import render_to_string
from models import StudentModule, StudentModuleCache
@@ -559,42 +558,6 @@ def modx_dispatch(request, dispatch, location, course_id):
return HttpResponse(ajax_return)
-def preview_chemcalc(request):
- """
- Render an html preview of a chemical formula or equation. The fact that
- this is here is a bit of hack. See the note in lms/urls.py about why it's
- here. (Victor is to blame.)
-
- request should be a GET, with a key 'formula' and value 'some formula string'.
-
- Returns a json dictionary:
- {
- 'preview' : 'the-preview-html' or ''
- 'error' : 'the-error' or ''
- }
- """
- if request.method != "GET":
- raise Http404
-
- result = {'preview': '',
- 'error': ''}
- formula = request.GET.get('formula')
- if formula is None:
- result['error'] = "No formula specified."
-
- return HttpResponse(json.dumps(result))
-
- try:
- result['preview'] = chemcalc.render_to_html(formula)
- except pyparsing.ParseException as p:
- result['error'] = "Couldn't parse formula: {0}".format(p)
- except Exception:
- # this is unexpected, so log
- log.warning("Error while previewing chemical formula", exc_info=True)
- result['error'] = "Error while rendering preview"
-
- return HttpResponse(json.dumps(result))
-
def get_score_bucket(grade, max_grade):
"""
diff --git a/lms/urls.py b/lms/urls.py
index 5e5ac9a7f2..5972b49266 100644
--- a/lms/urls.py
+++ b/lms/urls.py
@@ -224,14 +224,6 @@ if settings.COURSEWARE_ENABLED:
'courseware.module_render.modx_dispatch',
name='modx_dispatch'),
- # TODO (vshnayder): This is a hack. It creates a direct connection from
- # the LMS to capa functionality, and really wants to go through the
- # input types system so that previews can be context-specific.
- # Unfortunately, we don't have time to think through the right way to do
- # that (and implement it), and it's not a terrible thing to provide a
- # generic chemical-equation rendering service.
- url(r'^preview/chemcalc', 'courseware.module_render.preview_chemcalc',
- name='preview_chemcalc'),
# Software Licenses