Commit 6e7afb96 by Calen Pennington

Move xqueue handler to new module format, and continue to distinguish grades set…

Move xqueue handler to new module format, and continue to distinguish grades set by xqueue from those set by ajax in stats
parent 6f322bcd
...@@ -115,7 +115,9 @@ def toc_for_course(user, request, course, active_chapter, active_section): ...@@ -115,7 +115,9 @@ def toc_for_course(user, request, course, active_chapter, active_section):
return chapters return chapters
def get_module(user, request, location, student_module_cache, course_id, position=None, not_found_ok = False, wrap_xmodule_display = True): def get_module(user, request, location, student_module_cache, course_id,
position=None, not_found_ok = False, wrap_xmodule_display=True,
grade_bucket_type=None):
""" """
Get an instance of the xmodule class identified by location, Get an instance of the xmodule class identified by location,
setting the state based on an existing StudentModule, or creating one if none setting the state based on an existing StudentModule, or creating one if none
...@@ -147,7 +149,8 @@ def get_module(user, request, location, student_module_cache, course_id, positio ...@@ -147,7 +149,8 @@ def get_module(user, request, location, student_module_cache, course_id, positio
return None return None
def _get_module(user, request, location, student_module_cache, course_id, position=None, wrap_xmodule_display=True): def _get_module(user, request, location, student_module_cache, course_id,
position=None, wrap_xmodule_display=True, grade_bucket_type=None):
""" """
Actually implement get_module. See docstring there for details. Actually implement get_module. See docstring there for details.
""" """
...@@ -234,14 +237,16 @@ def _get_module(user, request, location, student_module_cache, course_id, positi ...@@ -234,14 +237,16 @@ def _get_module(user, request, location, student_module_cache, course_id, positi
#Bin score into range and increment stats #Bin score into range and increment stats
score_bucket = get_score_bucket(student_module.grade, student_module.max_grade) score_bucket = get_score_bucket(student_module.grade, student_module.max_grade)
org, course_num, run = course_id.split("/") org, course_num, run = course_id.split("/")
statsd.increment("lms.courseware.question_answered",
tags=["org:{0}".format(org),
"course:{0}".format(course_num),
"run:{0}".format(run),
"score_bucket:{0}".format(score_bucket),
"type:ajax"])
tags = ["org:{0}".format(org),
"course:{0}".format(course_num),
"run:{0}".format(run),
"score_bucket:{0}".format(score_bucket)]
if grade_bucket_type is not None:
tags.append('type:%s' % grade_bucket_type)
statsd.increment("lms.courseware.question_answered", tags=tags)
# TODO (cpennington): When modules are shared between courses, the static # TODO (cpennington): When modules are shared between courses, the static
# prefix is going to have to be specific to the module, not the directory # prefix is going to have to be specific to the module, not the directory
...@@ -332,20 +337,11 @@ def xqueue_callback(request, course_id, userid, id, dispatch): ...@@ -332,20 +337,11 @@ def xqueue_callback(request, course_id, userid, id, dispatch):
student_module_cache = StudentModuleCache.cache_for_descriptor_descendents(course_id, student_module_cache = StudentModuleCache.cache_for_descriptor_descendents(course_id,
user, modulestore().get_instance(course_id, id), depth=0, select_for_update=True) user, modulestore().get_instance(course_id, id), depth=0, select_for_update=True)
instance = get_module(user, request, id, student_module_cache, course_id) instance = get_module(user, request, id, student_module_cache, course_id, grade_bucket_type='xqueue')
if instance is None: if instance is None:
log.debug("No module {0} for user {1}--access denied?".format(id, user)) log.debug("No module {0} for user {1}--access denied?".format(id, user))
raise Http404 raise Http404
instance_module = get_instance_module(course_id, user, instance, student_module_cache)
if instance_module is None:
log.debug("Couldn't find instance of module '%s' for user '%s'", id, user)
raise Http404
oldgrade = instance_module.grade
old_instance_state = instance_module.state
# Transfer 'queuekey' from xqueue response header to 'get'. This is required to # Transfer 'queuekey' from xqueue response header to 'get'. This is required to
# use the interface defined by 'handle_ajax' # use the interface defined by 'handle_ajax'
get.update({'queuekey': header['lms_key']}) get.update({'queuekey': header['lms_key']})
...@@ -359,22 +355,6 @@ def xqueue_callback(request, course_id, userid, id, dispatch): ...@@ -359,22 +355,6 @@ def xqueue_callback(request, course_id, userid, id, dispatch):
log.exception("error processing ajax call") log.exception("error processing ajax call")
raise raise
# Save state back to database
instance_module.state = instance.get_instance_state()
if instance.get_score():
instance_module.grade = instance.get_score()['score']
if instance_module.grade != oldgrade or instance_module.state != old_instance_state:
instance_module.save()
#Bin score into range and increment stats
score_bucket=get_score_bucket(instance_module.grade, instance_module.max_grade)
org, course_num, run=course_id.split("/")
statsd.increment("lms.courseware.question_answered",
tags=["org:{0}".format(org),
"course:{0}".format(course_num),
"run:{0}".format(run),
"score_bucket:{0}".format(score_bucket),
"type:xqueue"])
return HttpResponse("") return HttpResponse("")
...@@ -417,7 +397,7 @@ def modx_dispatch(request, dispatch, location, course_id): ...@@ -417,7 +397,7 @@ def modx_dispatch(request, dispatch, location, course_id):
student_module_cache = StudentModuleCache.cache_for_descriptor_descendents(course_id, student_module_cache = StudentModuleCache.cache_for_descriptor_descendents(course_id,
request.user, modulestore().get_instance(course_id, location)) request.user, modulestore().get_instance(course_id, location))
instance = get_module(request.user, request, location, student_module_cache, course_id) instance = get_module(request.user, request, location, student_module_cache, course_id, grade_bucket_type='ajax')
if instance is None: if instance is None:
# Either permissions just changed, or someone is trying to be clever # Either permissions just changed, or someone is trying to be clever
# and load something they shouldn't have access to. # and load something they shouldn't have access to.
......
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