Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
f1f5a8f1
Commit
f1f5a8f1
authored
Nov 17, 2016
by
Nimisha Asthagiri
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Optimize max_score by moving from XModule to Descriptor
TNL-5939
parent
863aa78b
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
50 additions
and
29 deletions
+50
-29
common/lib/capa/capa/capa_problem.py
+7
-3
common/lib/xmodule/xmodule/capa_base.py
+0
-6
common/lib/xmodule/xmodule/capa_module.py
+32
-0
common/lib/xmodule/xmodule/lti_module.py
+4
-3
common/lib/xmodule/xmodule/tests/test_lti_unit.py
+1
-0
common/lib/xmodule/xmodule/x_module.py
+1
-1
lms/djangoapps/grades/transformer.py
+5
-16
No files found.
common/lib/capa/capa/capa_problem.py
View file @
f1f5a8f1
...
@@ -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
):
"""
"""
...
...
common/lib/xmodule/xmodule/capa_base.py
View file @
f1f5a8f1
...
@@ -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
...
...
common/lib/xmodule/xmodule/capa_module.py
View file @
f1f5a8f1
...
@@ -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'
)
...
...
common/lib/xmodule/xmodule/lti_module.py
View file @
f1f5a8f1
...
@@ -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'
)
...
...
common/lib/xmodule/xmodule/tests/test_lti_unit.py
View file @
f1f5a8f1
...
@@ -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"""
...
...
common/lib/xmodule/xmodule/x_module.py
View file @
f1f5a8f1
...
@@ -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'
)
...
...
lms/djangoapps/grades/transformer.py
View file @
f1f5a8f1
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment