Handle edge case where dropdown values are not being indexed, fixed tests
This commit is contained in:
@@ -7,6 +7,7 @@ import re
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
import six
|
import six
|
||||||
|
from bleach.sanitizer import Cleaner
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
from pkg_resources import resource_string
|
from pkg_resources import resource_string
|
||||||
from web_fragments.fragment import Fragment
|
from web_fragments.fragment import Fragment
|
||||||
@@ -17,7 +18,6 @@ from xmodule.contentstore.django import contentstore
|
|||||||
from xmodule.editing_module import EditingMixin
|
from xmodule.editing_module import EditingMixin
|
||||||
from xmodule.exceptions import NotFoundError, ProcessingError
|
from xmodule.exceptions import NotFoundError, ProcessingError
|
||||||
from xmodule.raw_module import RawMixin
|
from xmodule.raw_module import RawMixin
|
||||||
from xmodule.util.misc import escape_html_characters
|
|
||||||
from xmodule.util.sandboxing import get_python_lib_zip
|
from xmodule.util.sandboxing import get_python_lib_zip
|
||||||
from xmodule.util.xmodule_django import add_webpack_to_fragment
|
from xmodule.util.xmodule_django import add_webpack_to_fragment
|
||||||
from xmodule.x_module import (
|
from xmodule.x_module import (
|
||||||
@@ -35,6 +35,13 @@ from .capa_base import CapaMixin, ComplexEncoder, _
|
|||||||
log = logging.getLogger("edx.courseware")
|
log = logging.getLogger("edx.courseware")
|
||||||
|
|
||||||
|
|
||||||
|
def _remove_html_tags_and_extra_spaces(data):
|
||||||
|
""" Remove html tags and extra white spaces e.g newline, tabs etc from provided data """
|
||||||
|
cleaner = Cleaner(tags=[], strip=True)
|
||||||
|
cleaned_text = " ".join(re.split(r"\s+", cleaner.clean(data), flags=re.UNICODE)).strip()
|
||||||
|
return cleaned_text
|
||||||
|
|
||||||
|
|
||||||
@XBlock.wants('user')
|
@XBlock.wants('user')
|
||||||
@XBlock.needs('i18n')
|
@XBlock.needs('i18n')
|
||||||
class ProblemBlock(
|
class ProblemBlock(
|
||||||
@@ -300,7 +307,26 @@ class ProblemBlock(
|
|||||||
"""
|
"""
|
||||||
Return dictionary prepared with module content and type for indexing.
|
Return dictionary prepared with module content and type for indexing.
|
||||||
"""
|
"""
|
||||||
|
def _make_optionresponse_indexable(xml_content):
|
||||||
|
"""
|
||||||
|
Extract options from dropdown and replace the actual xml for optionresponse with them.
|
||||||
|
"""
|
||||||
|
xml_content_copy = xml_content[:]
|
||||||
|
root = etree.fromstring(xml_content_copy)
|
||||||
|
for option_response in root.findall("optionresponse"):
|
||||||
|
option_response_xml = etree.tostring(option_response, method="html").decode("utf-8")
|
||||||
|
option_input = option_response.find("optioninput")
|
||||||
|
if option_input is not None:
|
||||||
|
option_input_attrib = option_input.get("options", "")
|
||||||
|
option_input_attrib = "[" + option_input_attrib.strip("()").replace("'", '"') + "]"
|
||||||
|
values_of_dropdown = ", ".join(json.loads(option_input_attrib))
|
||||||
|
xml_content_copy = xml_content_copy.replace(option_response_xml, values_of_dropdown)
|
||||||
|
return xml_content_copy
|
||||||
|
|
||||||
xblock_body = super(ProblemBlock, self).index_dictionary()
|
xblock_body = super(ProblemBlock, self).index_dictionary()
|
||||||
|
|
||||||
|
capa_content = _make_optionresponse_indexable(self.data)
|
||||||
|
|
||||||
# Removing solutions and hints, as well as script and style
|
# Removing solutions and hints, as well as script and style
|
||||||
capa_content = re.sub(
|
capa_content = re.sub(
|
||||||
re.compile(
|
re.compile(
|
||||||
@@ -313,9 +339,9 @@ class ProblemBlock(
|
|||||||
re.DOTALL |
|
re.DOTALL |
|
||||||
re.VERBOSE),
|
re.VERBOSE),
|
||||||
"",
|
"",
|
||||||
self.data
|
capa_content
|
||||||
)
|
)
|
||||||
capa_content = escape_html_characters(capa_content)
|
capa_content = _remove_html_tags_and_extra_spaces(capa_content)
|
||||||
capa_body = {
|
capa_body = {
|
||||||
"capa_content": capa_content,
|
"capa_content": capa_content,
|
||||||
"display_name": self.display_name,
|
"display_name": self.display_name,
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ from xmodule.tests import DATA_DIR
|
|||||||
from ..capa_base import RANDOMIZATION, SHOWANSWER
|
from ..capa_base import RANDOMIZATION, SHOWANSWER
|
||||||
from . import get_test_system
|
from . import get_test_system
|
||||||
|
|
||||||
|
unittest.TestCase.maxDiff = None
|
||||||
|
|
||||||
|
|
||||||
class CapaFactory(object):
|
class CapaFactory(object):
|
||||||
"""
|
"""
|
||||||
@@ -2509,7 +2511,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["multiplechoiceresponse"],
|
'problem_types': ["multiplechoiceresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': ' Label Some comment Apple Banana Chocolate Donut '
|
'capa_content': 'Label Some comment Apple Banana Chocolate Donut'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -2542,7 +2544,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["optionresponse", "multiplechoiceresponse"],
|
'problem_types': ["optionresponse", "multiplechoiceresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': ' Label Some comment Donut Buggy '
|
'capa_content': 'Label Some comment Donut Buggy'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2579,7 +2581,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': [],
|
'problem_types': [],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': ' '
|
'capa_content': ''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2607,7 +2609,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["choiceresponse"],
|
'problem_types': ["choiceresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2628,7 +2630,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["optionresponse"],
|
'problem_types': ["optionresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2653,7 +2655,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["multiplechoiceresponse"],
|
'problem_types': ["multiplechoiceresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2681,7 +2683,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["numericalresponse"],
|
'problem_types': ["numericalresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2706,7 +2708,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["stringresponse"],
|
'problem_types': ["stringresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2720,7 +2722,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
""")
|
""")
|
||||||
name = "Non latin Input"
|
name = "Non latin Input"
|
||||||
descriptor = self._create_descriptor(sample_text_input_problem_xml, name=name)
|
descriptor = self._create_descriptor(sample_text_input_problem_xml, name=name)
|
||||||
capa_content = " FX1_VAL='Καλημέρα' Δοκιμή με μεταβλητές με Ελληνικούς χαρακτήρες μέσα σε python: $FX1_VAL "
|
capa_content = "FX1_VAL='Καλημέρα' Δοκιμή με μεταβλητές με Ελληνικούς χαρακτήρες μέσα σε python: $FX1_VAL"
|
||||||
|
|
||||||
descriptor_dict = descriptor.index_dictionary()
|
descriptor_dict = descriptor.index_dictionary()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
@@ -2752,7 +2754,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["choiceresponse"],
|
'problem_types': ["choiceresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2778,7 +2780,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["optionresponse"],
|
'problem_types': ["optionresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2804,7 +2806,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["multiplechoiceresponse"],
|
'problem_types': ["multiplechoiceresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2828,7 +2830,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["numericalresponse"],
|
'problem_types': ["numericalresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2852,7 +2854,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': ["stringresponse"],
|
'problem_types': ["stringresponse"],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -2884,7 +2886,7 @@ class ProblemBlockXMLTest(unittest.TestCase):
|
|||||||
'problem_types': [],
|
'problem_types': [],
|
||||||
'content': {
|
'content': {
|
||||||
'display_name': name,
|
'display_name': name,
|
||||||
'capa_content': capa_content.replace("\n", " ")
|
'capa_content': capa_content.replace("\n", " ").strip()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user