diff --git a/common/lib/xmodule/xmodule/self_assessment_module.py b/common/lib/xmodule/xmodule/self_assessment_module.py
index d66cc2fbbc..d2175a4ed7 100644
--- a/common/lib/xmodule/xmodule/self_assessment_module.py
+++ b/common/lib/xmodule/xmodule/self_assessment_module.py
@@ -1,3 +1,9 @@
+"""
+Add Self Assessment module so students can write essay, submit, then see a rubric and rate themselves.
+Incredibly hacky solution to persist state and properly display information
+"""
+
+
import copy
from fs.errors import ResourceNotFoundError
import logging
@@ -21,6 +27,7 @@ from xmodule.contentstore.content import XASSET_SRCREF_PREFIX, StaticContent
log = logging.getLogger("mitx.courseware")
+#Set the default number of max attempts. Should be 1 for production
max_attempts=100
def only_one(lst, default="", process=lambda x: x):
@@ -60,9 +67,35 @@ class SelfAssessmentModule(XModule):
XModule.__init__(self, system, location, definition, descriptor,
instance_state, shared_state, **kwargs)
+ """
+ Definition file should have 3 blocks -- problem, rubric, and submitmessage
+ Sample file:
+
+
+
+ Insert problem text here.
+
+
+ Insert grading rubric here.
+
+
+ Thanks for submitting!
+
+
+
+
+ """
+
+ #Parse definition file
dom2=etree.fromstring("" + self.definition['data'] + "")
+
+ #Extract problem, submission message and rubric from definition file
self.rubric="
" + ''.join([etree.tostring(child) for child in only_one(dom2.xpath('rubric'))])
self.problem=''.join([etree.tostring(child) for child in only_one(dom2.xpath('problem'))])
+ self.submit_message=etree.tostring(dom2.xpath('submitmessage')[0])
+
+ #Forms to append to problem and rubric that capture student responses.
+ #Do not change ids and names, as javascript (selfassessment/display.coffee) depends on them
problem_form=('
').format(system.ajax_url)
+ #Combine problem, rubric, and the forms
self.problem=''.join([self.problem,problem_form])
self.rubric=''.join([self.rubric,rubric_form])
+
+ #Display the problem to the student to begin with
self.html = self.problem
+
+ #Initialize variables
self.answer=""
self.score=0
self.top_score=1
- self.submit_message=etree.tostring(dom2.xpath('submitmessage')[0])
-
self.attempts = 0
+ self.correctness="incorrect"
+ self.done=False
self.max_attempts = self.metadata.get('attempts', None)
+
+ #Pull variables from instance state if available
if self.max_attempts is not None:
self.max_attempts = int(self.max_attempts)
else:
self.max_attempts=max_attempts
- self.correctness="incorrect"
- self.done=False
if instance_state is not None:
instance_state = json.loads(instance_state)
log.debug(instance_state)
@@ -160,6 +198,10 @@ class SelfAssessmentModule(XModule):
return json.dumps(d, cls=ComplexEncoder)
def show_rubric(self,get):
+ """
+ After the problem is submitted, show the rubric
+ """
+ #Check to see if attempts are less than max
if(self.attempts