Commit f1f5a8f1 by Nimisha Asthagiri

Optimize max_score by moving from XModule to Descriptor

TNL-5939
parent 863aa78b
...@@ -129,7 +129,7 @@ class LoncapaProblem(object): ...@@ -129,7 +129,7 @@ class LoncapaProblem(object):
Main class for capa Problems. Main class for capa Problems.
""" """
def __init__(self, problem_text, id, capa_system, capa_module, # pylint: disable=redefined-builtin def __init__(self, problem_text, id, capa_system, capa_module, # pylint: disable=redefined-builtin
state=None, seed=None): state=None, seed=None, minimal_init=False):
""" """
Initializes capa Problem. Initializes capa Problem.
...@@ -186,7 +186,10 @@ class LoncapaProblem(object): ...@@ -186,7 +186,10 @@ class LoncapaProblem(object):
self._process_includes() self._process_includes()
# construct script processor context (eg for customresponse problems) # construct script processor context (eg for customresponse problems)
self.context = self._extract_context(self.tree) if minimal_init:
self.context = {'script_code': ""}
else:
self.context = self._extract_context(self.tree)
# Pre-parse the XML tree: modifies it to add ID's and perform some in-place # Pre-parse the XML tree: modifies it to add ID's and perform some in-place
# transformations. This also creates the dict (self.responders) of Response # transformations. This also creates the dict (self.responders) of Response
...@@ -209,7 +212,8 @@ class LoncapaProblem(object): ...@@ -209,7 +212,8 @@ class LoncapaProblem(object):
if hasattr(response, 'late_transforms'): if hasattr(response, 'late_transforms'):
response.late_transforms(self) response.late_transforms(self)
self.extracted_tree = self._extract_html(self.tree) if not minimal_init:
self.extracted_tree = self._extract_html(self.tree)
def make_xml_compatible(self, tree): def make_xml_compatible(self, tree):
""" """
......
...@@ -357,12 +357,6 @@ class CapaMixin(CapaFields): ...@@ -357,12 +357,6 @@ class CapaMixin(CapaFields):
""" """
return self.lcp.get_score() return self.lcp.get_score()
def max_score(self):
"""
Access the problem's max score
"""
return self.lcp.get_max_score()
def get_progress(self): def get_progress(self):
""" """
For now, just return score / max_score For now, just return score / max_score
......
...@@ -275,6 +275,38 @@ class CapaDescriptor(CapaFields, RawDescriptor): ...@@ -275,6 +275,38 @@ class CapaDescriptor(CapaFields, RawDescriptor):
) )
return False return False
def max_score(self):
"""
Return the problem's max score
"""
from capa.capa_problem import LoncapaProblem, LoncapaSystem
capa_system = LoncapaSystem(
ajax_url=None,
anonymous_student_id=None,
cache=None,
can_execute_unsafe_code=None,
get_python_lib_zip=None,
DEBUG=None,
filestore=self.runtime.resources_fs,
i18n=self.runtime.service(self, "i18n"),
node_path=None,
render_template=None,
seed=None,
STATIC_URL=None,
xqueue=None,
matlab_api_key=None,
)
lcp = LoncapaProblem(
problem_text=self.data,
id=self.location.html_id(),
capa_system=capa_system,
capa_module=self,
state={},
seed=1,
minimal_init=True,
)
return lcp.get_max_score()
# Proxy to CapaModule for access to any of its attributes # Proxy to CapaModule for access to any of its attributes
answer_available = module_attr('answer_available') answer_available = module_attr('answer_available')
submit_button_name = module_attr('submit_button_name') submit_button_name = module_attr('submit_button_name')
......
...@@ -649,9 +649,6 @@ oauth_consumer_key="", oauth_signature="frVp4JuvT1mVXlxktiAUjQ7%2F1cw%3D"'} ...@@ -649,9 +649,6 @@ oauth_consumer_key="", oauth_signature="frVp4JuvT1mVXlxktiAUjQ7%2F1cw%3D"'}
params.update(body) params.update(body)
return params return params
def max_score(self):
return self.weight if self.has_score else None
@XBlock.handler @XBlock.handler
def grade_handler(self, request, suffix): # pylint: disable=unused-argument def grade_handler(self, request, suffix): # pylint: disable=unused-argument
""" """
...@@ -898,6 +895,10 @@ class LTIDescriptor(LTIFields, MetadataOnlyEditingDescriptor, EmptyDataRawDescri ...@@ -898,6 +895,10 @@ class LTIDescriptor(LTIFields, MetadataOnlyEditingDescriptor, EmptyDataRawDescri
""" """
Descriptor for LTI Xmodule. Descriptor for LTI Xmodule.
""" """
def max_score(self):
return self.weight if self.has_score else None
module_class = LTIModule module_class = LTIModule
resources_dir = None resources_dir = None
grade_handler = module_attr('grade_handler') grade_handler = module_attr('grade_handler')
......
...@@ -72,6 +72,7 @@ class LTIModuleTest(LogicTest): ...@@ -72,6 +72,7 @@ class LTIModuleTest(LogicTest):
self.xmodule.due = None self.xmodule.due = None
self.xmodule.graceperiod = None self.xmodule.graceperiod = None
self.xmodule.descriptor = self.system.construct_xblock_from_class(self.descriptor_class, self.xmodule.scope_ids)
def get_request_body(self, params=None): def get_request_body(self, params=None):
"""Fetches the body of a request specified by params""" """Fetches the body of a request specified by params"""
......
...@@ -806,6 +806,7 @@ class XModule(HTMLSnippet, XModuleMixin): ...@@ -806,6 +806,7 @@ class XModule(HTMLSnippet, XModuleMixin):
entry_point = "xmodule.v1" entry_point = "xmodule.v1"
has_score = descriptor_attr('has_score') has_score = descriptor_attr('has_score')
max_score = descriptor_attr('max_score')
show_in_read_only_mode = descriptor_attr('show_in_read_only_mode') show_in_read_only_mode = descriptor_attr('show_in_read_only_mode')
_field_data_cache = descriptor_attr('_field_data_cache') _field_data_cache = descriptor_attr('_field_data_cache')
_field_data = descriptor_attr('_field_data') _field_data = descriptor_attr('_field_data')
...@@ -1201,7 +1202,6 @@ class XModuleDescriptor(HTMLSnippet, ResourceTemplates, XModuleMixin): ...@@ -1201,7 +1202,6 @@ class XModuleDescriptor(HTMLSnippet, ResourceTemplates, XModuleMixin):
get_progress = module_attr('get_progress') get_progress = module_attr('get_progress')
get_score = module_attr('get_score') get_score = module_attr('get_score')
handle_ajax = module_attr('handle_ajax') handle_ajax = module_attr('handle_ajax')
max_score = module_attr('max_score')
student_view = module_attr(STUDENT_VIEW) student_view = module_attr(STUDENT_VIEW)
get_child_descriptors = module_attr('get_child_descriptors') get_child_descriptors = module_attr('get_child_descriptors')
xmodule_handler = module_attr('xmodule_handler') xmodule_handler = module_attr('xmodule_handler')
......
...@@ -118,8 +118,10 @@ class GradesTransformer(BlockStructureTransformer): ...@@ -118,8 +118,10 @@ class GradesTransformer(BlockStructureTransformer):
""" """
Collect the `max_score` for every block in the provided `block_structure`. Collect the `max_score` for every block in the provided `block_structure`.
""" """
for module in cls._iter_scorable_xmodules(block_structure): for block_locator in block_structure.post_order_traversal():
cls._collect_max_score(block_structure, module) block = block_structure.get_xblock(block_locator)
if getattr(block, 'has_score', False):
cls._collect_max_score(block_structure, block)
@classmethod @classmethod
def _collect_max_score(cls, block_structure, module): def _collect_max_score(cls, block_structure, module):
...@@ -171,20 +173,7 @@ class GradesTransformer(BlockStructureTransformer): ...@@ -171,20 +173,7 @@ class GradesTransformer(BlockStructureTransformer):
XModule, even though the data is not user specific. Here we bind the XModule, even though the data is not user specific. Here we bind the
data to a SystemUser. data to a SystemUser.
""" """
request = RequestFactory().get('/dummy-collect-max-grades')
user = SystemUser()
request.user = user
request.session = {}
root_block = block_structure.get_xblock(block_structure.root_block_usage_key)
course_key = block_structure.root_block_usage_key.course_key
cache = FieldDataCache.cache_for_descriptor_descendents(
course_id=course_key,
user=request.user,
descriptor=root_block,
descriptor_filter=lambda descriptor: descriptor.has_score,
)
for block_locator in block_structure.post_order_traversal(): for block_locator in block_structure.post_order_traversal():
block = block_structure.get_xblock(block_locator) block = block_structure.get_xblock(block_locator)
if getattr(block, 'has_score', False): if getattr(block, 'has_score', False):
module = courseware.module_render.get_module_for_descriptor(user, request, block, cache, course_key) yield block
yield module
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