def test_to_json(self): """ Test the ability to serialize a `Validation` instance. """ validation = Validation("id") expected = {"xblock_id": "id", "messages": [], "empty": True} self.assertEqual(expected, validation.to_json()) validation.add( ValidationMessage(ValidationMessage.ERROR, "Error message")) validation.add( ValidationMessage(ValidationMessage.WARNING, "Warning message")) expected = { "xblock_id": "id", "messages": [{ "type": ValidationMessage.ERROR, "text": "Error message" }, { "type": ValidationMessage.WARNING, "text": "Warning message" }], "empty": False } self.assertEqual(expected, validation.to_json())
def submit_studio_edits(self, data, suffix=''): """ AJAX handler for studio_view() Save button """ values = {} # dict of new field values we are updating to_reset = [] # list of field names to delete from this XBlock for field_name in self.editable_fields: field = self.fields[field_name] if field_name in data['values']: if isinstance(field, JSONField): values[field_name] = field.from_json( data['values'][field_name]) else: raise JsonHandlerError( 400, "Unsupported field type: {}".format(field_name)) elif field_name in data['defaults'] and field.is_set_on(self): to_reset.append(field_name) self.clean_studio_edits(values) validation = Validation(self.scope_ids.usage_id) # We cannot set the fields on self yet, because even if validation fails, studio is going to save any changes we # make. So we create a "fake" object that has all the field values we are about to set. preview_data = FutureFields(new_fields_dict=values, newly_removed_fields=to_reset, fallback_obj=self) self.validate_field_data(validation, preview_data) if validation: for field_name, value in six.iteritems(values): setattr(self, field_name, value) for field_name in to_reset: self.fields[field_name].delete_from(self) return {'result': 'success'} else: raise JsonHandlerError(400, validation.to_json())
def submit_studio_edits(self, data, suffix=''): """ AJAX handler for studio_view() Save button """ values = {} # dict of new field values we are updating to_reset = [] # list of field names to delete from this XBlock for field_name in self.editable_fields: field = self.fields[field_name] if field_name in data['values']: if isinstance(field, JSONField): values[field_name] = field.from_json(data['values'][field_name]) else: raise JsonHandlerError(400, "Unsupported field type: {}".format(field_name)) elif field_name in data['defaults'] and field.is_set_on(self): to_reset.append(field_name) self.clean_studio_edits(values) validation = Validation(self.scope_ids.usage_id) # We cannot set the fields on self yet, because even if validation fails, studio is going to save any changes we # make. So we create a "fake" object that has all the field values we are about to set. preview_data = FutureFields( new_fields_dict=values, newly_removed_fields=to_reset, fallback_obj=self ) self.validate_field_data(validation, preview_data) if validation: for field_name, value in values.iteritems(): setattr(self, field_name, value) for field_name in to_reset: self.fields[field_name].delete_from(self) return {'result': 'success'} else: raise JsonHandlerError(400, validation.to_json())
def fe_submit_studio_edits(self, data, suffix=''): """ AJAX handler for studio edit submission """ if self.xblock_id is None: self.xblock_id = unicode( self.location.replace(branch=None, version=None)) updated_question_template = data['question_template'] updated_variables = data['variables'] updated_answer_template = data['answer_template'] qgb_db_service.update_question_template(self.xblock_id, updated_question_template, updated_variables, updated_answer_template) # "refresh" XBlock's values self.question_template = updated_question_template self.variables = updated_variables self.answer_template = updated_answer_template # call parent method # StudioEditableXBlockMixin.submit_studio_edits(self, data, suffix) # self.submit_studio_edits(data, suffix) # super(FormulaExerciseXBlock, self).submit_studio_edits(data, suffix) # copy from StudioEditableXBlockMixin (can not call parent method) values = {} # dict of new field values we are updating to_reset = [] # list of field names to delete from this XBlock for field_name in self.editable_fields: field = self.fields[field_name] if field_name in data['values']: if isinstance(field, JSONField): values[field_name] = field.from_json( data['values'][field_name]) else: raise JsonHandlerError( 400, "Unsupported field type: {}".format(field_name)) elif field_name in data['defaults'] and field.is_set_on(self): to_reset.append(field_name) self.clean_studio_edits(values) validation = Validation(self.scope_ids.usage_id) # We cannot set the fields on self yet, because even if validation fails, studio is going to save any changes we # make. So we create a "fake" object that has all the field values we are about to set. preview_data = FutureFields(new_fields_dict=values, newly_removed_fields=to_reset, fallback_obj=self) self.validate_field_data(validation, preview_data) if validation: for field_name, value in values.iteritems(): setattr(self, field_name, value) for field_name in to_reset: self.fields[field_name].delete_from(self) return {'result': 'success'} else: raise JsonHandlerError(400, validation.to_json())
def test_to_json(self): """ Test the ability to serialize a `Validation` instance. """ validation = Validation("id") expected = { "xblock_id": "id", "messages": [], "empty": True } self.assertEqual(expected, validation.to_json()) validation.add(ValidationMessage(ValidationMessage.ERROR, "Error message")) validation.add(ValidationMessage(ValidationMessage.WARNING, "Warning message")) expected = { "xblock_id": "id", "messages": [ {"type": ValidationMessage.ERROR, "text": "Error message"}, {"type": ValidationMessage.WARNING, "text": "Warning message"} ], "empty": False } self.assertEqual(expected, validation.to_json())