From f161bdd0a2dfd1ae4d8480e9e415f720df8a0f8e Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Fri, 22 Feb 2013 16:14:46 -0500 Subject: [PATCH 1/2] Fix studio import and export for CombinedOpenEnded and PeerGrading XModules Also, fix a bug in the peer grading. --- .../xmodule/combined_open_ended_module.py | 35 ++----------------- .../xmodule/xmodule/peer_grading_module.py | 32 +++++++---------- 2 files changed, 15 insertions(+), 52 deletions(-) diff --git a/common/lib/xmodule/xmodule/combined_open_ended_module.py b/common/lib/xmodule/xmodule/combined_open_ended_module.py index ee69d925d0..fdda54bb33 100644 --- a/common/lib/xmodule/xmodule/combined_open_ended_module.py +++ b/common/lib/xmodule/xmodule/combined_open_ended_module.py @@ -4,7 +4,7 @@ from lxml import etree from pkg_resources import resource_string -from .editing_module import EditingDescriptor +from xmodule.raw_module import RawDescriptor from .x_module import XModule from .xml_module import XmlDescriptor from xmodule.open_ended_grading_classes.combined_open_ended_modulev1 import CombinedOpenEndedV1Module, CombinedOpenEndedV1Descriptor @@ -134,7 +134,7 @@ class CombinedOpenEndedModule(XModule): } self.child_descriptor = descriptors[version_index](self.system) - self.child_definition = descriptors[version_index].definition_from_xml(etree.fromstring(definition['xml_string']), self.system) + self.child_definition = descriptors[version_index].definition_from_xml(etree.fromstring(definition['data']), self.system) self.child_module = modules[version_index](self.system, location, self.child_definition, self.child_descriptor, instance_state = json.dumps(instance_state), metadata = self.metadata, static_data= static_data) @@ -165,7 +165,7 @@ class CombinedOpenEndedModule(XModule): return self.child_module.display_name -class CombinedOpenEndedDescriptor(XmlDescriptor, EditingDescriptor): +class CombinedOpenEndedDescriptor(RawDescriptor): """ Module for adding combined open ended questions """ @@ -180,32 +180,3 @@ class CombinedOpenEndedDescriptor(XmlDescriptor, EditingDescriptor): js = {'coffee': [resource_string(__name__, 'js/src/html/edit.coffee')]} js_module_name = "HTMLEditingDescriptor" - @classmethod - def definition_from_xml(cls, xml_object, system): - """ - Pull out the individual tasks, the rubric, and the prompt, and parse - - Returns: - { - 'rubric': 'some-html', - 'prompt': 'some-html', - 'task_xml': dictionary of xml strings, - } - """ - - return {'xml_string' : etree.tostring(xml_object), 'metadata' : xml_object.attrib} - - - def definition_to_xml(self, resource_fs): - '''Return an xml element representing this definition.''' - elt = etree.Element('combinedopenended') - - def add_child(k): - child_str = '<{tag}>{body}'.format(tag=k, body=self.definition[k]) - child_node = etree.fromstring(child_str) - elt.append(child_node) - - for child in ['task']: - add_child(child) - - return elt diff --git a/common/lib/xmodule/xmodule/peer_grading_module.py b/common/lib/xmodule/xmodule/peer_grading_module.py index e262db5615..d1c5c2f85a 100644 --- a/common/lib/xmodule/xmodule/peer_grading_module.py +++ b/common/lib/xmodule/xmodule/peer_grading_module.py @@ -60,6 +60,18 @@ class PeerGradingModule(XModule): if isinstance(self.use_for_single_location, basestring): self.use_for_single_location = (self.use_for_single_location in TRUE_DICT) + self.link_to_location = self.metadata.get('link_to_location', USE_FOR_SINGLE_LOCATION) + if self.use_for_single_location == True: + try: + self.linked_problem = modulestore().get_instance(self.system.course_id, self.link_to_location) + except: + log.error("Linked location {0} for peer grading module {1} does not exist".format( + self.link_to_location, self.location)) + raise + due_date = self.linked_problem.metadata.get('peer_grading_due', None) + if due_date: + self.metadata['due'] = due_date + self.is_graded = self.metadata.get('is_graded', IS_GRADED) if isinstance(self.is_graded, basestring): self.is_graded = (self.is_graded in TRUE_DICT) @@ -75,17 +87,6 @@ class PeerGradingModule(XModule): self.display_due_date = self.timeinfo.display_due_date - self.link_to_location = self.metadata.get('link_to_location', USE_FOR_SINGLE_LOCATION) - if self.use_for_single_location == True: - try: - self.linked_problem = modulestore().get_instance(self.system.course_id, self.link_to_location) - except: - log.error("Linked location {0} for peer grading module {1} does not exist".format( - self.link_to_location, self.location)) - raise - due_date = self.linked_problem.metadata.get('peer_grading_due', None) - if due_date: - self.metadata['due'] = due_date self.ajax_url = self.system.ajax_url if not self.ajax_url.endswith("/"): @@ -606,13 +607,4 @@ class PeerGradingDescriptor(XmlDescriptor, EditingDescriptor): def definition_to_xml(self, resource_fs): '''Return an xml element representing this definition.''' elt = etree.Element('peergrading') - - def add_child(k): - child_str = '<{tag}>{body}'.format(tag=k, body=self.definition[k]) - child_node = etree.fromstring(child_str) - elt.append(child_node) - - for child in ['task']: - add_child(child) - return elt From ae60661f942f626decad0d51d1a8d445a05ae0f5 Mon Sep 17 00:00:00 2001 From: Diana Huang Date: Mon, 25 Feb 2013 11:04:24 -0500 Subject: [PATCH 2/2] Get previews to work in Studio and use the correct type of editors for these XModules within Studio. --- .../xmodule/combined_open_ended_module.py | 6 +---- .../openendedchild.py | 25 +++++++++++++------ .../xmodule/xmodule/peer_grading_module.py | 9 ++++--- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/common/lib/xmodule/xmodule/combined_open_ended_module.py b/common/lib/xmodule/xmodule/combined_open_ended_module.py index fdda54bb33..659590b5b4 100644 --- a/common/lib/xmodule/xmodule/combined_open_ended_module.py +++ b/common/lib/xmodule/xmodule/combined_open_ended_module.py @@ -6,7 +6,6 @@ from pkg_resources import resource_string from xmodule.raw_module import RawDescriptor from .x_module import XModule -from .xml_module import XmlDescriptor from xmodule.open_ended_grading_classes.combined_open_ended_modulev1 import CombinedOpenEndedV1Module, CombinedOpenEndedV1Descriptor log = logging.getLogger("mitx.courseware") @@ -169,7 +168,7 @@ class CombinedOpenEndedDescriptor(RawDescriptor): """ Module for adding combined open ended questions """ - mako_template = "widgets/html-edit.html" + mako_template = "widgets/raw-edit.html" module_class = CombinedOpenEndedModule filename_extension = "xml" @@ -177,6 +176,3 @@ class CombinedOpenEndedDescriptor(RawDescriptor): has_score = True template_dir_name = "combinedopenended" - js = {'coffee': [resource_string(__name__, 'js/src/html/edit.coffee')]} - js_module_name = "HTMLEditingDescriptor" - diff --git a/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py b/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py index 50f9534717..31d26fd3c3 100644 --- a/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py +++ b/common/lib/xmodule/xmodule/open_ended_grading_classes/openendedchild.py @@ -22,7 +22,7 @@ from xmodule.stringify import stringify_children from xmodule.xml_module import XmlDescriptor from xmodule.modulestore import Location from capa.util import * -from peer_grading_service import PeerGradingService +from peer_grading_service import PeerGradingService, MockPeerGradingService import controller_query_service from datetime import datetime @@ -106,8 +106,14 @@ class OpenEndedChild(object): # Used for progress / grading. Currently get credit just for # completion (doesn't matter if you self-assessed correct/incorrect). self._max_score = static_data['max_score'] - self.peer_gs = PeerGradingService(system.open_ended_grading_interface, system) - self.controller_qs = controller_query_service.ControllerQueryService(system.open_ended_grading_interface,system) + if system.open_ended_grading_interface: + self.peer_gs = PeerGradingService(system.open_ended_grading_interface, system) + self.controller_qs = controller_query_service.ControllerQueryService(system.open_ended_grading_interface,system) + else: + self.peer_gs = MockPeerGradingService() + self.controller_qs = None + + self.system = system @@ -461,11 +467,14 @@ class OpenEndedChild(object): return success, allowed_to_submit, error_message def get_eta(self): - response = self.controller_qs.check_for_eta(self.location_string) - try: - response = json.loads(response) - except: - pass + if self.controller_qs: + response = self.controller_qs.check_for_eta(self.location_string) + try: + response = json.loads(response) + except: + pass + else: + return "" success = response['success'] if isinstance(success, basestring): diff --git a/common/lib/xmodule/xmodule/peer_grading_module.py b/common/lib/xmodule/xmodule/peer_grading_module.py index d1c5c2f85a..16c118a434 100644 --- a/common/lib/xmodule/xmodule/peer_grading_module.py +++ b/common/lib/xmodule/xmodule/peer_grading_module.py @@ -14,7 +14,7 @@ from xmodule.modulestore import Location from xmodule.modulestore.django import modulestore from timeinfo import TimeInfo -from xmodule.open_ended_grading_classes.peer_grading_service import PeerGradingService, GradingServiceError +from xmodule.open_ended_grading_classes.peer_grading_service import PeerGradingService, GradingServiceError, MockPeerGradingService log = logging.getLogger(__name__) @@ -53,7 +53,10 @@ class PeerGradingModule(XModule): #We need to set the location here so the child modules can use it system.set('location', location) self.system = system - self.peer_gs = PeerGradingService(self.system.open_ended_grading_interface, self.system) + if(self.system.open_ended_grading_interface): + self.peer_gs = PeerGradingService(self.system.open_ended_grading_interface, self.system) + else: + self.peer_gs = MockPeerGradingService() self.use_for_single_location = self.metadata.get('use_for_single_location', USE_FOR_SINGLE_LOCATION) @@ -563,7 +566,7 @@ class PeerGradingDescriptor(XmlDescriptor, EditingDescriptor): """ Module for adding combined open ended questions """ - mako_template = "widgets/html-edit.html" + mako_template = "widgets/raw-edit.html" module_class = PeerGradingModule filename_extension = "xml"