diff --git a/common/lib/xmodule/xmodule/combined_open_ended_module.py b/common/lib/xmodule/xmodule/combined_open_ended_module.py
index df8c7e716c..e01ae49149 100644
--- a/common/lib/xmodule/xmodule/combined_open_ended_module.py
+++ b/common/lib/xmodule/xmodule/combined_open_ended_module.py
@@ -13,7 +13,7 @@ import textwrap
log = logging.getLogger("mitx.courseware")
-V1_SETTINGS_ATTRIBUTES = ["display_name", "attempts", "is_graded", "accept_file_upload",
+V1_SETTINGS_ATTRIBUTES = ["display_name", "max_attempts", "graded", "accept_file_upload",
"skip_spelling_checks", "due", "graceperiod", "weight"]
V1_STUDENT_ATTRIBUTES = ["current_task_number", "task_states", "state",
@@ -172,7 +172,7 @@ class CombinedOpenEndedFields(object):
display_name = String(
display_name="Display Name",
help="This name appears in the horizontal navigation at the top of the page.",
- default="Open Ended Grading",
+ default="Open Response Assessment",
scope=Scope.settings
)
current_task_number = Integer(
@@ -189,6 +189,12 @@ class CombinedOpenEndedFields(object):
default="initial",
scope=Scope.user_state
)
+ graded = Boolean(
+ display_name="Graded",
+ help='Defines whether the student gets credit for grading this problem.',
+ default=False,
+ scope=Scope.settings
+ )
student_attempts = Integer(
help="Number of attempts taken by the student on this problem",
default=0,
@@ -199,19 +205,13 @@ class CombinedOpenEndedFields(object):
default=False,
scope=Scope.user_state
)
- attempts = Integer(
+ max_attempts = Integer(
display_name="Maximum Attempts",
help="The number of times the student can try to answer this problem.",
default=1,
scope=Scope.settings,
values={"min" : 1 }
)
- is_graded = Boolean(
- display_name="Graded",
- help="Whether or not the problem is graded.",
- default=False,
- scope=Scope.settings
- )
accept_file_upload = Boolean(
display_name="Allow File Uploads",
help="Whether or not the student can submit files as a response.",
@@ -339,37 +339,9 @@ class CombinedOpenEndedModule(CombinedOpenEndedFields, XModule):
def __init__(self, *args, **kwargs):
"""
- Definition file should have one or many task blocks, a rubric block, and a prompt block:
+ Definition file should have one or many task blocks, a rubric block, and a prompt block.
- Sample file:
-
-
- Blah blah rubric.
-
-
- Some prompt.
-
-
-
-
- What hint about this problem would you give to someone?
-
-
- Save Succcesful. Thanks for participating!
-
-
-
-
-
-
- Enter essay here.
- This is the answer.
- {"grader_settings" : "ml_grading.conf",
- "problem_id" : "6.002x/Welcome/OETest"}
-
-
-
-
+ See DEFAULT_DATA for a sample.
"""
XModule.__init__(self, *args, **kwargs)
@@ -450,6 +422,11 @@ class CombinedOpenEndedDescriptor(CombinedOpenEndedFields, RawDescriptor):
js_module_name = "OpenEndedMarkdownEditingDescriptor"
css = {'scss': [resource_string(__name__, 'css/editor/edit.scss'), resource_string(__name__, 'css/combinedopenended/edit.scss')]}
+ metadata_translations = {
+ 'is_graded': 'graded',
+ 'attempts': 'max_attempts',
+ }
+
def get_context(self):
_context = RawDescriptor.get_context(self)
_context.update({'markdown': self.markdown,
diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py
index a9feca24f0..fbc846ecd3 100644
--- a/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py
+++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/combined_open_ended_modulev1.py
@@ -78,37 +78,7 @@ class CombinedOpenEndedV1Module():
instance_state=None, shared_state=None, metadata=None, static_data=None, **kwargs):
"""
- Definition file should have one or many task blocks, a rubric block, and a prompt block:
-
- Sample file:
-
-
- Blah blah rubric.
-
-
- Some prompt.
-
-
-
-
- What hint about this problem would you give to someone?
-
-
- Save Succcesful. Thanks for participating!
-
-
-
-
-
-
- Enter essay here.
- This is the answer.
- {"grader_settings" : "ml_grading.conf",
- "problem_id" : "6.002x/Welcome/OETest"}
-
-
-
-
+ Definition file should have one or many task blocks, a rubric block, and a prompt block. See DEFAULT_DATA in combined_open_ended_module for a sample.
"""
@@ -131,8 +101,8 @@ class CombinedOpenEndedV1Module():
# Allow reset is true if student has failed the criteria to move to the next child task
self.ready_to_reset = instance_state.get('ready_to_reset', False)
- self.attempts = self.instance_state.get('attempts', MAX_ATTEMPTS)
- self.is_scored = self.instance_state.get('is_graded', IS_SCORED) in TRUE_DICT
+ self.max_attempts = self.instance_state.get('max_attempts', MAX_ATTEMPTS)
+ self.is_scored = self.instance_state.get('graded', IS_SCORED) in TRUE_DICT
self.accept_file_upload = self.instance_state.get('accept_file_upload', ACCEPT_FILE_UPLOAD) in TRUE_DICT
self.skip_basic_checks = self.instance_state.get('skip_spelling_checks', SKIP_BASIC_CHECKS) in TRUE_DICT
@@ -153,7 +123,7 @@ class CombinedOpenEndedV1Module():
# Static data is passed to the child modules to render
self.static_data = {
'max_score': self._max_score,
- 'max_attempts': self.attempts,
+ 'max_attempts': self.max_attempts,
'prompt': definition['prompt'],
'rubric': definition['rubric'],
'display_name': self.display_name,
diff --git a/common/lib/xmodule/xmodule/peer_grading_module.py b/common/lib/xmodule/xmodule/peer_grading_module.py
index 0df47758dc..8f5f93318a 100644
--- a/common/lib/xmodule/xmodule/peer_grading_module.py
+++ b/common/lib/xmodule/xmodule/peer_grading_module.py
@@ -19,32 +19,27 @@ from django.utils.timezone import UTC
log = logging.getLogger(__name__)
-USE_FOR_SINGLE_LOCATION = False
-LINK_TO_LOCATION = ""
-MAX_SCORE = 1
-IS_GRADED = False
EXTERNAL_GRADER_NO_CONTACT_ERROR = "Failed to contact external graders. Please notify course staff."
-
class PeerGradingFields(object):
use_for_single_location = Boolean(
display_name="Show Single Problem",
help='When True, only the single problem specified by "Link to Problem Location" is shown. '
'When False, a panel is displayed with all problems available for peer grading.',
- default=USE_FOR_SINGLE_LOCATION,
+ default=False,
scope=Scope.settings
)
link_to_location = String(
display_name="Link to Problem Location",
help='The location of the problem being graded. Only used when "Show Single Problem" is True.',
- default=LINK_TO_LOCATION,
+ default="",
scope=Scope.settings
)
- is_graded = Boolean(
+ graded = Boolean(
display_name="Graded",
help='Defines whether the student gets credit for grading this problem. Only used when "Show Single Problem" is True.',
- default=IS_GRADED,
+ default=False,
scope=Scope.settings
)
due_date = Date(
@@ -56,12 +51,6 @@ class PeerGradingFields(object):
default=None,
scope=Scope.settings
)
- max_grade = Integer(
- help="The maximum grade that a student can receive for this problem.",
- default=MAX_SCORE,
- scope=Scope.settings,
- values={"min": 0}
- )
student_data_for_location = Dict(
help="Student data for a given peer grading problem.",
scope=Scope.user_state
@@ -136,10 +125,6 @@ class PeerGradingModule(PeerGradingFields, XModule):
if not self.ajax_url.endswith("/"):
self.ajax_url = self.ajax_url + "/"
- # Integer could return None, so keep this check.
- if not isinstance(self.max_grade, int):
- raise TypeError("max_grade needs to be an integer.")
-
def closed(self):
return self._closed(self.timeinfo)
@@ -232,7 +217,7 @@ class PeerGradingModule(PeerGradingFields, XModule):
'score': score,
'total': max_score,
}
- if not self.use_for_single_location or not self.is_graded:
+ if not self.use_for_single_location or not self.graded:
return score_dict
try:
@@ -253,7 +238,7 @@ class PeerGradingModule(PeerGradingFields, XModule):
self.student_data_for_location = response
score = int(count_graded >= count_required and count_graded > 0) * float(weight)
- total = self.max_grade * float(weight)
+ total = float(weight)
score_dict['score'] = score
score_dict['total'] = total
@@ -266,8 +251,8 @@ class PeerGradingModule(PeerGradingFields, XModule):
randomization, and 5/7 on another
'''
max_grade = None
- if self.use_for_single_location and self.is_graded:
- max_grade = self.max_grade
+ if self.use_for_single_location and self.graded:
+ max_grade = self.weight
return max_grade
def get_next_submission(self, data):
@@ -634,9 +619,13 @@ class PeerGradingDescriptor(PeerGradingFields, RawDescriptor):
#Specify whether or not to pass in open ended interface
needs_open_ended_interface = True
+ metadata_translations = {
+ 'is_graded': 'graded',
+ 'attempts': 'max_attempts',
+ }
+
@property
def non_editable_metadata_fields(self):
non_editable_fields = super(PeerGradingDescriptor, self).non_editable_metadata_fields
- non_editable_fields.extend([PeerGradingFields.due_date, PeerGradingFields.grace_period_string,
- PeerGradingFields.max_grade])
+ non_editable_fields.extend([PeerGradingFields.due_date, PeerGradingFields.grace_period_string])
return non_editable_fields