Commit 387303d3 by utkjad

Injecting call stack manager in CSM/CSMH,introducting @trackit,@wrapt, and…

Injecting call stack manager in CSM/CSMH,introducting @trackit,@wrapt, and refining implementation[PLAT-758]
parent a3599425
...@@ -45,6 +45,8 @@ from xmodule.modulestore.django import modulestore ...@@ -45,6 +45,8 @@ from xmodule.modulestore.django import modulestore
from xblock.core import XBlockAside from xblock.core import XBlockAside
from courseware.user_state_client import DjangoXBlockUserStateClient from courseware.user_state_client import DjangoXBlockUserStateClient
from openedx.core.djangoapps.call_stack_manager import donottrack
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -990,6 +992,7 @@ class ScoresClient(object): ...@@ -990,6 +992,7 @@ class ScoresClient(object):
# @contract(user_id=int, usage_key=UsageKey, score="number|None", max_score="number|None") # @contract(user_id=int, usage_key=UsageKey, score="number|None", max_score="number|None")
@donottrack(StudentModule)
def set_score(user_id, usage_key, score, max_score): def set_score(user_id, usage_key, score, max_score):
""" """
Set the score and max_score for the specified user and xblock usage. Set the score and max_score for the specified user and xblock usage.
......
...@@ -25,6 +25,7 @@ from model_utils.models import TimeStampedModel ...@@ -25,6 +25,7 @@ from model_utils.models import TimeStampedModel
from student.models import user_by_anonymous_id from student.models import user_by_anonymous_id
from submissions.models import score_set, score_reset from submissions.models import score_set, score_reset
from openedx.core.djangoapps.call_stack_manager import CallStackManager, CallStackMixin
from xmodule_django.models import CourseKeyField, LocationKeyField, BlockTypeKeyField # pylint: disable=import-error from xmodule_django.models import CourseKeyField, LocationKeyField, BlockTypeKeyField # pylint: disable=import-error
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
...@@ -68,11 +69,18 @@ class ChunkingManager(models.Manager): ...@@ -68,11 +69,18 @@ class ChunkingManager(models.Manager):
return res return res
class StudentModule(models.Model): class ChunkingCallStackManager(CallStackManager, ChunkingManager):
"""
A derived class of ChunkingManager, and CallStackManager
"""
pass
class StudentModule(CallStackMixin, models.Model):
""" """
Keeps student state for a particular module in a particular course. Keeps student state for a particular module in a particular course.
""" """
objects = ChunkingManager() objects = ChunkingCallStackManager()
MODEL_TAGS = ['course_id', 'module_type'] MODEL_TAGS = ['course_id', 'module_type']
# For a homework problem, contains a JSON # For a homework problem, contains a JSON
...@@ -145,10 +153,11 @@ class StudentModule(models.Model): ...@@ -145,10 +153,11 @@ class StudentModule(models.Model):
return unicode(repr(self)) return unicode(repr(self))
class StudentModuleHistory(models.Model): class StudentModuleHistory(CallStackMixin, models.Model):
"""Keeps a complete history of state changes for a given XModule for a given """Keeps a complete history of state changes for a given XModule for a given
Student. Right now, we restrict this to problems so that the table doesn't Student. Right now, we restrict this to problems so that the table doesn't
explode in size.""" explode in size."""
objects = CallStackManager()
HISTORY_SAVING_TYPES = {'problem'} HISTORY_SAVING_TYPES = {'problem'}
class Meta(object): # pylint: disable=missing-docstring class Meta(object): # pylint: disable=missing-docstring
......
...@@ -18,6 +18,8 @@ from xblock.fields import Scope, ScopeBase ...@@ -18,6 +18,8 @@ from xblock.fields import Scope, ScopeBase
from courseware.models import StudentModule, StudentModuleHistory from courseware.models import StudentModule, StudentModuleHistory
from edx_user_state_client.interface import XBlockUserStateClient, XBlockUserState from edx_user_state_client.interface import XBlockUserStateClient, XBlockUserState
from openedx.core.djangoapps.call_stack_manager import donottrack
class DjangoXBlockUserStateClient(XBlockUserStateClient): class DjangoXBlockUserStateClient(XBlockUserStateClient):
""" """
...@@ -69,6 +71,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient): ...@@ -69,6 +71,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient):
""" """
self.user = user self.user = user
@donottrack(StudentModule, StudentModuleHistory)
def _get_student_modules(self, username, block_keys): def _get_student_modules(self, username, block_keys):
""" """
Retrieve the :class:`~StudentModule`s for the supplied ``username`` and ``block_keys``. Retrieve the :class:`~StudentModule`s for the supplied ``username`` and ``block_keys``.
...@@ -116,6 +119,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient): ...@@ -116,6 +119,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient):
sample_rate=self.API_DATADOG_SAMPLE_RATE, sample_rate=self.API_DATADOG_SAMPLE_RATE,
) )
@donottrack(StudentModule, StudentModuleHistory)
def get_many(self, username, block_keys, scope=Scope.user_state, fields=None): def get_many(self, username, block_keys, scope=Scope.user_state, fields=None):
""" """
Retrieve the stored XBlock state for the specified XBlock usages. Retrieve the stored XBlock state for the specified XBlock usages.
...@@ -165,6 +169,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient): ...@@ -165,6 +169,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient):
# Remove it once we're no longer interested in the data. # Remove it once we're no longer interested in the data.
self._ddog_histogram(evt_time, 'get_many.blks_out', block_count) self._ddog_histogram(evt_time, 'get_many.blks_out', block_count)
@donottrack(StudentModule, StudentModuleHistory)
def set_many(self, username, block_keys_to_state, scope=Scope.user_state): def set_many(self, username, block_keys_to_state, scope=Scope.user_state):
""" """
Set fields for a particular XBlock. Set fields for a particular XBlock.
...@@ -239,6 +244,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient): ...@@ -239,6 +244,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient):
# Event for the entire set_many call. # Event for the entire set_many call.
self._ddog_histogram(evt_time, 'set_many.blks_updated', len(block_keys_to_state)) self._ddog_histogram(evt_time, 'set_many.blks_updated', len(block_keys_to_state))
@donottrack(StudentModule, StudentModuleHistory)
def delete_many(self, username, block_keys, scope=Scope.user_state, fields=None): def delete_many(self, username, block_keys, scope=Scope.user_state, fields=None):
""" """
Delete the stored XBlock state for a many xblock usages. Delete the stored XBlock state for a many xblock usages.
...@@ -275,6 +281,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient): ...@@ -275,6 +281,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient):
# We just read this object, so we know that we can do an update # We just read this object, so we know that we can do an update
student_module.save(force_update=True) student_module.save(force_update=True)
@donottrack(StudentModule, StudentModuleHistory)
def get_history(self, username, block_key, scope=Scope.user_state): def get_history(self, username, block_key, scope=Scope.user_state):
""" """
Retrieve history of state changes for a given block for a given Retrieve history of state changes for a given block for a given
...@@ -329,6 +336,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient): ...@@ -329,6 +336,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient):
yield XBlockUserState(username, block_key, state, history_entry.created, scope) yield XBlockUserState(username, block_key, state, history_entry.created, scope)
@donottrack(StudentModule, StudentModuleHistory)
def iter_all_for_block(self, block_key, scope=Scope.user_state, batch_size=None): def iter_all_for_block(self, block_key, scope=Scope.user_state, batch_size=None):
""" """
You get no ordering guarantees. Fetching will happen in batch_size You get no ordering guarantees. Fetching will happen in batch_size
...@@ -339,6 +347,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient): ...@@ -339,6 +347,7 @@ class DjangoXBlockUserStateClient(XBlockUserStateClient):
raise ValueError("Only Scope.user_state is supported") raise ValueError("Only Scope.user_state is supported")
raise NotImplementedError() raise NotImplementedError()
@donottrack(StudentModule, StudentModuleHistory)
def iter_all_for_course(self, course_key, block_type=None, scope=Scope.user_state, batch_size=None): def iter_all_for_course(self, course_key, block_type=None, scope=Scope.user_state, batch_size=None):
""" """
You get no ordering guarantees. Fetching will happen in batch_size You get no ordering guarantees. Fetching will happen in batch_size
......
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
Root Package for getting call stacks of various Model classes being used Root Package for getting call stacks of various Model classes being used
""" """
from __future__ import absolute_import from __future__ import absolute_import
from .core import CallStackManager, CallStackMixin, donottrack from .core import CallStackManager, CallStackMixin, donottrack, trackit
...@@ -86,6 +86,7 @@ django-ratelimit-backend==0.6 ...@@ -86,6 +86,7 @@ django-ratelimit-backend==0.6
unicodecsv==0.9.4 unicodecsv==0.9.4
django-require==1.0.6 django-require==1.0.6
pyuca==1.1 pyuca==1.1
wrapt==1.10.5
# This needs to be installed *after* Cython, which is in pre.txt # This needs to be installed *after* Cython, which is in pre.txt
lxml==3.4.4 lxml==3.4.4
......
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