From 0ff4ebb4a364ec1c56ad392a2dee1149babce15b Mon Sep 17 00:00:00 2001
From: Paul Charsley
Date: Fri, 13 Jun 2014 15:36:25 +1200
Subject: [PATCH] MDL-31861 add web service function save_definitions
---
grade/grading/form/guide/lib.php | 28 +-
grade/grading/form/rubric/lib.php | 8 +-
lib/classes/grading_external.php | 143 ++++++++++-
lib/db/services.php | 7 +
lib/tests/grading_externallib_test.php | 340 +++++++++++++++++++++++++
5 files changed, 505 insertions(+), 21 deletions(-)
diff --git a/grade/grading/form/guide/lib.php b/grade/grading/form/guide/lib.php
index 5c351fa320f..95695170ff4 100644
--- a/grade/grading/form/guide/lib.php
+++ b/grade/grading/form/guide/lib.php
@@ -205,7 +205,7 @@ class gradingform_guide_controller extends gradingform_controller {
} else {
$newcomment = $newdefinition->guide['comments']; // New ones to be saved.
}
- $currentcomments = $currentdefinition->guide_comment;
+ $currentcomments = $currentdefinition->guide_comments;
$commentfields = array('sortorder', 'description');
foreach ($newcomment as $id => $comment) {
if (preg_match('/^NEWID\d+$/', $id)) {
@@ -309,7 +309,7 @@ class gradingform_guide_controller extends gradingform_controller {
$this->definition = $definition;
// Now get criteria.
$this->definition->guide_criteria = array();
- $this->definition->guide_comment = array();
+ $this->definition->guide_comments = array();
$criteria = $DB->get_recordset('gradingform_guide_criteria', array('definitionid' => $this->definition->id), 'sortorder');
foreach ($criteria as $criterion) {
foreach (array('id', 'sortorder', 'description', 'descriptionformat',
@@ -327,7 +327,7 @@ class gradingform_guide_controller extends gradingform_controller {
$comments = $DB->get_recordset('gradingform_guide_comments', array('definitionid' => $this->definition->id), 'sortorder');
foreach ($comments as $comment) {
foreach (array('id', 'sortorder', 'description', 'descriptionformat') as $fieldname) {
- $this->definition->guide_comment[$comment->id][$fieldname] = $comment->{$fieldname};
+ $this->definition->guide_comments[$comment->id][$fieldname] = $comment->{$fieldname};
}
}
$comments->close();
@@ -404,8 +404,8 @@ class gradingform_guide_controller extends gradingform_controller {
} else if (!$definition && $addemptycriterion) {
$properties->guide['criteria'] = array('addcriterion' => 1);
}
- if (!empty($definition->guide_comment)) {
- $properties->guide['comments'] = $definition->guide_comment;
+ if (!empty($definition->guide_comments)) {
+ $properties->guide['comments'] = $definition->guide_comments;
} else if (!$definition && $addemptycriterion) {
$properties->guide['comments'] = array('addcomment' => 1);
}
@@ -508,7 +508,7 @@ class gradingform_guide_controller extends gradingform_controller {
}
$criteria = $this->definition->guide_criteria;
- $comments = $this->definition->guide_comment;
+ $comments = $this->definition->guide_comments;
$output = $this->get_renderer($page);
$guide = '';
@@ -652,7 +652,7 @@ class gradingform_guide_controller extends gradingform_controller {
/**
* @return array An array containing 2 key/value pairs which hold the external_multiple_structure
- * for the 'guide_criteria' and the 'guide_comment'.
+ * for the 'guide_criteria' and the 'guide_comments'.
* @see gradingform_controller::get_external_definition_details()
* @since Moodle 2.5
*/
@@ -660,8 +660,8 @@ class gradingform_guide_controller extends gradingform_controller {
$guide_criteria = new external_multiple_structure(
new external_single_structure(
array(
- 'id' => new external_value(PARAM_INT, 'criterion id'),
- 'sortorder' => new external_value(PARAM_INT, 'sortorder'),
+ 'id' => new external_value(PARAM_INT, 'criterion id', VALUE_OPTIONAL),
+ 'sortorder' => new external_value(PARAM_INT, 'sortorder', VALUE_OPTIONAL),
'description' => new external_value(PARAM_RAW, 'description', VALUE_OPTIONAL),
'descriptionformat' => new external_format_value('description', VALUE_OPTIONAL),
'shortname' => new external_value(PARAM_TEXT, 'description'),
@@ -671,17 +671,17 @@ class gradingform_guide_controller extends gradingform_controller {
)
)
);
- $guide_comment = new external_multiple_structure(
+ $guide_comments = new external_multiple_structure(
new external_single_structure(
array(
- 'id' => new external_value(PARAM_INT, 'criterion id'),
- 'sortorder' => new external_value(PARAM_INT, 'sortorder'),
+ 'id' => new external_value(PARAM_INT, 'criterion id', VALUE_OPTIONAL),
+ 'sortorder' => new external_value(PARAM_INT, 'sortorder', VALUE_OPTIONAL),
'description' => new external_value(PARAM_RAW, 'description', VALUE_OPTIONAL),
'descriptionformat' => new external_format_value('description', VALUE_OPTIONAL)
)
), 'comments', VALUE_OPTIONAL
);
- return array('guide_criteria' => $guide_criteria, 'guide_comment' => $guide_comment);
+ return array('guide_criteria' => $guide_criteria, 'guide_comments' => $guide_comments);
}
/**
@@ -895,7 +895,7 @@ class gradingform_guide_instance extends gradingform_instance {
}
}
$criteria = $this->get_controller()->get_definition()->guide_criteria;
- $comments = $this->get_controller()->get_definition()->guide_comment;
+ $comments = $this->get_controller()->get_definition()->guide_comments;
$options = $this->get_controller()->get_options();
$value = $gradingformelement->getValue();
$html = '';
diff --git a/grade/grading/form/rubric/lib.php b/grade/grading/form/rubric/lib.php
index 1cf9b444173..36d366d9ed3 100644
--- a/grade/grading/form/rubric/lib.php
+++ b/grade/grading/form/rubric/lib.php
@@ -668,15 +668,15 @@ class gradingform_rubric_controller extends gradingform_controller {
$rubric_criteria = new external_multiple_structure(
new external_single_structure(
array(
- 'id' => new external_value(PARAM_INT, 'criterion id'),
- 'sortorder' => new external_value(PARAM_INT, 'sortorder'),
+ 'id' => new external_value(PARAM_INT, 'criterion id', VALUE_OPTIONAL),
+ 'sortorder' => new external_value(PARAM_INT, 'sortorder', VALUE_OPTIONAL),
'description' => new external_value(PARAM_RAW, 'description', VALUE_OPTIONAL),
'descriptionformat' => new external_format_value('description', VALUE_OPTIONAL),
'levels' => new external_multiple_structure(
new external_single_structure(
array(
- 'id' => new external_value(PARAM_INT, 'level id'),
- 'score' => new external_value(PARAM_FLOAT, 'score'),
+ 'id' => new external_value(PARAM_INT, 'level id', VALUE_OPTIONAL),
+ 'score' => new external_value(PARAM_FLOAT, 'score', VALUE_OPTIONAL),
'definition' => new external_value(PARAM_RAW, 'definition', VALUE_OPTIONAL),
'definitionformat' => new external_format_value('definition', VALUE_OPTIONAL)
)
diff --git a/lib/classes/grading_external.php b/lib/classes/grading_external.php
index eec49ceeb17..27e4d71c76f 100644
--- a/lib/classes/grading_external.php
+++ b/lib/classes/grading_external.php
@@ -226,6 +226,7 @@ class core_grading_external extends external_api {
'cmid' => new external_value(PARAM_INT, 'course module id'),
'contextid' => new external_value(PARAM_INT, 'context id'),
'component' => new external_value(PARAM_TEXT, 'component name'),
+ 'areaname' => new external_value(PARAM_TEXT, 'area name'),
'activemethod' => new external_value(PARAM_TEXT, 'active method', VALUE_OPTIONAL),
'definitions' => new external_multiple_structure(self::definition(), 'definitions')
)
@@ -240,11 +241,11 @@ class core_grading_external extends external_api {
private static function definition() {
global $CFG;
$definition = array();
- $definition['id'] = new external_value(PARAM_INT, 'definition id');
+ $definition['id'] = new external_value(PARAM_INT, 'definition id', VALUE_OPTIONAL);
$definition['method'] = new external_value(PARAM_TEXT, 'method');
$definition['name'] = new external_value(PARAM_TEXT, 'name');
- $definition['description'] = new external_value(PARAM_RAW, 'description');
- $definition['descriptionformat'] = new external_format_value('description');
+ $definition['description'] = new external_value(PARAM_RAW, 'description', VALUE_OPTIONAL);
+ $definition['descriptionformat'] = new external_format_value('description', VALUE_OPTIONAL);
$definition['status'] = new external_value(PARAM_INT, 'status');
$definition['copiedfromid'] = new external_value(PARAM_INT, 'copied from id', VALUE_OPTIONAL);
$definition['timecreated'] = new external_value(PARAM_INT, 'creation time');
@@ -442,4 +443,140 @@ class core_grading_external extends external_api {
);
}
+ /**
+ * Describes the parameters for save_definitions
+ *
+ * @return external_function_parameters
+ * @since Moodle 2.8
+ */
+ public static function save_definitions_parameters() {
+ return new external_function_parameters(
+ array(
+ 'areas' => new external_multiple_structure(self::grading_area(), 'areas with definitions to save')
+ )
+ );
+ }
+
+ /**
+ * Saves the areas and definitions
+ * @param array $areas array of areas containing definitions to be saved
+ * @return null
+ * @throws invalid_parameter_exception
+ * @since Moodle 2.8
+ */
+ public static function save_definitions($areas) {
+ $params = self::validate_parameters(self::save_definitions_parameters(),
+ array('areas' => $areas));
+
+ foreach ($params['areas'] as $area) {
+
+ $context = context::instance_by_id($area['contextid']);
+ require_capability('moodle/grade:managegradingforms', $context);
+ $gradingmanager = get_grading_manager($context, $area['component'], $area['areaname']);
+ $gradingmanager->set_active_method($area['activemethod']);
+ $availablemethods = $gradingmanager->get_available_methods();
+
+ foreach ($area['definitions'] as $definition) {
+ if (array_key_exists($definition['method'], $availablemethods)) {
+ $controller = $gradingmanager->get_controller($definition['method']);
+ $controller->update_definition(self::create_definition_object($definition));
+ } else {
+ throw new invalid_parameter_exception('Unknown Grading method: '. $definition['method']);
+ }
+ }
+ }
+ }
+
+ /**
+ * Describes the return value for save_definitions
+ *
+ * @return external_single_structure
+ * @since Moodle 2.8
+ */
+ public static function save_definitions_returns() {
+ return null;
+ }
+
+ /**
+ * Creates a definition stdClass object using the values from the definition
+ * array that is passed in as a parameter
+ *
+ * @param array $definition
+ * @return stdClass definition object
+ * @since Moodle 2.8
+ */
+ private static function create_definition_object($definition) {
+ global $CFG;
+
+ $method = $definition['method'];
+ $definitionobject = new stdClass();
+ foreach ($definition as $key => $value) {
+ if (!is_array($value)) {
+ $definitionobject->$key = $value;
+ }
+ }
+ $text = '';
+ $format = FORMAT_MOODLE;
+ if (isset($definition['description'])) {
+ $text = $definition['description'];
+ if (isset($definition['descriptionformat'])) {
+ $format = $definition['descriptionformat'];
+ }
+ }
+ $definitionobject->description_editor = array('text' => $text, 'format' => $format);
+
+ require_once("$CFG->libdir/filelib.php");
+ require_once($CFG->dirroot.'/grade/grading/form/'.$method.'/lib.php');
+ $details = call_user_func('gradingform_'.$method.'_controller::get_external_definition_details');
+ $methodarray = array();
+ foreach (array_keys($details) as $definitionkey) {
+ $items = array();
+ $idnumber = 1;
+ foreach ($definition[$method][$definitionkey] as $item) {
+ $processeditem = self::set_new_ids($item, $idnumber);
+ $items[$processeditem['id']] = $processeditem;
+ $idnumber++;
+ }
+ $definitionobjectkey = substr($definitionkey, strlen($method.'_'));
+ $methodarray[$definitionobjectkey] = $items;
+ $definitionobject->$method = $methodarray;
+ }
+
+ return $definitionobject;
+ }
+
+ /**
+ * Recursively iterates through arrays. Any array without an id key-value combination
+ * is assumed to be an array of values to be inserted and an id key-value is added with
+ * the value matching the regex '/^NEWID\d+$/' that is expected by each grading form implementation.
+ *
+ * @param array $arraytoset the array to be processed
+ * @param int $startnumber the starting number for the new id numbers
+ * @return array with missing id keys added for all arrays
+ * @since Moodle 2.8
+ */
+ private static function set_new_ids($arraytoset, $startnumber) {
+ $result = array();
+ $foundid = false;
+ $number = $startnumber;
+ foreach ($arraytoset as $key1 => $value1) {
+ if (is_array($value1)) {
+ foreach ($value1 as $key2 => $value2) {
+ $processedvalue = self::set_new_ids($value2, $number);
+ $result[$key1][$processedvalue['id']] = $processedvalue;
+ $number++;
+ }
+ } else {
+ $result[$key1] = $value1;
+ }
+ if ($key1 === 'id') {
+ $foundid = true;
+ }
+ }
+ if (!$foundid) {
+ $result['id'] = 'NEWID'.$number;
+ }
+ return $result;
+ }
+
}
diff --git a/lib/db/services.php b/lib/db/services.php
index cc81df42d0c..261495a34ac 100644
--- a/lib/db/services.php
+++ b/lib/db/services.php
@@ -825,6 +825,13 @@ $functions = array(
'type' => 'read'
),
+ 'core_grading_save_definitions' => array(
+ 'classname' => 'core_grading_external',
+ 'methodname' => 'save_definitions',
+ 'description' => 'Save grading definitions',
+ 'type' => 'write'
+ ),
+
'core_grading_get_gradingform_instances' => array(
'classname' => 'core_grading_external',
'methodname' => 'get_gradingform_instances',
diff --git a/lib/tests/grading_externallib_test.php b/lib/tests/grading_externallib_test.php
index 74b80464f5d..e8ea131cc7c 100644
--- a/lib/tests/grading_externallib_test.php
+++ b/lib/tests/grading_externallib_test.php
@@ -298,4 +298,344 @@ class core_grading_externallib_testcase extends externallib_advanced_testcase {
$this->assertEquals($levelid, $criteria[$criterionid]['levelid']);
$this->assertEquals('excellent work', $criteria[$criterionid]['remark']);
}
+
+ /**
+ *
+ * Test save_definitions for rubric grading method
+ */
+ public function test_save_definitions_rubric() {
+ global $DB, $CFG, $USER;
+
+ $this->resetAfterTest(true);
+ // Create a course and assignment.
+ $course = self::getDataGenerator()->create_course();
+ $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
+ $params['course'] = $course->id;
+ $instance = $generator->create_instance($params);
+ $cm = get_coursemodule_from_instance('assign', $instance->id);
+ $context = context_module::instance($cm->id);
+ $coursecontext = context_course::instance($course->id);
+
+ // Create the teacher.
+ $teacher = self::getDataGenerator()->create_user();
+ $USER->id = $teacher->id;
+ $teacherrole = $DB->get_record('role', array('shortname' => 'editingteacher'));
+ $this->assignUserCapability('moodle/grade:managegradingforms', $context->id, $teacherrole->id);
+ $this->getDataGenerator()->enrol_user($teacher->id,
+ $course->id,
+ $teacherrole->id);
+
+ // The grading area to insert.
+ $gradingarea = array(
+ 'cmid' => $cm->id,
+ 'contextid' => $context->id,
+ 'component' => 'mod_assign',
+ 'areaname' => 'submissions',
+ 'activemethod' => 'rubric'
+ );
+
+ // The rubric definition to insert.
+ $rubricdefinition = array(
+ 'method' => 'rubric',
+ 'name' => 'test',
+ 'description' => '',
+ 'status' => 20,
+ 'copiedfromid' => 1,
+ 'timecreated' => 1,
+ 'usercreated' => $teacher->id,
+ 'timemodified' => 1,
+ 'usermodified' => $teacher->id,
+ 'timecopied' => 0
+ );
+
+ // The criterion to insert.
+ $rubriccriteria1 = array (
+ 'sortorder' => 1,
+ 'description' => 'Demonstrate an understanding of disease control',
+ 'descriptionformat' => 0
+ );
+
+ // 3 levels for the criterion.
+ $rubriclevel1 = array (
+ 'score' => 50,
+ 'definition' => 'pass',
+ 'definitionformat' => 0
+ );
+ $rubriclevel2 = array (
+ 'score' => 100,
+ 'definition' => 'excellent',
+ 'definitionformat' => 0
+ );
+ $rubriclevel3 = array (
+ 'score' => 0,
+ 'definition' => 'fail',
+ 'definitionformat' => 0
+ );
+
+ $rubriccriteria1['levels'] = array($rubriclevel1, $rubriclevel2, $rubriclevel3);
+ $rubricdefinition['rubric'] = array('rubric_criteria' => array($rubriccriteria1));
+ $gradingarea['definitions'] = array($rubricdefinition);
+
+ $results = core_grading_external::save_definitions(array($gradingarea));
+
+ $area = $DB->get_record('grading_areas',
+ array('contextid' => $context->id, 'component' => 'mod_assign', 'areaname' => 'submissions'),
+ '*', MUST_EXIST);
+ $this->assertEquals($area->activemethod, 'rubric');
+
+ $definition = $DB->get_record('grading_definitions', array('areaid' => $area->id, 'method' => 'rubric'), '*', MUST_EXIST);
+ $this->assertEquals($rubricdefinition['name'], $definition->name);
+
+ $criterion1 = $DB->get_record('gradingform_rubric_criteria', array('definitionid' => $definition->id), '*', MUST_EXIST);
+ $levels = $DB->get_records('gradingform_rubric_levels', array('criterionid' => $criterion1->id));
+ $validlevelcount = 0;
+ $expectedvalue = true;
+ foreach ($levels as $level) {
+ if ($level->score == 0) {
+ $this->assertEquals('fail', $level->definition);
+ $validlevelcount++;
+ } else if ($level->score == 50) {
+ $this->assertEquals('pass', $level->definition);
+ $validlevelcount++;
+ } else if ($level->score == 100) {
+ $this->assertEquals('excellent', $level->definition);
+ $excellentlevelid = $level->id;
+ $validlevelcount++;
+ } else {
+ $expectedvalue = false;
+ }
+ }
+ $this->assertEquals(3, $validlevelcount);
+ $this->assertTrue($expectedvalue, 'A level with an unexpected score was found');
+
+ // Test add a new level and modify an existing.
+ // Test add a new criteria and modify an existing.
+ // Test modify a definition.
+
+ // The rubric definition to update.
+ $rubricdefinition = array(
+ 'id' => $definition->id,
+ 'method' => 'rubric',
+ 'name' => 'test changed',
+ 'description' => '',
+ 'status' => 20,
+ 'copiedfromid' => 1,
+ 'timecreated' => 1,
+ 'usercreated' => $teacher->id,
+ 'timemodified' => 1,
+ 'usermodified' => $teacher->id,
+ 'timecopied' => 0
+ );
+
+ // A criterion to update.
+ $rubriccriteria1 = array (
+ 'id' => $criterion1->id,
+ 'sortorder' => 1,
+ 'description' => 'Demonstrate an understanding of rabies control',
+ 'descriptionformat' => 0
+ );
+
+ // A new criterion to add.
+ $rubriccriteria2 = array (
+ 'sortorder' => 2,
+ 'description' => 'Demonstrate an understanding of anthrax control',
+ 'descriptionformat' => 0
+ );
+
+ // A level to update.
+ $rubriclevel2 = array (
+ 'id' => $excellentlevelid,
+ 'score' => 75,
+ 'definition' => 'excellent',
+ 'definitionformat' => 0
+ );
+
+ // A level to insert.
+ $rubriclevel4 = array (
+ 'score' => 100,
+ 'definition' => 'superb',
+ 'definitionformat' => 0
+ );
+
+ $rubriccriteria1['levels'] = array($rubriclevel1, $rubriclevel2, $rubriclevel3, $rubriclevel4);
+ $rubricdefinition['rubric'] = array('rubric_criteria' => array($rubriccriteria1, $rubriccriteria2));
+ $gradingarea['definitions'] = array($rubricdefinition);
+
+ $results = core_grading_external::save_definitions(array($gradingarea));
+
+ // Test definition name change.
+ $definition = $DB->get_record('grading_definitions', array('id' => $definition->id), '*', MUST_EXIST);
+ $this->assertEquals('test changed', $definition->name);
+
+ // Test criteria description change.
+ $modifiedcriteria = $DB->get_record('gradingform_rubric_criteria', array('id' => $criterion1->id), '*', MUST_EXIST);
+ $this->assertEquals('Demonstrate an understanding of rabies control', $modifiedcriteria->description);
+
+ // Test new criteria added.
+ $newcriteria = $DB->get_record('gradingform_rubric_criteria',
+ array('definitionid' => $definition->id, 'sortorder' => 2), '*', MUST_EXIST);
+ $this->assertEquals('Demonstrate an understanding of anthrax control', $newcriteria->description);
+
+ // Test excellent level score change from 100 to 75.
+ $modifiedlevel = $DB->get_record('gradingform_rubric_levels', array('id' => $excellentlevelid), '*', MUST_EXIST);
+ $this->assertEquals(75, $modifiedlevel->score);
+
+ // Test new superb level added.
+ $newlevel = $DB->get_record('gradingform_rubric_levels',
+ array('criterionid' => $criterion1->id, 'score' => 100), '*', MUST_EXIST);
+ $this->assertEquals('superb', $newlevel->definition);
+
+ // Test remove a level
+ // Test remove a criterion
+ // The rubric definition with the removed criterion and levels.
+ $rubricdefinition = array(
+ 'id' => $definition->id,
+ 'method' => 'rubric',
+ 'name' => 'test changed',
+ 'description' => '',
+ 'status' => 20,
+ 'copiedfromid' => 1,
+ 'timecreated' => 1,
+ 'usercreated' => $teacher->id,
+ 'timemodified' => 1,
+ 'usermodified' => $teacher->id,
+ 'timecopied' => 0
+ );
+
+ $rubriccriteria1 = array (
+ 'id' => $criterion1->id,
+ 'sortorder' => 1,
+ 'description' => 'Demonstrate an understanding of rabies control',
+ 'descriptionformat' => 0
+ );
+
+ $rubriclevel1 = array (
+ 'score' => 0,
+ 'definition' => 'fail',
+ 'definitionformat' => 0
+ );
+ $rubriclevel2 = array (
+ 'score' => 100,
+ 'definition' => 'pass',
+ 'definitionformat' => 0
+ );
+
+ $rubriccriteria1['levels'] = array($rubriclevel1, $rubriclevel2);
+ $rubricdefinition['rubric'] = array('rubric_criteria' => array($rubriccriteria1));
+ $gradingarea['definitions'] = array($rubricdefinition);
+
+ $results = core_grading_external::save_definitions(array($gradingarea));
+
+ // Only 1 criterion should now exist.
+ $this->assertEquals(1, $DB->count_records('gradingform_rubric_criteria', array('definitionid' => $definition->id)));
+ $criterion1 = $DB->get_record('gradingform_rubric_criteria', array('definitionid' => $definition->id), '*', MUST_EXIST);
+ $this->assertEquals('Demonstrate an understanding of rabies control', $criterion1->description);
+ // This criterion should only have 2 levels.
+ $this->assertEquals(2, $DB->count_records('gradingform_rubric_levels', array('criterionid' => $criterion1->id)));
+
+ $gradingarea['activemethod'] = 'invalid';
+ $this->setExpectedException('moodle_exception');
+ $results = core_grading_external::save_definitions(array($gradingarea));
+ }
+
+ /**
+ *
+ * Tests save_definitions for the marking guide grading method
+ */
+ public function test_save_definitions_marking_guide() {
+ global $DB, $CFG, $USER;
+
+ $this->resetAfterTest(true);
+ // Create a course and assignment.
+ $course = self::getDataGenerator()->create_course();
+ $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
+ $params['course'] = $course->id;
+ $instance = $generator->create_instance($params);
+ $cm = get_coursemodule_from_instance('assign', $instance->id);
+ $context = context_module::instance($cm->id);
+ $coursecontext = context_course::instance($course->id);
+
+ // Create the teacher.
+ $teacher = self::getDataGenerator()->create_user();
+ $USER->id = $teacher->id;
+ $teacherrole = $DB->get_record('role', array('shortname' => 'editingteacher'));
+ $this->assignUserCapability('moodle/grade:managegradingforms', $context->id, $teacherrole->id);
+ $this->getDataGenerator()->enrol_user($teacher->id,
+ $course->id,
+ $teacherrole->id);
+
+ // Test insert a grading area with guide definition, criteria and comments.
+ $gradingarea = array(
+ 'cmid' => $cm->id,
+ 'contextid' => $context->id,
+ 'component' => 'mod_assign',
+ 'areaname' => 'submissions',
+ 'activemethod' => 'guide'
+ );
+
+ $guidedefinition = array(
+ 'method' => 'guide',
+ 'name' => 'test',
+ 'description' => '',
+ 'status' => 20,
+ 'copiedfromid' => 1,
+ 'timecreated' => 1,
+ 'usercreated' => $teacher->id,
+ 'timemodified' => 1,
+ 'usermodified' => $teacher->id,
+ 'timecopied' => 0
+ );
+
+ $guidecomment = array(
+ 'sortorder' => 1,
+ 'description' => 'Students need to show that they understand the control of zoonoses',
+ 'descriptionformat' => 0
+ );
+ $guidecriteria1 = array (
+ 'sortorder' => 1,
+ 'shortname' => 'Rabies Control',
+ 'description' => 'Understand rabies control techniques',
+ 'descriptionformat' => 0,
+ 'descriptionmarkers' => 'Student must demonstrate that they understand rabies control',
+ 'descriptionmarkersformat' => 0,
+ 'maxscore' => 50
+ );
+ $guidecriteria2 = array (
+ 'sortorder' => 2,
+ 'shortname' => 'Anthrax Control',
+ 'description' => 'Understand anthrax control',
+ 'descriptionformat' => 0,
+ 'descriptionmarkers' => 'Student must demonstrate that they understand anthrax control',
+ 'descriptionmarkersformat' => 0,
+ 'maxscore' => 50
+ );
+
+ $guidedefinition['guide'] = array('guide_criteria' => array($guidecriteria1, $guidecriteria2),
+ 'guide_comments' => array($guidecomment));
+ $gradingarea['definitions'] = array($guidedefinition);
+
+ $results = core_grading_external::save_definitions(array($gradingarea));
+ $area = $DB->get_record('grading_areas',
+ array('contextid' => $context->id, 'component' => 'mod_assign', 'areaname' => 'submissions'),
+ '*', MUST_EXIST);
+ $this->assertEquals($area->activemethod, 'guide');
+
+ $definition = $DB->get_record('grading_definitions', array('areaid' => $area->id, 'method' => 'guide'), '*', MUST_EXIST);
+ $this->assertEquals($guidedefinition['name'], $definition->name);
+ $this->assertEquals(2, $DB->count_records('gradingform_guide_criteria', array('definitionid' => $definition->id)));
+ $this->assertEquals(1, $DB->count_records('gradingform_guide_comments', array('definitionid' => $definition->id)));
+
+ // Test removal of a criteria.
+ $guidedefinition['guide'] = array('guide_criteria' => array($guidecriteria1),
+ 'guide_comments' => array($guidecomment));
+ $gradingarea['definitions'] = array($guidedefinition);
+ $results = core_grading_external::save_definitions(array($gradingarea));
+ $this->assertEquals(1, $DB->count_records('gradingform_guide_criteria', array('definitionid' => $definition->id)));
+
+ // Test an invalid method in the definition.
+ $guidedefinition['method'] = 'invalid';
+ $gradingarea['definitions'] = array($guidedefinition);
+ $this->setExpectedException('invalid_parameter_exception');
+ $results = core_grading_external::save_definitions(array($gradingarea));
+ }
}